feat: eleanor weapon offerings #1419
4
src/helpers/pathHelper.ts
Normal file
4
src/helpers/pathHelper.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import path from "path";
|
||||||
|
|
||||||
|
export const rootDir = path.join(__dirname, "../..");
|
||||||
|
export const repoDir = path.basename(rootDir) == "build" ? path.join(rootDir, "..") : rootDir;
|
@ -1,9 +1,8 @@
|
|||||||
import express from "express";
|
import express from "express";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
|
import { repoDir, rootDir } from "@/src/helpers/pathHelper";
|
||||||
|
|
||||||
const webuiRouter = express.Router();
|
const webuiRouter = express.Router();
|
||||||
const rootDir = path.join(__dirname, "../..");
|
|
||||||
const repoDir = path.basename(rootDir) == "build" ? path.join(rootDir, "..") : rootDir;
|
|
||||||
|
|
||||||
// Redirect / to /webui/
|
// Redirect / to /webui/
|
||||||
webuiRouter.get("/", (_req, res) => {
|
webuiRouter.get("/", (_req, res) => {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import path from "path";
|
import path from "path";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
|
import { repoDir } from "@/src/helpers/pathHelper";
|
||||||
|
|
||||||
interface IBuildConfig {
|
interface IBuildConfig {
|
||||||
version: string;
|
version: string;
|
||||||
@ -13,8 +14,6 @@ export const buildConfig: IBuildConfig = {
|
|||||||
matchmakingBuildId: ""
|
matchmakingBuildId: ""
|
||||||
};
|
};
|
||||||
|
|
||||||
const rootDir = path.join(__dirname, "../..");
|
|
||||||
const repoDir = path.basename(rootDir) == "build" ? path.join(rootDir, "..") : rootDir;
|
|
||||||
const buildConfigPath = path.join(repoDir, "static/data/buildConfig.json");
|
const buildConfigPath = path.join(repoDir, "static/data/buildConfig.json");
|
||||||
if (fs.existsSync(buildConfigPath)) {
|
if (fs.existsSync(buildConfigPath)) {
|
||||||
Object.assign(buildConfig, JSON.parse(fs.readFileSync(buildConfigPath, "utf-8")) as IBuildConfig);
|
Object.assign(buildConfig, JSON.parse(fs.readFileSync(buildConfigPath, "utf-8")) as IBuildConfig);
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
import path from "path";
|
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import fsPromises from "fs/promises";
|
import fsPromises from "fs/promises";
|
||||||
|
import path from "path";
|
||||||
|
import { repoDir } from "@/src/helpers/pathHelper";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { logger } from "@/src/utils/logger";
|
||||||
|
|
||||||
const rootDir = path.join(__dirname, "../..");
|
|
||||||
const repoDir = path.basename(rootDir) == "build" ? path.join(rootDir, "..") : rootDir;
|
|
||||||
const configPath = path.join(repoDir, "config.json");
|
const configPath = path.join(repoDir, "config.json");
|
||||||
export const config = JSON.parse(fs.readFileSync(configPath, "utf-8")) as IConfig;
|
export const config = JSON.parse(fs.readFileSync(configPath, "utf-8")) as IConfig;
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ import { addStartingGear } from "@/src/controllers/api/giveStartingGearControlle
|
|||||||
import { addQuestKey, completeQuest } from "@/src/services/questService";
|
import { addQuestKey, completeQuest } from "@/src/services/questService";
|
||||||
import { handleBundleAcqusition } from "./purchaseService";
|
import { handleBundleAcqusition } from "./purchaseService";
|
||||||
import libraryDailyTasks from "@/static/fixed_responses/libraryDailyTasks.json";
|
import libraryDailyTasks from "@/static/fixed_responses/libraryDailyTasks.json";
|
||||||
import { getRandomElement, getRandomInt } from "./rngService";
|
import { getRandomElement, getRandomInt, SRng } from "./rngService";
|
||||||
import { createMessage } from "./inboxService";
|
import { createMessage } from "./inboxService";
|
||||||
|
|
||||||
export const createInventory = async (
|
export const createInventory = async (
|
||||||
@ -230,7 +230,8 @@ export const addItem = async (
|
|||||||
inventory: TInventoryDatabaseDocument,
|
inventory: TInventoryDatabaseDocument,
|
||||||
typeName: string,
|
typeName: string,
|
||||||
quantity: number = 1,
|
quantity: number = 1,
|
||||||
premiumPurchase: boolean = false
|
premiumPurchase: boolean = false,
|
||||||
|
seed?: bigint
|
||||||
): 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) {
|
||||||
@ -380,21 +381,31 @@ export const addItem = async (
|
|||||||
defaultOverwrites.Features = EquipmentFeatures.DOUBLE_CAPACITY;
|
defaultOverwrites.Features = EquipmentFeatures.DOUBLE_CAPACITY;
|
||||||
}
|
}
|
||||||
if (weapon.maxLevelCap == 40 && typeName.indexOf("BallasSword") == -1) {
|
if (weapon.maxLevelCap == 40 && typeName.indexOf("BallasSword") == -1) {
|
||||||
|
if (!seed) {
|
||||||
|
seed = BigInt(Math.round(Math.random() * Number.MAX_SAFE_INTEGER));
|
||||||
|
}
|
||||||
|
const rng = new SRng(seed);
|
||||||
|
const tag = rng.randomElement([
|
||||||
|
"InnateElectricityDamage",
|
||||||
|
"InnateFreezeDamage",
|
||||||
|
"InnateHeatDamage",
|
||||||
|
"InnateImpactDamage",
|
||||||
|
"InnateMagDamage",
|
||||||
|
"InnateRadDamage",
|
||||||
|
"InnateToxinDamage"
|
||||||
|
]);
|
||||||
|
const WeaponUpgradeValueAttenuationExponent = 2.25;
|
||||||
|
let value = Math.pow(rng.randomFloat(), WeaponUpgradeValueAttenuationExponent);
|
||||||
|
if (value >= 0.941428) {
|
||||||
|
value = 1;
|
||||||
|
}
|
||||||
defaultOverwrites.UpgradeType = "/Lotus/Weapons/Grineer/KuvaLich/Upgrades/InnateDamageRandomMod";
|
defaultOverwrites.UpgradeType = "/Lotus/Weapons/Grineer/KuvaLich/Upgrades/InnateDamageRandomMod";
|
||||||
defaultOverwrites.UpgradeFingerprint = JSON.stringify({
|
defaultOverwrites.UpgradeFingerprint = JSON.stringify({
|
||||||
compat: typeName,
|
compat: typeName,
|
||||||
buffs: [
|
buffs: [
|
||||||
{
|
{
|
||||||
Tag: getRandomElement([
|
Tag: tag,
|
||||||
"InnateElectricityDamage",
|
Value: Math.trunc(value * 0x40000000)
|
||||||
"InnateFreezeDamage",
|
|
||||||
"InnateHeatDamage",
|
|
||||||
"InnateImpactDamage",
|
|
||||||
"InnateMagDamage",
|
|
||||||
"InnateRadDamage",
|
|
||||||
"InnateToxinDamage"
|
|
||||||
]),
|
|
||||||
Value: Math.trunc(Math.random() * 0x40000000)
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
@ -51,6 +51,7 @@ export const handlePurchase = async (
|
|||||||
logger.debug("purchase request", purchaseRequest);
|
logger.debug("purchase request", purchaseRequest);
|
||||||
|
|
||||||
const prePurchaseInventoryChanges: IInventoryChanges = {};
|
const prePurchaseInventoryChanges: IInventoryChanges = {};
|
||||||
|
let seed: bigint | undefined;
|
||||||
if (purchaseRequest.PurchaseParams.Source == 7) {
|
if (purchaseRequest.PurchaseParams.Source == 7) {
|
||||||
const rawManifest = getVendorManifestByOid(purchaseRequest.PurchaseParams.SourceId!);
|
const rawManifest = getVendorManifestByOid(purchaseRequest.PurchaseParams.SourceId!);
|
||||||
if (rawManifest) {
|
if (rawManifest) {
|
||||||
@ -74,6 +75,9 @@ export const handlePurchase = async (
|
|||||||
prePurchaseInventoryChanges
|
prePurchaseInventoryChanges
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (offer.LocTagRandSeed !== undefined) {
|
||||||
|
seed = BigInt(offer.LocTagRandSeed);
|
||||||
|
}
|
||||||
if (!config.noVendorPurchaseLimits && ItemId) {
|
if (!config.noVendorPurchaseLimits && ItemId) {
|
||||||
inventory.RecentVendorPurchases ??= [];
|
inventory.RecentVendorPurchases ??= [];
|
||||||
let vendorPurchases = inventory.RecentVendorPurchases.find(
|
let vendorPurchases = inventory.RecentVendorPurchases.find(
|
||||||
@ -136,7 +140,10 @@ export const handlePurchase = async (
|
|||||||
const purchaseResponse = await handleStoreItemAcquisition(
|
const purchaseResponse = await handleStoreItemAcquisition(
|
||||||
purchaseRequest.PurchaseParams.StoreItem,
|
purchaseRequest.PurchaseParams.StoreItem,
|
||||||
inventory,
|
inventory,
|
||||||
purchaseRequest.PurchaseParams.Quantity
|
purchaseRequest.PurchaseParams.Quantity,
|
||||||
|
undefined,
|
||||||
|
undefined,
|
||||||
|
seed
|
||||||
);
|
);
|
||||||
combineInventoryChanges(purchaseResponse.InventoryChanges, prePurchaseInventoryChanges);
|
combineInventoryChanges(purchaseResponse.InventoryChanges, prePurchaseInventoryChanges);
|
||||||
|
|
||||||
@ -324,7 +331,8 @@ export const handleStoreItemAcquisition = async (
|
|||||||
inventory: TInventoryDatabaseDocument,
|
inventory: TInventoryDatabaseDocument,
|
||||||
quantity: number = 1,
|
quantity: number = 1,
|
||||||
durability: TRarity = "COMMON",
|
durability: TRarity = "COMMON",
|
||||||
ignorePurchaseQuantity: boolean = false
|
ignorePurchaseQuantity: boolean = false,
|
||||||
|
seed?: bigint
|
||||||
): Promise<IPurchaseResponse> => {
|
): Promise<IPurchaseResponse> => {
|
||||||
let purchaseResponse = {
|
let purchaseResponse = {
|
||||||
InventoryChanges: {}
|
InventoryChanges: {}
|
||||||
@ -345,7 +353,7 @@ export const handleStoreItemAcquisition = async (
|
|||||||
}
|
}
|
||||||
switch (storeCategory) {
|
switch (storeCategory) {
|
||||||
default: {
|
default: {
|
||||||
purchaseResponse = { InventoryChanges: await addItem(inventory, internalName, quantity, true) };
|
purchaseResponse = { InventoryChanges: await addItem(inventory, internalName, quantity, true, seed) };
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "Types":
|
case "Types":
|
||||||
|
@ -127,4 +127,13 @@ export class SRng {
|
|||||||
}
|
}
|
||||||
return min;
|
return min;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
randomElement<T>(arr: T[]): T {
|
||||||
|
return arr[this.randomInt(0, arr.length - 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
randomFloat(): number {
|
||||||
|
this.state = (0x5851f42d4c957f2dn * this.state + 0x14057b7ef767814fn) & 0xffffffffffffffffn;
|
||||||
|
return (Number(this.state >> 38n) & 0xffffff) * 0.000000059604645;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,69 +1,47 @@
|
|||||||
|
import fs from "fs";
|
||||||
|
import path from "path";
|
||||||
|
import { repoDir } from "@/src/helpers/pathHelper";
|
||||||
import { CRng, mixSeeds } from "@/src/services/rngService";
|
import { CRng, mixSeeds } from "@/src/services/rngService";
|
||||||
import { IMongoDate } from "@/src/types/commonTypes";
|
import { IMongoDate } from "@/src/types/commonTypes";
|
||||||
import { IVendorManifest, IVendorManifestPreprocessed } from "@/src/types/vendorTypes";
|
import { IVendorManifest, IVendorManifestPreprocessed } from "@/src/types/vendorTypes";
|
||||||
|
import { JSONParse } from "json-with-bigint";
|
||||||
|
|
||||||
import ArchimedeanVendorManifest from "@/static/fixed_responses/getVendorInfo/ArchimedeanVendorManifest.json";
|
const getVendorManifestJson = (name: string): IVendorManifest => {
|
||||||
import DeimosEntratiFragmentVendorProductsManifest from "@/static/fixed_responses/getVendorInfo/DeimosEntratiFragmentVendorProductsManifest.json";
|
return JSONParse(fs.readFileSync(path.join(repoDir, `static/fixed_responses/getVendorInfo/${name}.json`), "utf-8"));
|
||||||
import DeimosFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosFishmongerVendorManifest.json";
|
};
|
||||||
import DeimosHivemindCommisionsManifestFishmonger from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestFishmonger.json";
|
|
||||||
import DeimosHivemindCommisionsManifestPetVendor from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestPetVendor.json";
|
|
||||||
import DeimosHivemindCommisionsManifestProspector from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestProspector.json";
|
|
||||||
import DeimosHivemindCommisionsManifestTokenVendor from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestTokenVendor.json";
|
|
||||||
import DeimosHivemindCommisionsManifestWeaponsmith from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestWeaponsmith.json";
|
|
||||||
import DeimosHivemindTokenVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosHivemindTokenVendorManifest.json";
|
|
||||||
import DeimosPetVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosPetVendorManifest.json";
|
|
||||||
import DeimosProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosProspectorVendorManifest.json";
|
|
||||||
import DuviriAcrithisVendorManifest from "@/static/fixed_responses/getVendorInfo/DuviriAcrithisVendorManifest.json";
|
|
||||||
import EntratiLabsEntratiLabsCommisionsManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabsCommisionsManifest.json";
|
|
||||||
import EntratiLabsEntratiLabVendorManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabVendorManifest.json";
|
|
||||||
import GuildAdvertisementVendorManifest from "@/static/fixed_responses/getVendorInfo/GuildAdvertisementVendorManifest.json";
|
|
||||||
import HubsIronwakeDondaVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsIronwakeDondaVendorManifest.json";
|
|
||||||
import HubsPerrinSequenceWeaponVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsPerrinSequenceWeaponVendorManifest.json";
|
|
||||||
import HubsRailjackCrewMemberVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsRailjackCrewMemberVendorManifest.json";
|
|
||||||
import MaskSalesmanManifest from "@/static/fixed_responses/getVendorInfo/MaskSalesmanManifest.json";
|
|
||||||
import Nova1999ConquestShopManifest from "@/static/fixed_responses/getVendorInfo/Nova1999ConquestShopManifest.json";
|
|
||||||
import OstronFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronFishmongerVendorManifest.json";
|
|
||||||
import OstronPetVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronPetVendorManifest.json";
|
|
||||||
import OstronProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronProspectorVendorManifest.json";
|
|
||||||
import RadioLegionIntermission12VendorManifest from "@/static/fixed_responses/getVendorInfo/RadioLegionIntermission12VendorManifest.json";
|
|
||||||
import SolarisDebtTokenVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorManifest.json";
|
|
||||||
import SolarisDebtTokenVendorRepossessionsManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorRepossessionsManifest.json";
|
|
||||||
import SolarisFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisFishmongerVendorManifest.json";
|
|
||||||
import SolarisProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisProspectorVendorManifest.json";
|
|
||||||
import TeshinHardModeVendorManifest from "@/static/fixed_responses/getVendorInfo/TeshinHardModeVendorManifest.json";
|
|
||||||
import ZarimanCommisionsManifestArchimedean from "@/static/fixed_responses/getVendorInfo/ZarimanCommisionsManifestArchimedean.json";
|
|
||||||
|
|
||||||
const vendorManifests: IVendorManifest[] = [
|
const vendorManifests: IVendorManifest[] = [
|
||||||
ArchimedeanVendorManifest,
|
getVendorManifestJson("ArchimedeanVendorManifest"),
|
||||||
DeimosEntratiFragmentVendorProductsManifest,
|
getVendorManifestJson("DeimosEntratiFragmentVendorProductsManifest"),
|
||||||
DeimosFishmongerVendorManifest,
|
getVendorManifestJson("DeimosFishmongerVendorManifest"),
|
||||||
DeimosHivemindCommisionsManifestFishmonger,
|
getVendorManifestJson("DeimosHivemindCommisionsManifestFishmonger"),
|
||||||
DeimosHivemindCommisionsManifestPetVendor,
|
getVendorManifestJson("DeimosHivemindCommisionsManifestPetVendor"),
|
||||||
DeimosHivemindCommisionsManifestProspector,
|
getVendorManifestJson("DeimosHivemindCommisionsManifestProspector"),
|
||||||
DeimosHivemindCommisionsManifestTokenVendor,
|
getVendorManifestJson("DeimosHivemindCommisionsManifestTokenVendor"),
|
||||||
DeimosHivemindCommisionsManifestWeaponsmith,
|
getVendorManifestJson("DeimosHivemindCommisionsManifestWeaponsmith"),
|
||||||
DeimosHivemindTokenVendorManifest,
|
getVendorManifestJson("DeimosHivemindTokenVendorManifest"),
|
||||||
DeimosPetVendorManifest,
|
getVendorManifestJson("DeimosPetVendorManifest"),
|
||||||
DeimosProspectorVendorManifest,
|
getVendorManifestJson("DeimosProspectorVendorManifest"),
|
||||||
DuviriAcrithisVendorManifest,
|
getVendorManifestJson("DuviriAcrithisVendorManifest"),
|
||||||
EntratiLabsEntratiLabsCommisionsManifest,
|
getVendorManifestJson("EntratiLabsEntratiLabsCommisionsManifest"),
|
||||||
EntratiLabsEntratiLabVendorManifest,
|
getVendorManifestJson("EntratiLabsEntratiLabVendorManifest"),
|
||||||
GuildAdvertisementVendorManifest, // uses preprocessing
|
getVendorManifestJson("GuildAdvertisementVendorManifest"), // uses preprocessing
|
||||||
HubsIronwakeDondaVendorManifest, // uses preprocessing
|
getVendorManifestJson("HubsIronwakeDondaVendorManifest"), // uses preprocessing
|
||||||
HubsPerrinSequenceWeaponVendorManifest,
|
getVendorManifestJson("HubsPerrinSequenceWeaponVendorManifest"),
|
||||||
HubsRailjackCrewMemberVendorManifest,
|
getVendorManifestJson("HubsRailjackCrewMemberVendorManifest"),
|
||||||
MaskSalesmanManifest,
|
getVendorManifestJson("InfestedLichWeaponVendorManifest"),
|
||||||
Nova1999ConquestShopManifest,
|
getVendorManifestJson("MaskSalesmanManifest"),
|
||||||
OstronFishmongerVendorManifest,
|
getVendorManifestJson("Nova1999ConquestShopManifest"),
|
||||||
OstronPetVendorManifest,
|
getVendorManifestJson("OstronFishmongerVendorManifest"),
|
||||||
OstronProspectorVendorManifest,
|
getVendorManifestJson("OstronPetVendorManifest"),
|
||||||
RadioLegionIntermission12VendorManifest,
|
getVendorManifestJson("OstronProspectorVendorManifest"),
|
||||||
SolarisDebtTokenVendorManifest,
|
getVendorManifestJson("RadioLegionIntermission12VendorManifest"),
|
||||||
SolarisDebtTokenVendorRepossessionsManifest,
|
getVendorManifestJson("SolarisDebtTokenVendorManifest"),
|
||||||
SolarisFishmongerVendorManifest,
|
getVendorManifestJson("SolarisDebtTokenVendorRepossessionsManifest"),
|
||||||
SolarisProspectorVendorManifest,
|
getVendorManifestJson("SolarisFishmongerVendorManifest"),
|
||||||
TeshinHardModeVendorManifest, // uses preprocessing
|
getVendorManifestJson("SolarisProspectorVendorManifest"),
|
||||||
ZarimanCommisionsManifestArchimedean
|
getVendorManifestJson("TeshinHardModeVendorManifest"), // uses preprocessing
|
||||||
|
getVendorManifestJson("ZarimanCommisionsManifestArchimedean")
|
||||||
];
|
];
|
||||||
|
|
||||||
export const getVendorManifestByTypeName = (typeName: string): IVendorManifest | undefined => {
|
export const getVendorManifestByTypeName = (typeName: string): IVendorManifest | undefined => {
|
||||||
|
@ -19,6 +19,7 @@ interface IItemManifest {
|
|||||||
PurchaseQuantityLimit?: number;
|
PurchaseQuantityLimit?: number;
|
||||||
RotatedWeekly?: boolean;
|
RotatedWeekly?: boolean;
|
||||||
AllowMultipurchase: boolean;
|
AllowMultipurchase: boolean;
|
||||||
|
LocTagRandSeed?: number | bigint;
|
||||||
Id: IOid;
|
Id: IOid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,157 @@
|
|||||||
|
{
|
||||||
|
"VendorInfo": {
|
||||||
|
"_id": {
|
||||||
|
"$oid": "67dadc30e4b6e0e5979c8d84"
|
||||||
|
},
|
||||||
|
"TypeName": "/Lotus/Types/Game/VendorManifests/TheHex/InfestedLichWeaponVendorManifest",
|
||||||
|
"ItemManifest": [
|
||||||
|
{
|
||||||
|
"StoreItem": "/Lotus/StoreItems/Weapons/Infested/InfestedLich/LongGuns/1999InfShotgun/1999InfShotgunWeapon",
|
||||||
|
"ItemPrices": [
|
||||||
|
{
|
||||||
|
"ItemCount": 10,
|
||||||
|
"ItemType": "/Lotus/Types/Items/MiscItems/CodaWeaponBucks",
|
||||||
|
"ProductCategory": "MiscItems"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Bin": "BIN_1",
|
||||||
|
"QuantityMultiplier": 1,
|
||||||
|
"Expiry": {
|
||||||
|
"$date": {
|
||||||
|
"$numberLong": "9999999999999"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"PurchaseQuantityLimit": 1,
|
||||||
|
"AllowMultipurchase": false,
|
||||||
|
"LocTagRandSeed": 65079176837546984,
|
||||||
|
"Id": {
|
||||||
|
"$oid": "67e9da12793a120dbbc1c193"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StoreItem": "/Lotus/StoreItems/Weapons/Infested/InfestedLich/Melee/CodaCaustacyst/CodaCaustacyst",
|
||||||
|
"ItemPrices": [
|
||||||
|
{
|
||||||
|
"ItemCount": 10,
|
||||||
|
"ItemType": "/Lotus/Types/Items/MiscItems/CodaWeaponBucks",
|
||||||
|
"ProductCategory": "MiscItems"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Bin": "BIN_1",
|
||||||
|
"QuantityMultiplier": 1,
|
||||||
|
"Expiry": {
|
||||||
|
"$date": {
|
||||||
|
"$numberLong": "9999999999999"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"PurchaseQuantityLimit": 1,
|
||||||
|
"AllowMultipurchase": false,
|
||||||
|
"LocTagRandSeed": 5687904240491804000,
|
||||||
|
"Id": {
|
||||||
|
"$oid": "67e9da12793a120dbbc1c194"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StoreItem": "/Lotus/StoreItems/Weapons/Infested/InfestedLich/Melee/CodaPathocyst/CodaPathocyst",
|
||||||
|
"ItemPrices": [
|
||||||
|
{
|
||||||
|
"ItemCount": 10,
|
||||||
|
"ItemType": "/Lotus/Types/Items/MiscItems/CodaWeaponBucks",
|
||||||
|
"ProductCategory": "MiscItems"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Bin": "BIN_1",
|
||||||
|
"QuantityMultiplier": 1,
|
||||||
|
"Expiry": {
|
||||||
|
"$date": {
|
||||||
|
"$numberLong": "9999999999999"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"PurchaseQuantityLimit": 1,
|
||||||
|
"AllowMultipurchase": false,
|
||||||
|
"LocTagRandSeed": 6177144662234093000,
|
||||||
|
"Id": {
|
||||||
|
"$oid": "67e9da12793a120dbbc1c195"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StoreItem": "/Lotus/StoreItems/Weapons/Infested/InfestedLich/Pistols/CodaTysis",
|
||||||
|
"ItemPrices": [
|
||||||
|
{
|
||||||
|
"ItemCount": 10,
|
||||||
|
"ItemType": "/Lotus/Types/Items/MiscItems/CodaWeaponBucks",
|
||||||
|
"ProductCategory": "MiscItems"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Bin": "BIN_1",
|
||||||
|
"QuantityMultiplier": 1,
|
||||||
|
"Expiry": {
|
||||||
|
"$date": {
|
||||||
|
"$numberLong": "9999999999999"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"PurchaseQuantityLimit": 1,
|
||||||
|
"AllowMultipurchase": false,
|
||||||
|
"LocTagRandSeed": 1988275604378227700,
|
||||||
|
"Id": {
|
||||||
|
"$oid": "67e9da12793a120dbbc1c196"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StoreItem": "/Lotus/StoreItems/Weapons/Infested/InfestedLich/LongGuns/CodaSynapse",
|
||||||
|
"ItemPrices": [
|
||||||
|
{
|
||||||
|
"ItemCount": 10,
|
||||||
|
"ItemType": "/Lotus/Types/Items/MiscItems/CodaWeaponBucks",
|
||||||
|
"ProductCategory": "MiscItems"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Bin": "BIN_1",
|
||||||
|
"QuantityMultiplier": 1,
|
||||||
|
"Expiry": {
|
||||||
|
"$date": {
|
||||||
|
"$numberLong": "9999999999999"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"PurchaseQuantityLimit": 1,
|
||||||
|
"AllowMultipurchase": false,
|
||||||
|
"LocTagRandSeed": 8607452585593957000,
|
||||||
|
"Id": {
|
||||||
|
"$oid": "67e9da12793a120dbbc1c197"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StoreItem": "/Lotus/StoreItems/Weapons/Infested/InfestedLich/Melee/CodaHirudo",
|
||||||
|
"ItemPrices": [
|
||||||
|
{
|
||||||
|
"ItemCount": 10,
|
||||||
|
"ItemType": "/Lotus/Types/Items/MiscItems/CodaWeaponBucks",
|
||||||
|
"ProductCategory": "MiscItems"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Bin": "BIN_1",
|
||||||
|
"QuantityMultiplier": 1,
|
||||||
|
"Expiry": {
|
||||||
|
"$date": {
|
||||||
|
"$numberLong": "9999999999999"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"PurchaseQuantityLimit": 1,
|
||||||
|
"AllowMultipurchase": false,
|
||||||
|
"LocTagRandSeed": 8385013066220909000,
|
||||||
|
"Id": {
|
||||||
|
"$oid": "67e9da12793a120dbbc1c198"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"PropertyTextHash": "77093DD05A8561A022DEC9A4B9BB4A56",
|
||||||
|
"RandomSeedType": "VRST_WEAPON",
|
||||||
|
"RequiredGoalTag": "",
|
||||||
|
"WeaponUpgradeValueAttenuationExponent": 2.25,
|
||||||
|
"Expiry": {
|
||||||
|
"$date": {
|
||||||
|
"$numberLong": "9999999999999"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user