forked from OpenWF/SpaceNinjaServer
Compare commits
42 Commits
ce46fa14ac
...
e234af098d
| Author | SHA1 | Date | |
|---|---|---|---|
| e234af098d | |||
| 4a434cea2b | |||
| 36f2828d37 | |||
| ca3cfb5299 | |||
| f242d9f873 | |||
| 9a034b1c8a | |||
| 122950034e | |||
| 636d3100f3 | |||
| 444c92f0c6 | |||
| 653798b987 | |||
| 7a88f6f486 | |||
| 82b203e00b | |||
| 271f5bd47a | |||
| f61d15b496 | |||
| cfd50e7402 | |||
| 2421a16b2c | |||
| cee622d5e9 | |||
| 84f081312b | |||
| 7ca7147b78 | |||
| 558af66965 | |||
| d7b9fb1ab5 | |||
| bf12f90c88 | |||
| 6dd9b42f40 | |||
| 3bcd5827f9 | |||
| d16d763977 | |||
| ff8ec8dbed | |||
| 6cdd103c3d | |||
| b6f79c1e5c | |||
| 2bb3e2afdd | |||
| 6a60537cd0 | |||
| 2fa6dcc7ed | |||
| 93ef9a5348 | |||
| 5d5d0ee560 | |||
| f84cc54c97 | |||
| 4cb0f8b167 | |||
| eadc9c4ecb | |||
| f41377bb81 | |||
| 95136e6059 | |||
| 3c64f17e34 | |||
| 3619bdfdb5 | |||
| 97064826b2 | |||
| c6c7a2966b |
17
AGENTS.md
Normal file
17
AGENTS.md
Normal file
@ -0,0 +1,17 @@
|
||||
## In General
|
||||
|
||||
### Prerequisites
|
||||
|
||||
Use `npm i` or `npm ci` to install all dependencies.
|
||||
|
||||
### Testing
|
||||
|
||||
Use `npm run verify` to verify that your changes pass TypeScript's checks.
|
||||
|
||||
### Formatting
|
||||
|
||||
Use `npm run prettier` to ensure your formatting matches the expected format. Failing to do so will cause CI failure.
|
||||
|
||||
## WebUI Specific
|
||||
|
||||
The translation system is designed around additions being made to `static/webui/translations/en.js`. They are copied over for translation via `npm run update-translations`. DO NOT produce non-English strings; we want them to be translated by humans who can understand the full context.
|
||||
@ -13,7 +13,6 @@
|
||||
"skipTutorial": false,
|
||||
"skipAllDialogue": false,
|
||||
"unlockAllScans": false,
|
||||
"unlockAllMissions": false,
|
||||
"infiniteCredits": false,
|
||||
"infinitePlatinum": false,
|
||||
"infiniteEndo": false,
|
||||
@ -39,10 +38,14 @@
|
||||
"noDailyFocusLimit": false,
|
||||
"noArgonCrystalDecay": false,
|
||||
"noMasteryRankUpCooldown": false,
|
||||
"noVendorPurchaseLimits": true,
|
||||
"noVendorPurchaseLimits": false,
|
||||
"noDeathMarks": false,
|
||||
"noKimCooldowns": false,
|
||||
"fullyStockedVendors": false,
|
||||
"baroAlwaysAvailable": false,
|
||||
"baroFullyStocked": false,
|
||||
"syndicateMissionsRepeatable": false,
|
||||
"unlockAllProfitTakerStages": false,
|
||||
"instantFinishRivenChallenge": false,
|
||||
"instantResourceExtractorDrones": false,
|
||||
"noResourceExtractorDronesDamage": false,
|
||||
@ -53,8 +56,14 @@
|
||||
"noDojoResearchCosts": false,
|
||||
"noDojoResearchTime": false,
|
||||
"fastClanAscension": false,
|
||||
"missionsCanGiveAllRelics": false,
|
||||
"unlockAllSimarisResearchEntries": false,
|
||||
"spoofMasteryRank": -1,
|
||||
"nightwaveStandingMultiplier": 1,
|
||||
"unfaithfulBugFixes": {
|
||||
"ignore1999LastRegionPlayed": false,
|
||||
"fixXtraCheeseTimer": false
|
||||
},
|
||||
"worldState": {
|
||||
"creditBoost": false,
|
||||
"affinityBoost": false,
|
||||
|
||||
@ -5,4 +5,4 @@ if [ ! -f conf/config.json ]; then
|
||||
jq --arg value "mongodb://openwfagent:spaceninjaserver@mongodb:27017/" '.mongodbUrl = $value' /app/config.json.example > /app/conf/config.json
|
||||
fi
|
||||
|
||||
exec npm run start conf/config.json
|
||||
exec npm run start -- --configPath conf/config.json
|
||||
|
||||
649
package-lock.json
generated
649
package-lock.json
generated
@ -11,6 +11,8 @@
|
||||
"dependencies": {
|
||||
"@types/express": "^5",
|
||||
"@types/morgan": "^1.9.9",
|
||||
"@types/websocket": "^1.0.10",
|
||||
"@types/ws": "^8.18.1",
|
||||
"crc-32": "^1.2.2",
|
||||
"express": "^5",
|
||||
"json-with-bigint": "^3.4.4",
|
||||
@ -18,20 +20,22 @@
|
||||
"morgan": "^1.10.0",
|
||||
"ncp": "^2.0.0",
|
||||
"typescript": "^5.5",
|
||||
"undici": "^7.10.0",
|
||||
"warframe-public-export-plus": "^0.5.68",
|
||||
"warframe-riven-info": "^0.1.2",
|
||||
"winston": "^3.17.0",
|
||||
"winston-daily-rotate-file": "^5.0.0"
|
||||
"winston-daily-rotate-file": "^5.0.0",
|
||||
"ws": "^8.18.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@typescript-eslint/eslint-plugin": "^8.28.0",
|
||||
"@typescript-eslint/parser": "^8.28.0",
|
||||
"@typescript/native-preview": "^7.0.0-dev.20250523.1",
|
||||
"chokidar": "^4.0.3",
|
||||
"eslint": "^8",
|
||||
"eslint-plugin-prettier": "^5.2.5",
|
||||
"prettier": "^3.5.3",
|
||||
"ts-node-dev": "^2.0.0",
|
||||
"tsconfig-paths": "^4.2.0"
|
||||
"tree-kill": "^1.2.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@colors/colors": {
|
||||
@ -43,19 +47,6 @@
|
||||
"node": ">=0.1.90"
|
||||
}
|
||||
},
|
||||
"node_modules/@cspotcode/source-map-support": {
|
||||
"version": "0.8.1",
|
||||
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
|
||||
"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/trace-mapping": "0.3.9"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@dabh/diagnostics": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
|
||||
@ -121,9 +112,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"version": "1.1.12",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
||||
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@ -171,9 +162,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"version": "1.1.12",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
||||
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@ -216,34 +207,6 @@
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/@jridgewell/resolve-uri": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
|
||||
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/sourcemap-codec": {
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
|
||||
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@jridgewell/trace-mapping": {
|
||||
"version": "0.3.9",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
|
||||
"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/resolve-uri": "^3.0.3",
|
||||
"@jridgewell/sourcemap-codec": "^1.4.10"
|
||||
}
|
||||
},
|
||||
"node_modules/@mongodb-js/saslprep": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.2.tgz",
|
||||
@ -304,34 +267,6 @@
|
||||
"url": "https://opencollective.com/pkgr"
|
||||
}
|
||||
},
|
||||
"node_modules/@tsconfig/node10": {
|
||||
"version": "1.0.11",
|
||||
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
|
||||
"integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@tsconfig/node12": {
|
||||
"version": "1.0.11",
|
||||
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
|
||||
"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@tsconfig/node14": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
|
||||
"integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@tsconfig/node16": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
|
||||
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/body-parser": {
|
||||
"version": "1.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
|
||||
@ -437,20 +372,6 @@
|
||||
"@types/send": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/strip-bom": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz",
|
||||
"integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/strip-json-comments": {
|
||||
"version": "0.0.30",
|
||||
"resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz",
|
||||
"integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/triple-beam": {
|
||||
"version": "1.3.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
|
||||
@ -463,6 +384,15 @@
|
||||
"integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/websocket": {
|
||||
"version": "1.0.10",
|
||||
"resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.10.tgz",
|
||||
"integrity": "sha512-svjGZvPB7EzuYS94cI7a+qhwgGU1y89wUgjT6E2wVUfmAGIvRfT7obBvRtnhXCSsoMdlG4gBFGE7MfkIXZLoww==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/whatwg-url": {
|
||||
"version": "11.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
|
||||
@ -472,6 +402,15 @@
|
||||
"@types/webidl-conversions": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/ws": {
|
||||
"version": "8.18.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
|
||||
"integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/eslint-plugin": {
|
||||
"version": "8.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.0.tgz",
|
||||
@ -849,19 +788,6 @@
|
||||
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/acorn-walk": {
|
||||
"version": "8.3.4",
|
||||
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
|
||||
"integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"acorn": "^8.11.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/ajv": {
|
||||
"version": "6.12.6",
|
||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
|
||||
@ -905,27 +831,6 @@
|
||||
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/anymatch": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
|
||||
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"normalize-path": "^3.0.0",
|
||||
"picomatch": "^2.0.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 8"
|
||||
}
|
||||
},
|
||||
"node_modules/arg": {
|
||||
"version": "4.1.3",
|
||||
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
|
||||
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/argparse": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
|
||||
@ -964,19 +869,6 @@
|
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/binary-extensions": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
|
||||
"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/body-parser": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
|
||||
@ -998,9 +890,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/brace-expansion": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
|
||||
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
|
||||
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@ -1029,12 +921,20 @@
|
||||
"node": ">=16.20.1"
|
||||
}
|
||||
},
|
||||
"node_modules/buffer-from": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
|
||||
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
"node_modules/bufferutil": {
|
||||
"version": "4.0.9",
|
||||
"resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz",
|
||||
"integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"node-gyp-build": "^4.3.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.14.2"
|
||||
}
|
||||
},
|
||||
"node_modules/bytes": {
|
||||
"version": "3.1.2",
|
||||
@ -1102,41 +1002,19 @@
|
||||
}
|
||||
},
|
||||
"node_modules/chokidar": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
|
||||
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
|
||||
"integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"anymatch": "~3.1.2",
|
||||
"braces": "~3.0.2",
|
||||
"glob-parent": "~5.1.2",
|
||||
"is-binary-path": "~2.1.0",
|
||||
"is-glob": "~4.0.1",
|
||||
"normalize-path": "~3.0.0",
|
||||
"readdirp": "~3.6.0"
|
||||
"readdirp": "^4.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 8.10.0"
|
||||
"node": ">= 14.16.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://paulmillr.com/funding/"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"fsevents": "~2.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/chokidar/node_modules/glob-parent": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
|
||||
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"is-glob": "^4.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/color": {
|
||||
@ -1261,13 +1139,6 @@
|
||||
"node": ">=0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/create-require": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
|
||||
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/cross-spawn": {
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
|
||||
@ -1316,16 +1187,6 @@
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/diff": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
|
||||
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause",
|
||||
"engines": {
|
||||
"node": ">=0.3.1"
|
||||
}
|
||||
},
|
||||
"node_modules/doctrine": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
|
||||
@ -1353,16 +1214,6 @@
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/dynamic-dedupe": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz",
|
||||
"integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"xtend": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/ee-first": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||
@ -1552,9 +1403,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint/node_modules/brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"version": "1.1.12",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
||||
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@ -1886,21 +1737,6 @@
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/fsevents": {
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
|
||||
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/function-bind": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
||||
@ -1983,9 +1819,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/glob/node_modules/brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"version": "1.1.12",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
||||
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@ -2173,35 +2009,6 @@
|
||||
"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/is-binary-path": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
|
||||
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"binary-extensions": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/is-core-module": {
|
||||
"version": "2.16.1",
|
||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
|
||||
"integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"hasown": "^2.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/is-extglob": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
|
||||
@ -2310,19 +2117,6 @@
|
||||
"integrity": "sha512-AhpYAAaZsPjU7smaBomDt1SOQshi9rEm6BlTbfVwsG1vNmeHKtEedJi62sHZzJTyKNtwzmNnrsd55kjwJ7054A==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/json5": {
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"json5": "lib/cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/kareem": {
|
||||
"version": "2.6.3",
|
||||
"resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz",
|
||||
@ -2402,13 +2196,6 @@
|
||||
"node": ">= 12.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/make-error": {
|
||||
"version": "1.3.6",
|
||||
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
|
||||
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/math-intrinsics": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
|
||||
@ -2506,29 +2293,6 @@
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/minimist": {
|
||||
"version": "1.2.8",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
|
||||
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/mkdirp": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
|
||||
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"mkdirp": "bin/cmd.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/moment": {
|
||||
"version": "2.30.1",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
|
||||
@ -2711,14 +2475,17 @@
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/normalize-path": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
|
||||
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
|
||||
"dev": true,
|
||||
"node_modules/node-gyp-build": {
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
|
||||
"integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"node-gyp-build": "bin.js",
|
||||
"node-gyp-build-optional": "optional.js",
|
||||
"node-gyp-build-test": "build-test.js"
|
||||
}
|
||||
},
|
||||
"node_modules/object-hash": {
|
||||
@ -2883,13 +2650,6 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/path-parse": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
|
||||
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/path-to-regexp": {
|
||||
"version": "8.2.0",
|
||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
|
||||
@ -3048,37 +2808,17 @@
|
||||
}
|
||||
},
|
||||
"node_modules/readdirp": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
|
||||
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
|
||||
"integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"picomatch": "^2.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/resolve": {
|
||||
"version": "1.22.10",
|
||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
|
||||
"integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"is-core-module": "^2.16.0",
|
||||
"path-parse": "^1.0.7",
|
||||
"supports-preserve-symlinks-flag": "^1.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"resolve": "bin/resolve"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
"node": ">= 14.18.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
"type": "individual",
|
||||
"url": "https://paulmillr.com/funding/"
|
||||
}
|
||||
},
|
||||
"node_modules/resolve-from": {
|
||||
@ -3360,27 +3100,6 @@
|
||||
"is-arrayish": "^0.3.1"
|
||||
}
|
||||
},
|
||||
"node_modules/source-map": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/source-map-support": {
|
||||
"version": "0.5.21",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
|
||||
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"buffer-from": "^1.0.0",
|
||||
"source-map": "^0.6.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sparse-bitfield": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
|
||||
@ -3430,16 +3149,6 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/strip-bom": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
|
||||
"integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/strip-json-comments": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
|
||||
@ -3466,19 +3175,6 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/supports-preserve-symlinks-flag": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
|
||||
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/synckit": {
|
||||
"version": "0.11.4",
|
||||
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.4.tgz",
|
||||
@ -3575,137 +3271,6 @@
|
||||
"typescript": ">=4.8.4"
|
||||
}
|
||||
},
|
||||
"node_modules/ts-node": {
|
||||
"version": "10.9.2",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
|
||||
"integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@cspotcode/source-map-support": "^0.8.0",
|
||||
"@tsconfig/node10": "^1.0.7",
|
||||
"@tsconfig/node12": "^1.0.7",
|
||||
"@tsconfig/node14": "^1.0.0",
|
||||
"@tsconfig/node16": "^1.0.2",
|
||||
"acorn": "^8.4.1",
|
||||
"acorn-walk": "^8.1.1",
|
||||
"arg": "^4.1.0",
|
||||
"create-require": "^1.1.0",
|
||||
"diff": "^4.0.1",
|
||||
"make-error": "^1.1.1",
|
||||
"v8-compile-cache-lib": "^3.0.1",
|
||||
"yn": "3.1.1"
|
||||
},
|
||||
"bin": {
|
||||
"ts-node": "dist/bin.js",
|
||||
"ts-node-cwd": "dist/bin-cwd.js",
|
||||
"ts-node-esm": "dist/bin-esm.js",
|
||||
"ts-node-script": "dist/bin-script.js",
|
||||
"ts-node-transpile-only": "dist/bin-transpile.js",
|
||||
"ts-script": "dist/bin-script-deprecated.js"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@swc/core": ">=1.2.50",
|
||||
"@swc/wasm": ">=1.2.50",
|
||||
"@types/node": "*",
|
||||
"typescript": ">=2.7"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@swc/core": {
|
||||
"optional": true
|
||||
},
|
||||
"@swc/wasm": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/ts-node-dev": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz",
|
||||
"integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"chokidar": "^3.5.1",
|
||||
"dynamic-dedupe": "^0.3.0",
|
||||
"minimist": "^1.2.6",
|
||||
"mkdirp": "^1.0.4",
|
||||
"resolve": "^1.0.0",
|
||||
"rimraf": "^2.6.1",
|
||||
"source-map-support": "^0.5.12",
|
||||
"tree-kill": "^1.2.2",
|
||||
"ts-node": "^10.4.0",
|
||||
"tsconfig": "^7.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"ts-node-dev": "lib/bin.js",
|
||||
"tsnd": "lib/bin.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.8.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"node-notifier": "*",
|
||||
"typescript": "*"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"node-notifier": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/ts-node-dev/node_modules/rimraf": {
|
||||
"version": "2.7.1",
|
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
|
||||
"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
|
||||
"deprecated": "Rimraf versions prior to v4 are no longer supported",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"glob": "^7.1.3"
|
||||
},
|
||||
"bin": {
|
||||
"rimraf": "bin.js"
|
||||
}
|
||||
},
|
||||
"node_modules/tsconfig": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz",
|
||||
"integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/strip-bom": "^3.0.0",
|
||||
"@types/strip-json-comments": "0.0.30",
|
||||
"strip-bom": "^3.0.0",
|
||||
"strip-json-comments": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/tsconfig-paths": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz",
|
||||
"integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"json5": "^2.2.2",
|
||||
"minimist": "^1.2.6",
|
||||
"strip-bom": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/tsconfig/node_modules/strip-json-comments": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
|
||||
"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/tslib": {
|
||||
"version": "2.8.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
||||
@ -3766,6 +3331,15 @@
|
||||
"node": ">=14.17"
|
||||
}
|
||||
},
|
||||
"node_modules/undici": {
|
||||
"version": "7.10.0",
|
||||
"resolved": "https://registry.npmjs.org/undici/-/undici-7.10.0.tgz",
|
||||
"integrity": "sha512-u5otvFBOBZvmdjWLVW+5DAc9Nkq8f24g0O9oY7qw2JVIF1VocIFoyz9JFkuVOS2j41AufeO0xnlweJ2RLT8nGw==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=20.18.1"
|
||||
}
|
||||
},
|
||||
"node_modules/undici-types": {
|
||||
"version": "6.21.0",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
|
||||
@ -3791,19 +3365,27 @@
|
||||
"punycode": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/utf-8-validate": {
|
||||
"version": "5.0.10",
|
||||
"resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
|
||||
"integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"node-gyp-build": "^4.3.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.14.2"
|
||||
}
|
||||
},
|
||||
"node_modules/util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/v8-compile-cache-lib": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
|
||||
"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/vary": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
||||
@ -3931,24 +3513,25 @@
|
||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/xtend": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
|
||||
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
|
||||
"dev": true,
|
||||
"node_modules/ws": {
|
||||
"version": "8.18.2",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz",
|
||||
"integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/yn": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
|
||||
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
"node": ">=10.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"bufferutil": "^4.0.1",
|
||||
"utf-8-validate": ">=5.0.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"bufferutil": {
|
||||
"optional": true
|
||||
},
|
||||
"utf-8-validate": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/yocto-queue": {
|
||||
|
||||
17
package.json
17
package.json
@ -5,9 +5,14 @@
|
||||
"main": "index.ts",
|
||||
"scripts": {
|
||||
"start": "node --enable-source-maps --import ./build/src/pathman.js build/src/index.js",
|
||||
"dev": "ts-node-dev --openssl-legacy-provider -r tsconfig-paths/register src/index.ts ",
|
||||
"build": "tsc --incremental --sourceMap && ncp static/webui build/static/webui",
|
||||
"build:dev": "tsc --incremental --sourceMap",
|
||||
"build-and-start": "npm run build && npm run start",
|
||||
"build-and-start:bun": "npm run verify && npm run bun-run",
|
||||
"dev": "node scripts/dev.js",
|
||||
"dev:bun": "bun scripts/dev.js",
|
||||
"verify": "tsgo --noEmit",
|
||||
"bun-run": "bun src/index.ts",
|
||||
"lint": "eslint --ext .ts .",
|
||||
"lint:ci": "eslint --ext .ts --rule \"prettier/prettier: off\" .",
|
||||
"lint:fix": "eslint --fix --ext .ts .",
|
||||
@ -18,6 +23,8 @@
|
||||
"dependencies": {
|
||||
"@types/express": "^5",
|
||||
"@types/morgan": "^1.9.9",
|
||||
"@types/websocket": "^1.0.10",
|
||||
"@types/ws": "^8.18.1",
|
||||
"crc-32": "^1.2.2",
|
||||
"express": "^5",
|
||||
"json-with-bigint": "^3.4.4",
|
||||
@ -25,19 +32,21 @@
|
||||
"morgan": "^1.10.0",
|
||||
"ncp": "^2.0.0",
|
||||
"typescript": "^5.5",
|
||||
"undici": "^7.10.0",
|
||||
"warframe-public-export-plus": "^0.5.68",
|
||||
"warframe-riven-info": "^0.1.2",
|
||||
"winston": "^3.17.0",
|
||||
"winston-daily-rotate-file": "^5.0.0"
|
||||
"winston-daily-rotate-file": "^5.0.0",
|
||||
"ws": "^8.18.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@typescript-eslint/eslint-plugin": "^8.28.0",
|
||||
"@typescript-eslint/parser": "^8.28.0",
|
||||
"@typescript/native-preview": "^7.0.0-dev.20250523.1",
|
||||
"chokidar": "^4.0.3",
|
||||
"eslint": "^8",
|
||||
"eslint-plugin-prettier": "^5.2.5",
|
||||
"prettier": "^3.5.3",
|
||||
"ts-node-dev": "^2.0.0",
|
||||
"tsconfig-paths": "^4.2.0"
|
||||
"tree-kill": "^1.2.2"
|
||||
}
|
||||
}
|
||||
|
||||
58
scripts/dev.js
Normal file
58
scripts/dev.js
Normal file
@ -0,0 +1,58 @@
|
||||
/* eslint-disable */
|
||||
const { spawn } = require("child_process");
|
||||
const chokidar = require("chokidar");
|
||||
const kill = require("tree-kill");
|
||||
|
||||
let secret = "";
|
||||
for (let i = 0; i != 10; ++i) {
|
||||
secret += String.fromCharCode(Math.floor(Math.random() * 26) + 0x41);
|
||||
}
|
||||
|
||||
const args = [...process.argv].splice(2);
|
||||
args.push("--dev");
|
||||
args.push("--secret");
|
||||
args.push(secret);
|
||||
|
||||
let buildproc, runproc;
|
||||
const spawnopts = { stdio: "inherit", shell: true };
|
||||
function run(changedFile) {
|
||||
if (changedFile) {
|
||||
console.log(`Change to ${changedFile} detected`);
|
||||
}
|
||||
|
||||
if (buildproc) {
|
||||
kill(buildproc.pid);
|
||||
buildproc = undefined;
|
||||
}
|
||||
if (runproc) {
|
||||
kill(runproc.pid);
|
||||
runproc = undefined;
|
||||
}
|
||||
|
||||
const thisbuildproc = spawn("npm", ["run", process.versions.bun ? "verify" : "build:dev"], spawnopts);
|
||||
const thisbuildstart = Date.now();
|
||||
buildproc = thisbuildproc;
|
||||
buildproc.on("exit", code => {
|
||||
if (buildproc !== thisbuildproc) {
|
||||
return;
|
||||
}
|
||||
buildproc = undefined;
|
||||
if (code === 0) {
|
||||
console.log(`${process.versions.bun ? "Verified" : "Built"} in ${Date.now() - thisbuildstart} ms`);
|
||||
runproc = spawn("npm", ["run", process.versions.bun ? "bun-run" : "start", "--", ...args], spawnopts);
|
||||
runproc.on("exit", () => {
|
||||
runproc = undefined;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
run();
|
||||
chokidar.watch("src").on("change", run);
|
||||
chokidar.watch("static/fixed_responses").on("change", run);
|
||||
|
||||
chokidar.watch("static/webui").on("change", async () => {
|
||||
try {
|
||||
await fetch("http://localhost/custom/webuiFileChangeDetected?secret=" + secret);
|
||||
} catch (e) {}
|
||||
});
|
||||
@ -1,6 +1,7 @@
|
||||
// Based on https://onlyg.it/OpenWF/Translations/src/branch/main/update.php
|
||||
// Converted via ChatGPT-4o
|
||||
|
||||
/* eslint-disable */
|
||||
const fs = require("fs");
|
||||
|
||||
function extractStrings(content) {
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import { getCalendarProgress, getInventory } from "@/src/services/inventoryService";
|
||||
import { checkCalendarChallengeCompletion, getCalendarProgress, getInventory } from "@/src/services/inventoryService";
|
||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
||||
import { getWorldState } from "@/src/services/worldStateService";
|
||||
@ -12,27 +12,23 @@ export const completeCalendarEventController: RequestHandler = async (req, res)
|
||||
const calendarProgress = getCalendarProgress(inventory);
|
||||
const currentSeason = getWorldState().KnownCalendarSeasons[0];
|
||||
let inventoryChanges: IInventoryChanges = {};
|
||||
let dayIndex = 0;
|
||||
for (const day of currentSeason.Days) {
|
||||
if (day.events.length == 0 || day.events[0].type != "CET_CHALLENGE") {
|
||||
if (dayIndex == calendarProgress.SeasonProgress.LastCompletedDayIdx) {
|
||||
if (day.events.length != 0) {
|
||||
const selection = day.events[parseInt(req.query.CompletedEventIdx as string)];
|
||||
if (selection.type == "CET_REWARD") {
|
||||
inventoryChanges = (await handleStoreItemAcquisition(selection.reward!, inventory))
|
||||
.InventoryChanges;
|
||||
} else if (selection.type == "CET_UPGRADE") {
|
||||
calendarProgress.YearProgress.Upgrades.push(selection.upgrade!);
|
||||
} else if (selection.type != "CET_PLOT") {
|
||||
throw new Error(`unexpected selection type: ${selection.type}`);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
++dayIndex;
|
||||
const dayIndex = calendarProgress.SeasonProgress.LastCompletedDayIdx + 1;
|
||||
const day = currentSeason.Days[dayIndex];
|
||||
if (day.events.length != 0) {
|
||||
if (day.events[0].type == "CET_CHALLENGE") {
|
||||
throw new Error(`completeCalendarEvent should not be used for challenges`);
|
||||
}
|
||||
const selection = day.events[parseInt(req.query.CompletedEventIdx as string)];
|
||||
if (selection.type == "CET_REWARD") {
|
||||
inventoryChanges = (await handleStoreItemAcquisition(selection.reward!, inventory)).InventoryChanges;
|
||||
} else if (selection.type == "CET_UPGRADE") {
|
||||
calendarProgress.YearProgress.Upgrades.push(selection.upgrade!);
|
||||
} else if (selection.type != "CET_PLOT") {
|
||||
throw new Error(`unexpected selection type: ${selection.type}`);
|
||||
}
|
||||
}
|
||||
calendarProgress.SeasonProgress.LastCompletedDayIdx++;
|
||||
calendarProgress.SeasonProgress.LastCompletedDayIdx = dayIndex;
|
||||
checkCalendarChallengeCompletion(calendarProgress, currentSeason);
|
||||
await inventory.save();
|
||||
res.json({
|
||||
InventoryChanges: inventoryChanges,
|
||||
|
||||
@ -11,13 +11,13 @@ import {
|
||||
import { getAccountForRequest, getSuffixedName } from "@/src/services/loginService";
|
||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
||||
import { IOid } from "@/src/types/commonTypes";
|
||||
import { IInventoryChanges, IPurchaseParams } from "@/src/types/purchaseTypes";
|
||||
import { IInventoryChanges, IPurchaseParams, PurchaseSource } from "@/src/types/purchaseTypes";
|
||||
import { RequestHandler } from "express";
|
||||
import { ExportBundles, ExportFlavour } from "warframe-public-export-plus";
|
||||
|
||||
export const giftingController: RequestHandler = async (req, res) => {
|
||||
const data = getJSONfromString<IGiftingRequest>(String(req.body));
|
||||
if (data.PurchaseParams.Source != 0 || !data.PurchaseParams.UsePremium) {
|
||||
if (data.PurchaseParams.Source != PurchaseSource.Market || !data.PurchaseParams.UsePremium) {
|
||||
throw new Error(`unexpected purchase params in gifting request: ${String(req.body)}`);
|
||||
}
|
||||
|
||||
|
||||
@ -6,13 +6,7 @@ import allDialogue from "@/static/fixed_responses/allDialogue.json";
|
||||
import { ILoadoutDatabase } from "@/src/types/saveLoadoutTypes";
|
||||
import { IInventoryClient, IShipInventory, equipmentKeys } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||
import { IPolarity, ArtifactPolarity, EquipmentFeatures } from "@/src/types/inventoryTypes/commonInventoryTypes";
|
||||
import {
|
||||
ExportCustoms,
|
||||
ExportFlavour,
|
||||
ExportRegions,
|
||||
ExportResources,
|
||||
ExportVirtuals
|
||||
} from "warframe-public-export-plus";
|
||||
import { ExportCustoms, ExportFlavour, ExportResources, ExportVirtuals } from "warframe-public-export-plus";
|
||||
import { applyCheatsToInfestedFoundry, handleSubsumeCompletion } from "@/src/services/infestedFoundryService";
|
||||
import {
|
||||
addMiscItems,
|
||||
@ -22,7 +16,7 @@ import {
|
||||
generateRewardSeed
|
||||
} from "@/src/services/inventoryService";
|
||||
import { logger } from "@/src/utils/logger";
|
||||
import { catBreadHash } from "@/src/helpers/stringHelpers";
|
||||
import { addString, catBreadHash } from "@/src/helpers/stringHelpers";
|
||||
import { Types } from "mongoose";
|
||||
import { getNemesisManifest } from "@/src/helpers/nemesisHelpers";
|
||||
import { getPersonalRooms } from "@/src/services/personalRoomsService";
|
||||
@ -167,18 +161,6 @@ export const getInventoryResponse = async (
|
||||
}
|
||||
}
|
||||
|
||||
if (config.unlockAllMissions) {
|
||||
inventoryResponse.Missions = [];
|
||||
for (const tag of Object.keys(ExportRegions)) {
|
||||
inventoryResponse.Missions.push({
|
||||
Completes: 1,
|
||||
Tier: 1,
|
||||
Tag: tag
|
||||
});
|
||||
}
|
||||
addString(inventoryResponse.NodeIntrosCompleted, "TeshinHardModeUnlocked");
|
||||
}
|
||||
|
||||
if (config.unlockAllShipDecorations) {
|
||||
inventoryResponse.ShipDecorations = [];
|
||||
for (const [uniqueName, item] of Object.entries(ExportResources)) {
|
||||
@ -339,14 +321,41 @@ export const getInventoryResponse = async (
|
||||
}
|
||||
}
|
||||
|
||||
if (config.unlockAllProfitTakerStages) {
|
||||
inventoryResponse.CompletedJobChains ??= [];
|
||||
const EudicoHeists = inventoryResponse.CompletedJobChains.find(x => x.LocationTag == "EudicoHeists");
|
||||
if (EudicoHeists) {
|
||||
EudicoHeists.Jobs = allEudicoHeistJobs;
|
||||
} else {
|
||||
inventoryResponse.CompletedJobChains.push({
|
||||
LocationTag: "EudicoHeists",
|
||||
Jobs: allEudicoHeistJobs
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (config.unlockAllSimarisResearchEntries) {
|
||||
inventoryResponse.LibraryPersonalTarget = undefined;
|
||||
inventoryResponse.LibraryPersonalProgress = [
|
||||
"/Lotus/Types/Game/Library/Targets/Research1Target",
|
||||
"/Lotus/Types/Game/Library/Targets/Research2Target",
|
||||
"/Lotus/Types/Game/Library/Targets/Research3Target",
|
||||
"/Lotus/Types/Game/Library/Targets/Research4Target",
|
||||
"/Lotus/Types/Game/Library/Targets/Research5Target",
|
||||
"/Lotus/Types/Game/Library/Targets/Research6Target",
|
||||
"/Lotus/Types/Game/Library/Targets/Research7Target"
|
||||
].map(type => ({ TargetType: type, Scans: 10, Completed: true }));
|
||||
}
|
||||
|
||||
return inventoryResponse;
|
||||
};
|
||||
|
||||
const addString = (arr: string[], str: string): void => {
|
||||
if (arr.indexOf(str) == -1) {
|
||||
arr.push(str);
|
||||
}
|
||||
};
|
||||
const allEudicoHeistJobs = [
|
||||
"/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyOne",
|
||||
"/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyTwo",
|
||||
"/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyThree",
|
||||
"/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyFour"
|
||||
];
|
||||
|
||||
const getExpRequiredForMr = (rank: number): number => {
|
||||
if (rank <= 30) {
|
||||
|
||||
@ -4,16 +4,16 @@ import { config } from "@/src/services/configService";
|
||||
import { buildConfig } from "@/src/services/buildConfigService";
|
||||
|
||||
import { Account } from "@/src/models/loginModel";
|
||||
import { createAccount, isCorrectPassword, isNameTaken } from "@/src/services/loginService";
|
||||
import { createAccount, createNonce, getUsernameFromEmail, isCorrectPassword } from "@/src/services/loginService";
|
||||
import { IDatabaseAccountJson, ILoginRequest, ILoginResponse } from "@/src/types/loginTypes";
|
||||
import { logger } from "@/src/utils/logger";
|
||||
import { version_compare } from "@/src/helpers/inventoryHelpers";
|
||||
import { sendWsBroadcastTo } from "@/src/services/webService";
|
||||
|
||||
export const loginController: RequestHandler = async (request, response) => {
|
||||
const loginRequest = JSON.parse(String(request.body)) as ILoginRequest; // parse octet stream of json data to json object
|
||||
|
||||
const account = await Account.findOne({ email: loginRequest.email });
|
||||
const nonce = Math.round(Math.random() * Number.MAX_SAFE_INTEGER);
|
||||
|
||||
const buildLabel: string =
|
||||
typeof request.query.buildLabel == "string"
|
||||
@ -42,26 +42,14 @@ export const loginController: RequestHandler = async (request, response) => {
|
||||
loginRequest.ClientType == "webui-register")
|
||||
) {
|
||||
try {
|
||||
const nameFromEmail = loginRequest.email.substring(0, loginRequest.email.indexOf("@"));
|
||||
let name = nameFromEmail || loginRequest.email.substring(1) || "SpaceNinja";
|
||||
if (await isNameTaken(name)) {
|
||||
let suffix = 0;
|
||||
do {
|
||||
++suffix;
|
||||
name = nameFromEmail + suffix;
|
||||
} while (await isNameTaken(name));
|
||||
}
|
||||
const name = await getUsernameFromEmail(loginRequest.email);
|
||||
const newAccount = await createAccount({
|
||||
email: loginRequest.email,
|
||||
password: loginRequest.password,
|
||||
DisplayName: name,
|
||||
CountryCode: loginRequest.lang?.toUpperCase() ?? "EN",
|
||||
ClientType: loginRequest.ClientType == "webui-register" ? "webui" : loginRequest.ClientType,
|
||||
CrossPlatformAllowed: true,
|
||||
ForceLogoutVersion: 0,
|
||||
ConsentNeeded: false,
|
||||
TrackedSettings: [],
|
||||
Nonce: nonce,
|
||||
ClientType: loginRequest.ClientType,
|
||||
Nonce: createNonce(),
|
||||
BuildLabel: buildLabel,
|
||||
LastLogin: new Date()
|
||||
});
|
||||
@ -80,38 +68,29 @@ export const loginController: RequestHandler = async (request, response) => {
|
||||
return;
|
||||
}
|
||||
|
||||
if (loginRequest.ClientType == "webui-register") {
|
||||
response.status(400).json({ error: "account already exists" });
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isCorrectPassword(loginRequest.password, account.password)) {
|
||||
response.status(400).json({ error: "incorrect login data" });
|
||||
return;
|
||||
}
|
||||
|
||||
if (loginRequest.ClientType == "webui") {
|
||||
if (!account.Nonce) {
|
||||
account.ClientType = "webui";
|
||||
account.Nonce = nonce;
|
||||
if (account.Nonce && account.ClientType != "webui" && !account.Dropped && !loginRequest.kick) {
|
||||
// U17 seems to handle "nonce still set" like a login failure.
|
||||
if (version_compare(buildLabel, "2015.12.05.18.07") >= 0) {
|
||||
response.status(400).send({ error: "nonce still set" });
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (account.Nonce && account.ClientType != "webui" && !account.Dropped && !loginRequest.kick) {
|
||||
// U17 seems to handle "nonce still set" like a login failure.
|
||||
if (version_compare(buildLabel, "2015.12.05.18.07") >= 0) {
|
||||
response.status(400).send({ error: "nonce still set" });
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
account.ClientType = loginRequest.ClientType;
|
||||
account.Nonce = nonce;
|
||||
account.CountryCode = loginRequest.lang?.toUpperCase() ?? "EN";
|
||||
account.BuildLabel = buildLabel;
|
||||
account.LastLogin = new Date();
|
||||
}
|
||||
|
||||
account.ClientType = loginRequest.ClientType;
|
||||
account.Nonce = createNonce();
|
||||
account.CountryCode = loginRequest.lang?.toUpperCase() ?? "EN";
|
||||
account.BuildLabel = buildLabel;
|
||||
account.LastLogin = new Date();
|
||||
await account.save();
|
||||
|
||||
// Tell WebUI its nonce has been invalidated
|
||||
sendWsBroadcastTo(account._id.toString(), { logged_out: true });
|
||||
|
||||
response.json(createLoginResponse(myAddress, myUrlBase, account.toJSON(), buildLabel));
|
||||
};
|
||||
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
import { RequestHandler } from "express";
|
||||
import { Account } from "@/src/models/loginModel";
|
||||
import { sendWsBroadcastTo } from "@/src/services/webService";
|
||||
|
||||
export const logoutController: RequestHandler = async (req, res) => {
|
||||
if (!req.query.accountId) {
|
||||
@ -10,7 +11,7 @@ export const logoutController: RequestHandler = async (req, res) => {
|
||||
throw new Error("Request is missing nonce parameter");
|
||||
}
|
||||
|
||||
await Account.updateOne(
|
||||
const stat = await Account.updateOne(
|
||||
{
|
||||
_id: req.query.accountId,
|
||||
Nonce: nonce
|
||||
@ -19,6 +20,10 @@ export const logoutController: RequestHandler = async (req, res) => {
|
||||
Nonce: 0
|
||||
}
|
||||
);
|
||||
if (stat.modifiedCount) {
|
||||
// Tell WebUI its nonce has been invalidated
|
||||
sendWsBroadcastTo(req.query.accountId as string, { logged_out: true });
|
||||
}
|
||||
|
||||
res.writeHead(200, {
|
||||
"Content-Type": "text/html",
|
||||
|
||||
@ -7,6 +7,7 @@ import { generateRewardSeed, getInventory } from "@/src/services/inventoryServic
|
||||
import { getInventoryResponse } from "./inventoryController";
|
||||
import { logger } from "@/src/utils/logger";
|
||||
import { IMissionInventoryUpdateResponse } from "@/src/types/missionTypes";
|
||||
import { sendWsBroadcastTo } from "@/src/services/webService";
|
||||
|
||||
/*
|
||||
**** INPUT ****
|
||||
@ -76,6 +77,7 @@ export const missionInventoryUpdateController: RequestHandler = async (req, res)
|
||||
InventoryJson: JSON.stringify(inventoryResponse),
|
||||
MissionRewards: []
|
||||
});
|
||||
sendWsBroadcastTo(account._id.toString(), { update_inventory: true });
|
||||
return;
|
||||
}
|
||||
|
||||
@ -106,6 +108,7 @@ export const missionInventoryUpdateController: RequestHandler = async (req, res)
|
||||
AffiliationMods,
|
||||
ConquestCompletedMissionsCount
|
||||
} satisfies IMissionInventoryUpdateResponse);
|
||||
sendWsBroadcastTo(account._id.toString(), { update_inventory: true });
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@ -3,6 +3,7 @@ import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import { getInventory, updateCurrency } from "@/src/services/inventoryService";
|
||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||
import { TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||
import { sendWsBroadcastTo } from "@/src/services/webService";
|
||||
|
||||
interface INameWeaponRequest {
|
||||
ItemName: string;
|
||||
@ -27,4 +28,5 @@ export const nameWeaponController: RequestHandler = async (req, res) => {
|
||||
res.json({
|
||||
InventoryChanges: currencyChanges
|
||||
});
|
||||
sendWsBroadcastTo(accountId, { update_inventory: true });
|
||||
};
|
||||
|
||||
@ -8,16 +8,15 @@ import {
|
||||
getKnifeUpgrade,
|
||||
getNemesisManifest,
|
||||
getNemesisPasscode,
|
||||
getNemesisPasscodeModTypes,
|
||||
GUESS_CORRECT,
|
||||
GUESS_INCORRECT,
|
||||
GUESS_NEUTRAL,
|
||||
GUESS_NONE,
|
||||
GUESS_WILDCARD,
|
||||
IKnifeResponse
|
||||
IKnifeResponse,
|
||||
parseUpgrade
|
||||
} from "@/src/helpers/nemesisHelpers";
|
||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
|
||||
import { Loadout } from "@/src/models/inventoryModels/loadoutModel";
|
||||
import { freeUpSlot, getInventory } from "@/src/services/inventoryService";
|
||||
import { getAccountForRequest } from "@/src/services/loginService";
|
||||
@ -215,7 +214,19 @@ export const nemesisController: RequestHandler = async (req, res) => {
|
||||
}
|
||||
];
|
||||
inventory.Nemesis!.Weakened = true;
|
||||
await consumePasscodeModCharges(inventory, response);
|
||||
|
||||
// Subtract a charge from all requiem mods installed on parazon
|
||||
const loadout = (await Loadout.findById(inventory.LoadOutPresets, "DATAKNIFE"))!;
|
||||
const dataknifeLoadout = loadout.DATAKNIFE.id(
|
||||
inventory.CurrentLoadOutIds[LoadoutIndex.DATAKNIFE].$oid
|
||||
);
|
||||
const dataknifeConfigIndex = dataknifeLoadout?.s?.mod ?? 0;
|
||||
const dataknifeUpgrades = inventory.DataKnives[0].Configs[dataknifeConfigIndex].Upgrades!;
|
||||
for (let i = 3; i != 6; ++i) {
|
||||
//logger.debug(`subtracting a charge from ${dataknifeUpgrades[i]}`);
|
||||
const upgrade = parseUpgrade(inventory, dataknifeUpgrades[i]);
|
||||
consumeModCharge(response, inventory, upgrade, dataknifeUpgrades);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Guess was incorrect, increase rank
|
||||
@ -380,18 +391,3 @@ interface IKnife {
|
||||
AttachedUpgrades: IUpgradeClient[];
|
||||
HiddenWhenHolstered: boolean;
|
||||
}
|
||||
|
||||
const consumePasscodeModCharges = async (
|
||||
inventory: TInventoryDatabaseDocument,
|
||||
response: IKnifeResponse
|
||||
): Promise<void> => {
|
||||
const loadout = (await Loadout.findById(inventory.LoadOutPresets, "DATAKNIFE"))!;
|
||||
const dataknifeLoadout = loadout.DATAKNIFE.id(inventory.CurrentLoadOutIds[LoadoutIndex.DATAKNIFE].$oid);
|
||||
const dataknifeConfigIndex = dataknifeLoadout?.s?.mod ?? 0;
|
||||
const dataknifeUpgrades = inventory.DataKnives[0].Configs[dataknifeConfigIndex].Upgrades!;
|
||||
const modTypes = getNemesisPasscodeModTypes(inventory.Nemesis!);
|
||||
for (const modType of modTypes) {
|
||||
const upgrade = getKnifeUpgrade(inventory, dataknifeUpgrades, modType);
|
||||
consumeModCharge(response, inventory, upgrade, dataknifeUpgrades);
|
||||
}
|
||||
};
|
||||
|
||||
@ -3,6 +3,7 @@ import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import { IPurchaseRequest } from "@/src/types/purchaseTypes";
|
||||
import { handlePurchase } from "@/src/services/purchaseService";
|
||||
import { getInventory } from "@/src/services/inventoryService";
|
||||
import { sendWsBroadcastTo } from "@/src/services/webService";
|
||||
|
||||
export const purchaseController: RequestHandler = async (req, res) => {
|
||||
const purchaseRequest = JSON.parse(String(req.body)) as IPurchaseRequest;
|
||||
@ -11,4 +12,5 @@ export const purchaseController: RequestHandler = async (req, res) => {
|
||||
const response = await handlePurchase(purchaseRequest, inventory);
|
||||
await inventory.save();
|
||||
res.json(response);
|
||||
sendWsBroadcastTo(accountId, { update_inventory: true });
|
||||
};
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||
import { getInventory, updateCurrency } from "@/src/services/inventoryService";
|
||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import { sendWsBroadcastTo } from "@/src/services/webService";
|
||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
||||
import { RequestHandler } from "express";
|
||||
|
||||
@ -22,6 +23,7 @@ export const renamePetController: RequestHandler = async (req, res) => {
|
||||
...data,
|
||||
inventoryChanges: inventoryChanges
|
||||
});
|
||||
sendWsBroadcastTo(accountId, { update_inventory: true });
|
||||
};
|
||||
|
||||
interface IRenamePetRequest {
|
||||
|
||||
@ -15,6 +15,7 @@ import { InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||
import { ExportDojoRecipes } from "warframe-public-export-plus";
|
||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
||||
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
|
||||
import { sendWsBroadcastTo } from "@/src/services/webService";
|
||||
|
||||
export const sellController: RequestHandler = async (req, res) => {
|
||||
const payload = JSON.parse(String(req.body)) as ISellRequest;
|
||||
@ -279,6 +280,7 @@ export const sellController: RequestHandler = async (req, res) => {
|
||||
res.json({
|
||||
inventoryChanges: inventoryChanges // "inventoryChanges" for this response instead of the usual "InventoryChanges"
|
||||
});
|
||||
sendWsBroadcastTo(accountId, { update_inventory: true });
|
||||
};
|
||||
|
||||
interface ISellRequest {
|
||||
|
||||
@ -13,7 +13,7 @@ export const updateChallengeProgressController: RequestHandler = async (req, res
|
||||
|
||||
const inventory = await getInventory(
|
||||
account._id.toString(),
|
||||
"ChallengesFixVersion ChallengeProgress SeasonChallengeHistory Affiliations"
|
||||
"ChallengesFixVersion ChallengeProgress SeasonChallengeHistory Affiliations CalendarProgress"
|
||||
);
|
||||
let affiliationMods: IAffiliationMods[] = [];
|
||||
if (challenges.ChallengeProgress) {
|
||||
|
||||
34
src/controllers/custom/completeAllMissionsController.ts
Normal file
34
src/controllers/custom/completeAllMissionsController.ts
Normal file
@ -0,0 +1,34 @@
|
||||
import { addString } from "@/src/helpers/stringHelpers";
|
||||
import { getInventory } from "@/src/services/inventoryService";
|
||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import { addFixedLevelRewards } from "@/src/services/missionInventoryUpdateService";
|
||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
||||
import { IMissionReward } from "@/src/types/missionTypes";
|
||||
import { RequestHandler } from "express";
|
||||
import { ExportRegions } from "warframe-public-export-plus";
|
||||
|
||||
export const completeAllMissionsController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const inventory = await getInventory(accountId);
|
||||
const MissionRewards: IMissionReward[] = [];
|
||||
for (const [tag, node] of Object.entries(ExportRegions)) {
|
||||
if (!inventory.Missions.find(x => x.Tag == tag)) {
|
||||
inventory.Missions.push({
|
||||
Completes: 1,
|
||||
Tier: 1,
|
||||
Tag: tag
|
||||
});
|
||||
|
||||
if (node.missionReward) {
|
||||
console.log(node.missionReward);
|
||||
addFixedLevelRewards(node.missionReward, inventory, MissionRewards);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (const reward of MissionRewards) {
|
||||
await handleStoreItemAcquisition(reward.StoreItem, inventory, reward.ItemCount, undefined, true);
|
||||
}
|
||||
addString(inventory.NodeIntrosCompleted, "TeshinHardModeUnlocked");
|
||||
await inventory.save();
|
||||
res.end();
|
||||
};
|
||||
@ -128,7 +128,7 @@ export const manageQuestsController: RequestHandler = async (req, res) => {
|
||||
await completeQuest(inventory, questKey.ItemType);
|
||||
} else {
|
||||
const progress = {
|
||||
c: questManifest.chainStages![currentStage].key ? -1 : 0,
|
||||
c: 0,
|
||||
i: false,
|
||||
m: false,
|
||||
b: []
|
||||
|
||||
10
src/controllers/custom/webuiFileChangeDetectedController.ts
Normal file
10
src/controllers/custom/webuiFileChangeDetectedController.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import { args } from "@/src/helpers/commandLineArguments";
|
||||
import { sendWsBroadcast } from "@/src/services/webService";
|
||||
import { RequestHandler } from "express";
|
||||
|
||||
export const webuiFileChangeDetectedController: RequestHandler = (req, res) => {
|
||||
if (args.dev && args.secret && req.query.secret == args.secret) {
|
||||
sendWsBroadcast({ reload: true });
|
||||
}
|
||||
res.end();
|
||||
};
|
||||
@ -1,6 +1,15 @@
|
||||
import { RequestHandler } from "express";
|
||||
import { getWorldState } from "@/src/services/worldStateService";
|
||||
import { getWorldState, populateFissures } from "@/src/services/worldStateService";
|
||||
import { version_compare } from "@/src/helpers/inventoryHelpers";
|
||||
|
||||
export const worldStateController: RequestHandler = (req, res) => {
|
||||
res.json(getWorldState(req.query.buildLabel as string | undefined));
|
||||
export const worldStateController: RequestHandler = async (req, res) => {
|
||||
const buildLabel = req.query.buildLabel as string | undefined;
|
||||
const worldState = getWorldState(buildLabel);
|
||||
|
||||
// Omitting void fissures for versions prior to Dante Unbound to avoid script errors.
|
||||
if (!buildLabel || version_compare(buildLabel, "2024.03.24.20.00") >= 0) {
|
||||
await populateFissures(worldState);
|
||||
}
|
||||
|
||||
res.json(worldState);
|
||||
};
|
||||
|
||||
23
src/helpers/commandLineArguments.ts
Normal file
23
src/helpers/commandLineArguments.ts
Normal file
@ -0,0 +1,23 @@
|
||||
interface IArguments {
|
||||
configPath?: string;
|
||||
dev?: boolean;
|
||||
secret?: string;
|
||||
}
|
||||
|
||||
export const args: IArguments = {};
|
||||
|
||||
for (let i = 2; i < process.argv.length; ) {
|
||||
switch (process.argv[i++]) {
|
||||
case "--configPath":
|
||||
args.configPath = process.argv[i++];
|
||||
break;
|
||||
|
||||
case "--dev":
|
||||
args.dev = true;
|
||||
break;
|
||||
|
||||
case "--secret":
|
||||
args.secret = process.argv[i++];
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -237,7 +237,7 @@ export const getNemesisPasscode = (nemesis: { fp: bigint; Faction: TNemesisFacti
|
||||
return passcode;
|
||||
};
|
||||
|
||||
const requiemMods: readonly string[] = [
|
||||
/*const requiemMods: readonly string[] = [
|
||||
"/Lotus/Upgrades/Mods/Immortal/ImmortalOneMod",
|
||||
"/Lotus/Upgrades/Mods/Immortal/ImmortalTwoMod",
|
||||
"/Lotus/Upgrades/Mods/Immortal/ImmortalThreeMod",
|
||||
@ -246,7 +246,7 @@ const requiemMods: readonly string[] = [
|
||||
"/Lotus/Upgrades/Mods/Immortal/ImmortalSixMod",
|
||||
"/Lotus/Upgrades/Mods/Immortal/ImmortalSevenMod",
|
||||
"/Lotus/Upgrades/Mods/Immortal/ImmortalEightMod"
|
||||
];
|
||||
];*/
|
||||
|
||||
export const antivirusMods: readonly string[] = [
|
||||
"/Lotus/Upgrades/Mods/Immortal/AntivirusOneMod",
|
||||
@ -259,12 +259,12 @@ export const antivirusMods: readonly string[] = [
|
||||
"/Lotus/Upgrades/Mods/Immortal/AntivirusEightMod"
|
||||
];
|
||||
|
||||
export const getNemesisPasscodeModTypes = (nemesis: { fp: bigint; Faction: TNemesisFaction }): string[] => {
|
||||
/*export const getNemesisPasscodeModTypes = (nemesis: { fp: bigint; Faction: TNemesisFaction }): string[] => {
|
||||
const passcode = getNemesisPasscode(nemesis);
|
||||
return nemesis.Faction == "FC_INFESTATION"
|
||||
? passcode.map(i => antivirusMods[i])
|
||||
: passcode.map(i => requiemMods[i]);
|
||||
};
|
||||
};*/
|
||||
|
||||
// Symbols; 0-7 are the normal requiem mods.
|
||||
export const GUESS_NONE = 8;
|
||||
@ -343,6 +343,27 @@ export const getKnifeUpgrade = (
|
||||
throw new Error(`${type} does not seem to be installed on parazon?!`);
|
||||
};
|
||||
|
||||
export const parseUpgrade = (
|
||||
inventory: TInventoryDatabaseDocument,
|
||||
str: string
|
||||
): { ItemId: IOid; ItemType: string } => {
|
||||
if (str.length == 24) {
|
||||
const upgrade = inventory.Upgrades.id(str);
|
||||
if (upgrade) {
|
||||
return {
|
||||
ItemId: { $oid: str },
|
||||
ItemType: upgrade.ItemType
|
||||
};
|
||||
}
|
||||
throw new Error(`Could not resolve oid ${str}`);
|
||||
} else {
|
||||
return {
|
||||
ItemId: { $oid: "000000000000000000000000" },
|
||||
ItemType: str
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export const consumeModCharge = (
|
||||
response: IKnifeResponse,
|
||||
inventory: TInventoryDatabaseDocument,
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
import path from "path";
|
||||
|
||||
export const rootDir = path.join(__dirname, "../..");
|
||||
export const isDev = path.basename(rootDir) != "build";
|
||||
export const repoDir = isDev ? rootDir : path.join(rootDir, "..");
|
||||
export const repoDir = path.basename(rootDir) != "build" ? rootDir : path.join(rootDir, "..");
|
||||
|
||||
@ -54,3 +54,9 @@ export const regexEscape = (str: string): string => {
|
||||
str = str.split("}").join("\\}");
|
||||
return str;
|
||||
};
|
||||
|
||||
export const addString = (arr: string[], str: string): void => {
|
||||
if (arr.indexOf(str) == -1) {
|
||||
arr.push(str);
|
||||
}
|
||||
};
|
||||
|
||||
@ -22,6 +22,7 @@ import { JSONStringify } from "json-with-bigint";
|
||||
import { startWebServer } from "./services/webService";
|
||||
|
||||
import { validateConfig } from "@/src/services/configWatcherService";
|
||||
import { updateWorldStateCollections } from "./services/worldStateService";
|
||||
|
||||
// Patch JSON.stringify to work flawlessly with Bigints.
|
||||
JSON.stringify = JSONStringify;
|
||||
@ -33,6 +34,11 @@ mongoose
|
||||
.then(() => {
|
||||
logger.info("Connected to MongoDB");
|
||||
startWebServer();
|
||||
|
||||
void updateWorldStateCollections();
|
||||
setInterval(() => {
|
||||
void updateWorldStateCollections();
|
||||
}, 60_000);
|
||||
})
|
||||
.catch(error => {
|
||||
if (error instanceof Error) {
|
||||
|
||||
@ -17,7 +17,6 @@ export interface IMessageDatabase extends IMessage {
|
||||
ownerId: Types.ObjectId;
|
||||
date: Date; //created at
|
||||
attVisualOnly?: boolean;
|
||||
expiry?: Date;
|
||||
_id: Types.ObjectId;
|
||||
}
|
||||
|
||||
@ -33,6 +32,7 @@ export interface IMessage {
|
||||
att?: string[];
|
||||
countedAtt?: ITypeCount[];
|
||||
transmission?: string;
|
||||
CrossPlatform?: boolean;
|
||||
arg?: Arg[];
|
||||
gifts?: IGift[];
|
||||
r?: boolean;
|
||||
@ -107,7 +107,9 @@ const messageSchema = new Schema<IMessageDatabase>(
|
||||
lowPrioNewPlayers: Boolean,
|
||||
startDate: Date,
|
||||
endDate: Date,
|
||||
date: { type: Date, required: true },
|
||||
r: Boolean,
|
||||
CrossPlatform: Boolean,
|
||||
att: { type: [String], default: undefined },
|
||||
gifts: { type: [giftSchema], default: undefined },
|
||||
countedAtt: { type: [typeCountSchema], default: undefined },
|
||||
@ -128,7 +130,7 @@ const messageSchema = new Schema<IMessageDatabase>(
|
||||
declineAction: String,
|
||||
hasAccountAction: Boolean
|
||||
},
|
||||
{ timestamps: { createdAt: "date", updatedAt: false }, id: false }
|
||||
{ id: false }
|
||||
);
|
||||
|
||||
messageSchema.virtual("messageId").get(function (this: IMessageDatabase) {
|
||||
@ -151,13 +153,15 @@ messageSchema.set("toJSON", {
|
||||
|
||||
if (messageDatabase.startDate && messageDatabase.endDate) {
|
||||
messageClient.startDate = toMongoDate(messageDatabase.startDate);
|
||||
|
||||
messageClient.endDate = toMongoDate(messageDatabase.endDate);
|
||||
} else {
|
||||
delete messageClient.startDate;
|
||||
delete messageClient.endDate;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
messageSchema.index({ ownerId: 1 });
|
||||
messageSchema.index({ expiry: 1 }, { expireAfterSeconds: 0 });
|
||||
messageSchema.index({ endDate: 1 }, { expireAfterSeconds: 0 });
|
||||
|
||||
export const Inbox = model<IMessageDatabase>("Inbox", messageSchema, "inbox");
|
||||
|
||||
@ -11,13 +11,13 @@ const databaseAccountSchema = new Schema<IDatabaseAccountJson>(
|
||||
email: { type: String, required: true, unique: true },
|
||||
password: { type: String, required: true },
|
||||
DisplayName: { type: String, required: true, unique: true },
|
||||
CountryCode: { type: String, required: true },
|
||||
CountryCode: { type: String, default: "" },
|
||||
ClientType: { type: String },
|
||||
CrossPlatformAllowed: { type: Boolean, required: true },
|
||||
ForceLogoutVersion: { type: Number, required: true },
|
||||
CrossPlatformAllowed: { type: Boolean, default: true },
|
||||
ForceLogoutVersion: { type: Number, default: 0 },
|
||||
AmazonAuthToken: { type: String },
|
||||
AmazonRefreshToken: { type: String },
|
||||
ConsentNeeded: { type: Boolean, required: true },
|
||||
ConsentNeeded: { type: Boolean, default: false },
|
||||
TrackedSettings: { type: [String], default: [] },
|
||||
Nonce: { type: Number, default: 0 },
|
||||
BuildLabel: String,
|
||||
|
||||
14
src/models/worldStateModel.ts
Normal file
14
src/models/worldStateModel.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import { IFissureDatabase } from "@/src/types/worldStateTypes";
|
||||
import { model, Schema } from "mongoose";
|
||||
|
||||
const fissureSchema = new Schema<IFissureDatabase>({
|
||||
Activation: Date,
|
||||
Expiry: Date,
|
||||
Node: String, // must be unique
|
||||
Modifier: String,
|
||||
Hard: Boolean
|
||||
});
|
||||
|
||||
fissureSchema.index({ Expiry: 1 }, { expireAfterSeconds: 0 }); // With this, MongoDB will automatically delete expired entries.
|
||||
|
||||
export const Fissure = model<IFissureDatabase>("Fissure", fissureSchema);
|
||||
@ -284,6 +284,7 @@ apiRouter.post("/inventorySlots.php", inventorySlotsController);
|
||||
apiRouter.post("/joinSession.php", joinSessionController);
|
||||
apiRouter.post("/login.php", loginController);
|
||||
apiRouter.post("/loginRewardsSelection.php", loginRewardsSelectionController);
|
||||
apiRouter.post("/logout.php", logoutController); // from ~U16, don't know when they changed it to GET
|
||||
apiRouter.post("/maturePet.php", maturePetController);
|
||||
apiRouter.post("/missionInventoryUpdate.php", missionInventoryUpdateController);
|
||||
apiRouter.post("/modularWeaponCrafting.php", modularWeaponCraftingController);
|
||||
|
||||
@ -11,6 +11,8 @@ import { renameAccountController } from "@/src/controllers/custom/renameAccountC
|
||||
import { ircDroppedController } from "@/src/controllers/custom/ircDroppedController";
|
||||
import { unlockAllIntrinsicsController } from "@/src/controllers/custom/unlockAllIntrinsicsController";
|
||||
import { addMissingMaxRankModsController } from "@/src/controllers/custom/addMissingMaxRankModsController";
|
||||
import { webuiFileChangeDetectedController } from "@/src/controllers/custom/webuiFileChangeDetectedController";
|
||||
import { completeAllMissionsController } from "@/src/controllers/custom/completeAllMissionsController";
|
||||
|
||||
import { createAccountController } from "@/src/controllers/custom/createAccountController";
|
||||
import { createMessageController } from "@/src/controllers/custom/createMessageController";
|
||||
@ -20,10 +22,10 @@ import { addXpController } from "@/src/controllers/custom/addXpController";
|
||||
import { importController } from "@/src/controllers/custom/importController";
|
||||
import { manageQuestsController } from "@/src/controllers/custom/manageQuestsController";
|
||||
import { setEvolutionProgressController } from "@/src/controllers/custom/setEvolutionProgressController";
|
||||
import { setBoosterController } from "@/src/controllers/custom/setBoosterController";
|
||||
|
||||
import { getConfigDataController } from "@/src/controllers/custom/getConfigDataController";
|
||||
import { updateConfigDataController } from "@/src/controllers/custom/updateConfigDataController";
|
||||
import { setBoosterController } from "../controllers/custom/setBoosterController";
|
||||
|
||||
const customRouter = express.Router();
|
||||
|
||||
@ -38,6 +40,8 @@ customRouter.get("/renameAccount", renameAccountController);
|
||||
customRouter.get("/ircDropped", ircDroppedController);
|
||||
customRouter.get("/unlockAllIntrinsics", unlockAllIntrinsicsController);
|
||||
customRouter.get("/addMissingMaxRankMods", addMissingMaxRankModsController);
|
||||
customRouter.get("/webuiFileChangeDetected", webuiFileChangeDetectedController);
|
||||
customRouter.get("/completeAllMissions", completeAllMissionsController);
|
||||
|
||||
customRouter.post("/createAccount", createAccountController);
|
||||
customRouter.post("/createMessage", createMessageController);
|
||||
|
||||
@ -1,6 +1,9 @@
|
||||
import express from "express";
|
||||
import path from "path";
|
||||
import { repoDir, rootDir } from "@/src/helpers/pathHelper";
|
||||
import { args } from "@/src/helpers/commandLineArguments";
|
||||
|
||||
const baseDir = args.dev ? repoDir : rootDir;
|
||||
|
||||
const webuiRouter = express.Router();
|
||||
|
||||
@ -19,29 +22,29 @@ webuiRouter.use("/webui", (req, res, next) => {
|
||||
|
||||
// Serve virtual routes
|
||||
webuiRouter.get("/webui/inventory", (_req, res) => {
|
||||
res.sendFile(path.join(rootDir, "static/webui/index.html"));
|
||||
res.sendFile(path.join(baseDir, "static/webui/index.html"));
|
||||
});
|
||||
webuiRouter.get(/webui\/powersuit\/(.+)/, (_req, res) => {
|
||||
res.sendFile(path.join(rootDir, "static/webui/index.html"));
|
||||
res.sendFile(path.join(baseDir, "static/webui/index.html"));
|
||||
});
|
||||
webuiRouter.get("/webui/mods", (_req, res) => {
|
||||
res.sendFile(path.join(rootDir, "static/webui/index.html"));
|
||||
res.sendFile(path.join(baseDir, "static/webui/index.html"));
|
||||
});
|
||||
webuiRouter.get("/webui/settings", (_req, res) => {
|
||||
res.sendFile(path.join(rootDir, "static/webui/index.html"));
|
||||
res.sendFile(path.join(baseDir, "static/webui/index.html"));
|
||||
});
|
||||
webuiRouter.get("/webui/quests", (_req, res) => {
|
||||
res.sendFile(path.join(rootDir, "static/webui/index.html"));
|
||||
res.sendFile(path.join(baseDir, "static/webui/index.html"));
|
||||
});
|
||||
webuiRouter.get("/webui/cheats", (_req, res) => {
|
||||
res.sendFile(path.join(rootDir, "static/webui/index.html"));
|
||||
res.sendFile(path.join(baseDir, "static/webui/index.html"));
|
||||
});
|
||||
webuiRouter.get("/webui/import", (_req, res) => {
|
||||
res.sendFile(path.join(rootDir, "static/webui/index.html"));
|
||||
res.sendFile(path.join(baseDir, "static/webui/index.html"));
|
||||
});
|
||||
|
||||
// Serve static files
|
||||
webuiRouter.use("/webui", express.static(path.join(rootDir, "static/webui")));
|
||||
webuiRouter.use("/webui", express.static(path.join(baseDir, "static/webui")));
|
||||
|
||||
// Serve favicon
|
||||
webuiRouter.get("/favicon.ico", (_req, res) => {
|
||||
@ -58,7 +61,7 @@ webuiRouter.get("/webui/riven-tool/RivenParser.js", (_req, res) => {
|
||||
|
||||
// Serve translations
|
||||
webuiRouter.get("/translations/:file", (req, res) => {
|
||||
res.sendFile(path.join(rootDir, `static/webui/translations/${req.params.file}`));
|
||||
res.sendFile(path.join(baseDir, `static/webui/translations/${req.params.file}`));
|
||||
});
|
||||
|
||||
export { webuiRouter };
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import fs from "fs";
|
||||
import path from "path";
|
||||
import { repoDir } from "@/src/helpers/pathHelper";
|
||||
import { args } from "@/src/helpers/commandLineArguments";
|
||||
|
||||
export interface IConfig {
|
||||
mongodbUrl: string;
|
||||
@ -18,7 +19,6 @@ export interface IConfig {
|
||||
skipTutorial?: boolean;
|
||||
skipAllDialogue?: boolean;
|
||||
unlockAllScans?: boolean;
|
||||
unlockAllMissions?: boolean;
|
||||
infiniteCredits?: boolean;
|
||||
infinitePlatinum?: boolean;
|
||||
infiniteEndo?: boolean;
|
||||
@ -48,7 +48,11 @@ export interface IConfig {
|
||||
noVendorPurchaseLimits?: boolean;
|
||||
noDeathMarks?: boolean;
|
||||
noKimCooldowns?: boolean;
|
||||
fullyStockedVendors?: boolean;
|
||||
baroAlwaysAvailable?: boolean;
|
||||
baroFullyStocked?: boolean;
|
||||
syndicateMissionsRepeatable?: boolean;
|
||||
unlockAllProfitTakerStages?: boolean;
|
||||
instantFinishRivenChallenge?: boolean;
|
||||
instantResourceExtractorDrones?: boolean;
|
||||
noResourceExtractorDronesDamage?: boolean;
|
||||
@ -59,8 +63,14 @@ export interface IConfig {
|
||||
noDojoResearchCosts?: boolean;
|
||||
noDojoResearchTime?: boolean;
|
||||
fastClanAscension?: boolean;
|
||||
missionsCanGiveAllRelics?: boolean;
|
||||
unlockAllSimarisResearchEntries?: boolean;
|
||||
spoofMasteryRank?: number;
|
||||
nightwaveStandingMultiplier?: number;
|
||||
unfaithfulBugFixes?: {
|
||||
ignore1999LastRegionPlayed?: boolean;
|
||||
fixXtraCheeseTimer?: boolean;
|
||||
};
|
||||
worldState?: {
|
||||
creditBoost?: boolean;
|
||||
affinityBoost?: boolean;
|
||||
@ -77,7 +87,7 @@ export interface IConfig {
|
||||
};
|
||||
}
|
||||
|
||||
export const configPath = path.join(repoDir, process.argv[2] ?? "config.json");
|
||||
export const configPath = path.join(repoDir, args.configPath ?? "config.json");
|
||||
|
||||
export const config: IConfig = {
|
||||
mongodbUrl: "mongodb://127.0.0.1:27017/openWF",
|
||||
|
||||
@ -2,10 +2,15 @@ import fs from "fs";
|
||||
import fsPromises from "fs/promises";
|
||||
import { logger } from "../utils/logger";
|
||||
import { config, configPath, loadConfig } from "./configService";
|
||||
import { getWebPorts, startWebServer, stopWebServer } from "./webService";
|
||||
import { getWebPorts, sendWsBroadcast, startWebServer, stopWebServer } from "./webService";
|
||||
|
||||
let amnesia = false;
|
||||
fs.watchFile(configPath, () => {
|
||||
fs.watchFile(configPath, (now, then) => {
|
||||
// https://github.com/oven-sh/bun/issues/20542
|
||||
if (process.versions.bun && now.mtimeMs == then.mtimeMs) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (amnesia) {
|
||||
amnesia = false;
|
||||
} else {
|
||||
@ -21,7 +26,13 @@ fs.watchFile(configPath, () => {
|
||||
const webPorts = getWebPorts();
|
||||
if (config.httpPort != webPorts.http || config.httpsPort != webPorts.https) {
|
||||
logger.info(`Restarting web server to apply port changes.`);
|
||||
|
||||
// Tell webui clients to reload with new port
|
||||
sendWsBroadcast({ ports: { http: config.httpPort, https: config.httpsPort } });
|
||||
|
||||
void stopWebServer().then(startWebServer);
|
||||
} else {
|
||||
sendWsBroadcast({ config_reloaded: true });
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@ -2,8 +2,8 @@ import { IMessageDatabase, Inbox } from "@/src/models/inboxModel";
|
||||
import { getAccountForRequest } from "@/src/services/loginService";
|
||||
import { HydratedDocument, Types } from "mongoose";
|
||||
import { Request } from "express";
|
||||
import eventMessages from "@/static/fixed_responses/eventMessages.json";
|
||||
import { logger } from "@/src/utils/logger";
|
||||
import { unixTimesInMs } from "../constants/timeConstants";
|
||||
import { config } from "./configService";
|
||||
|
||||
export const getAllMessagesSorted = async (accountId: string): Promise<HydratedDocument<IMessageDatabase>[]> => {
|
||||
const inbox = await Inbox.find({ ownerId: accountId }).sort({ date: -1 });
|
||||
@ -29,40 +29,56 @@ export const deleteAllMessagesRead = async (accountId: string): Promise<void> =>
|
||||
|
||||
export const createNewEventMessages = async (req: Request): Promise<void> => {
|
||||
const account = await getAccountForRequest(req);
|
||||
const latestEventMessageDate = account.LatestEventMessageDate;
|
||||
const newEventMessages: IMessageCreationTemplate[] = [];
|
||||
|
||||
//TODO: is baroo there? create these kind of messages too (periodical messages)
|
||||
const newEventMessages = eventMessages.Messages.filter(m => new Date(m.eventMessageDate) > latestEventMessageDate);
|
||||
// Baro
|
||||
const baroIndex = Math.trunc((Date.now() - 910800000) / (unixTimesInMs.day * 14));
|
||||
const baroStart = baroIndex * (unixTimesInMs.day * 14) + 910800000;
|
||||
const baroActualStart = baroStart + unixTimesInMs.day * (config.baroAlwaysAvailable ? 0 : 12);
|
||||
if (account.LatestEventMessageDate.getTime() < baroActualStart) {
|
||||
newEventMessages.push({
|
||||
sndr: "/Lotus/Language/G1Quests/VoidTraderName",
|
||||
sub: "/Lotus/Language/CommunityMessages/VoidTraderAppearanceTitle",
|
||||
msg: "/Lotus/Language/CommunityMessages/VoidTraderAppearanceMessage",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/BaroKiTeerPortrait.png",
|
||||
startDate: new Date(baroActualStart),
|
||||
endDate: new Date(baroStart + unixTimesInMs.day * 14),
|
||||
CrossPlatform: true,
|
||||
arg: [
|
||||
{
|
||||
Key: "NODE_NAME",
|
||||
Tag: ["EarthHUB", "MercuryHUB", "SaturnHUB", "PlutoHUB"][baroIndex % 4]
|
||||
}
|
||||
],
|
||||
date: new Date(baroActualStart)
|
||||
});
|
||||
}
|
||||
|
||||
if (newEventMessages.length === 0) {
|
||||
logger.debug(`No new event messages. Latest event message date: ${latestEventMessageDate.toISOString()}`);
|
||||
return;
|
||||
}
|
||||
|
||||
const savedEventMessages = await createMessage(account._id, newEventMessages);
|
||||
logger.debug("created event messages", savedEventMessages);
|
||||
await createMessage(account._id, newEventMessages);
|
||||
|
||||
const latestEventMessage = newEventMessages.reduce((prev, current) =>
|
||||
prev.eventMessageDate > current.eventMessageDate ? prev : current
|
||||
prev.startDate! > current.startDate! ? prev : current
|
||||
);
|
||||
|
||||
account.LatestEventMessageDate = new Date(latestEventMessage.eventMessageDate);
|
||||
account.LatestEventMessageDate = new Date(latestEventMessage.startDate!);
|
||||
await account.save();
|
||||
};
|
||||
|
||||
export const createMessage = async (
|
||||
accountId: string | Types.ObjectId,
|
||||
messages: IMessageCreationTemplate[]
|
||||
): Promise<HydratedDocument<IMessageDatabase>[]> => {
|
||||
): Promise<void> => {
|
||||
const ownerIdMessages = messages.map(m => ({
|
||||
...m,
|
||||
date: m.date ?? new Date(),
|
||||
ownerId: accountId
|
||||
}));
|
||||
|
||||
const savedMessages = await Inbox.insertMany(ownerIdMessages);
|
||||
return savedMessages as HydratedDocument<IMessageDatabase>[];
|
||||
await Inbox.insertMany(ownerIdMessages);
|
||||
};
|
||||
|
||||
export interface IMessageCreationTemplate extends Omit<IMessageDatabase, "_id" | "date" | "ownerId"> {
|
||||
ownerId?: string;
|
||||
date?: Date;
|
||||
}
|
||||
|
||||
@ -84,9 +84,11 @@ import { getRandomElement, getRandomInt, getRandomWeightedReward, SRng } from ".
|
||||
import { createMessage } from "./inboxService";
|
||||
import { getMaxStanding, getMinStanding } from "@/src/helpers/syndicateStandingHelper";
|
||||
import { getNightwaveSyndicateTag, getWorldState } from "./worldStateService";
|
||||
import { ICalendarSeason } from "@/src/types/worldStateTypes";
|
||||
import { generateNemesisProfile, INemesisProfile } from "../helpers/nemesisHelpers";
|
||||
import { TAccountDocument } from "./loginService";
|
||||
import { unixTimesInMs } from "../constants/timeConstants";
|
||||
import { addString } from "../helpers/stringHelpers";
|
||||
|
||||
export const createInventory = async (
|
||||
accountOwnerId: Types.ObjectId,
|
||||
@ -1783,6 +1785,10 @@ export const addChallenges = (
|
||||
} else {
|
||||
inventory.ChallengeProgress.push({ Name, Progress });
|
||||
}
|
||||
|
||||
if (Name.startsWith("Calendar")) {
|
||||
addString(getCalendarProgress(inventory).SeasonProgress.ActivatedChallenges, Name);
|
||||
}
|
||||
});
|
||||
|
||||
const affiliationMods: IAffiliationMods[] = [];
|
||||
@ -1825,12 +1831,15 @@ export const addChallenges = (
|
||||
return affiliationMods;
|
||||
};
|
||||
|
||||
export const addMissionComplete = (inventory: TInventoryDatabaseDocument, { Tag, Completes }: IMission): void => {
|
||||
export const addMissionComplete = (inventory: TInventoryDatabaseDocument, { Tag, Completes, Tier }: IMission): void => {
|
||||
const { Missions } = inventory;
|
||||
const itemIndex = Missions.findIndex(item => item.Tag === Tag);
|
||||
|
||||
if (itemIndex !== -1) {
|
||||
Missions[itemIndex].Completes += Completes;
|
||||
if (Tier) {
|
||||
Missions[itemIndex].Tier = Tier;
|
||||
}
|
||||
} else {
|
||||
Missions.push({ Tag, Completes });
|
||||
}
|
||||
@ -2026,6 +2035,20 @@ export const getCalendarProgress = (inventory: TInventoryDatabaseDocument): ICal
|
||||
return inventory.CalendarProgress;
|
||||
};
|
||||
|
||||
export const checkCalendarChallengeCompletion = (
|
||||
calendarProgress: ICalendarProgress,
|
||||
currentSeason: ICalendarSeason
|
||||
): void => {
|
||||
const dayIndex = calendarProgress.SeasonProgress.LastCompletedDayIdx + 1;
|
||||
if (calendarProgress.SeasonProgress.LastCompletedChallengeDayIdx >= dayIndex) {
|
||||
const day = currentSeason.Days[dayIndex];
|
||||
if (day.events.length != 0 && day.events[0].type == "CET_CHALLENGE") {
|
||||
//logger.debug(`already completed the challenge, skipping ahead`);
|
||||
calendarProgress.SeasonProgress.LastCompletedDayIdx++;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const giveNemesisWeaponRecipe = (
|
||||
inventory: TInventoryDatabaseDocument,
|
||||
weaponType: string,
|
||||
|
||||
@ -18,6 +18,23 @@ export const isNameTaken = async (name: string): Promise<boolean> => {
|
||||
return !!(await Account.findOne({ DisplayName: name }));
|
||||
};
|
||||
|
||||
export const createNonce = (): number => {
|
||||
return Math.round(Math.random() * Number.MAX_SAFE_INTEGER);
|
||||
};
|
||||
|
||||
export const getUsernameFromEmail = async (email: string): Promise<string> => {
|
||||
const nameFromEmail = email.substring(0, email.indexOf("@"));
|
||||
let name = nameFromEmail || email.substring(1) || "SpaceNinja";
|
||||
if (await isNameTaken(name)) {
|
||||
let suffix = 0;
|
||||
do {
|
||||
++suffix;
|
||||
name = nameFromEmail + suffix;
|
||||
} while (await isNameTaken(name));
|
||||
}
|
||||
return nameFromEmail;
|
||||
};
|
||||
|
||||
export const createAccount = async (accountData: IDatabaseAccountRequiredFields): Promise<IDatabaseAccountJson> => {
|
||||
const account = new Account(accountData);
|
||||
try {
|
||||
|
||||
@ -2,6 +2,7 @@ import {
|
||||
ExportEnemies,
|
||||
ExportFusionBundles,
|
||||
ExportRegions,
|
||||
ExportRelics,
|
||||
ExportRewards,
|
||||
IMissionReward as IMissionRewardExternal,
|
||||
IRegion,
|
||||
@ -32,6 +33,7 @@ import {
|
||||
addSkin,
|
||||
addStanding,
|
||||
applyClientEquipmentUpdates,
|
||||
checkCalendarChallengeCompletion,
|
||||
combineInventoryChanges,
|
||||
generateRewardSeed,
|
||||
getCalendarProgress,
|
||||
@ -66,7 +68,15 @@ import {
|
||||
} from "@/src/helpers/nemesisHelpers";
|
||||
import { Loadout } from "../models/inventoryModels/loadoutModel";
|
||||
import { ILoadoutConfigDatabase } from "../types/saveLoadoutTypes";
|
||||
import { getLiteSortie, getSortie, idToBountyCycle, idToDay, idToWeek, pushClassicBounties } from "./worldStateService";
|
||||
import {
|
||||
getLiteSortie,
|
||||
getSortie,
|
||||
getWorldState,
|
||||
idToBountyCycle,
|
||||
idToDay,
|
||||
idToWeek,
|
||||
pushClassicBounties
|
||||
} from "./worldStateService";
|
||||
import { config } from "./configService";
|
||||
import libraryDailyTasks from "@/static/fixed_responses/libraryDailyTasks.json";
|
||||
import { ISyndicateMissionInfo } from "../types/worldStateTypes";
|
||||
@ -78,7 +88,7 @@ const getRotations = (rewardInfo: IRewardInfo, tierOverride?: number): number[]
|
||||
if (rewardInfo.VaultsCracked) {
|
||||
const rotations: number[] = [];
|
||||
for (let i = 0; i != rewardInfo.VaultsCracked; ++i) {
|
||||
rotations.push(i);
|
||||
rotations.push(Math.min(i, 2));
|
||||
}
|
||||
return rotations;
|
||||
}
|
||||
@ -258,7 +268,9 @@ export const addMissionInventoryUpdates = async (
|
||||
addMissionComplete(inventory, value);
|
||||
break;
|
||||
case "LastRegionPlayed":
|
||||
inventory.LastRegionPlayed = value;
|
||||
if (!(config.unfaithfulBugFixes?.ignore1999LastRegionPlayed && value === "1999MapName")) {
|
||||
inventory.LastRegionPlayed = value;
|
||||
}
|
||||
break;
|
||||
case "RawUpgrades":
|
||||
addMods(inventory, value);
|
||||
@ -470,7 +482,7 @@ export const addMissionInventoryUpdates = async (
|
||||
msg: "/Lotus/Language/G1Quests/DeathMarkMessage",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Stalker_d.png",
|
||||
highPriority: true,
|
||||
expiry: new Date(Date.now() + 86400_000) // TOVERIFY: This type of inbox message seems to automatically delete itself. We'll just delete it after 24 hours, but it's clear if this is correct.
|
||||
endDate: new Date(Date.now() + 86400_000) // TOVERIFY: This type of inbox message seems to automatically delete itself. We'll just delete it after 24 hours, but it's not clear if this is correct.
|
||||
}
|
||||
]);
|
||||
}
|
||||
@ -619,11 +631,11 @@ export const addMissionInventoryUpdates = async (
|
||||
}
|
||||
case "CalendarProgress": {
|
||||
const calendarProgress = getCalendarProgress(inventory);
|
||||
for (const progress of value) {
|
||||
const challengeName = progress.challenge.substring(progress.challenge.lastIndexOf("/") + 1);
|
||||
calendarProgress.SeasonProgress.LastCompletedChallengeDayIdx++;
|
||||
calendarProgress.SeasonProgress.ActivatedChallenges.push(challengeName);
|
||||
}
|
||||
const currentSeason = getWorldState().KnownCalendarSeasons[0];
|
||||
calendarProgress.SeasonProgress.LastCompletedChallengeDayIdx = currentSeason.Days.findIndex(
|
||||
x => x.events[0].challenge == value[value.length - 1].challenge
|
||||
);
|
||||
checkCalendarChallengeCompletion(calendarProgress, currentSeason);
|
||||
break;
|
||||
}
|
||||
case "duviriCaveOffers": {
|
||||
@ -1204,8 +1216,10 @@ export const addMissionRewards = async (
|
||||
if (syndicateEntry && syndicateEntry.Jobs) {
|
||||
let currentJob = syndicateEntry.Jobs[rewardInfo.JobTier!];
|
||||
if (syndicateEntry.Tag === "EntratiSyndicate") {
|
||||
const vault = syndicateEntry.Jobs.find(j => j.locationTag === locationTag);
|
||||
if (vault) currentJob = vault;
|
||||
if (jobType.endsWith("VaultBounty")) {
|
||||
const vault = syndicateEntry.Jobs.find(j => j.locationTag === locationTag);
|
||||
if (vault) currentJob = vault;
|
||||
}
|
||||
let medallionAmount = Math.floor(currentJob.xpAmounts[rewardInfo.JobStage] / (rewardInfo.Q ? 0.8 : 1));
|
||||
|
||||
if (
|
||||
@ -1364,7 +1378,7 @@ export const addFixedLevelRewards = (
|
||||
if (rewards.countedItems) {
|
||||
for (const item of rewards.countedItems) {
|
||||
MissionRewards.push({
|
||||
StoreItem: `/Lotus/StoreItems${item.ItemType.substring("Lotus/".length)}`,
|
||||
StoreItem: toStoreItem(item.ItemType),
|
||||
ItemCount: item.ItemCount
|
||||
});
|
||||
}
|
||||
@ -1552,8 +1566,10 @@ function getRandomMissionDrops(
|
||||
let job = syndicateEntry.Jobs[RewardInfo.JobTier!];
|
||||
|
||||
if (syndicateEntry.Tag === "EntratiSyndicate") {
|
||||
const vault = syndicateEntry.Jobs.find(j => j.locationTag === locationTag);
|
||||
if (vault && locationTag) job = vault;
|
||||
if (jobType.endsWith("VaultBounty")) {
|
||||
const vault = syndicateEntry.Jobs.find(j => j.locationTag === locationTag);
|
||||
if (vault) job = vault;
|
||||
}
|
||||
// if (
|
||||
// [
|
||||
// "DeimosRuinsExterminateBounty",
|
||||
@ -1623,7 +1639,19 @@ function getRandomMissionDrops(
|
||||
}
|
||||
rewardManifests = [job.rewards];
|
||||
if (job.xpAmounts.length > 1) {
|
||||
rotations = [RewardInfo.JobStage! % (job.xpAmounts.length - 1)];
|
||||
const curentStage = RewardInfo.JobStage! + 1;
|
||||
const totalStage = job.xpAmounts.length;
|
||||
let tableIndex = 1; // Stage 2, Stage 3 of 4, and Stage 3 of 5
|
||||
|
||||
if (curentStage == 1) {
|
||||
tableIndex = 0;
|
||||
} else if (curentStage == totalStage) {
|
||||
tableIndex = 3;
|
||||
} else if (totalStage == 5 && curentStage == 4) {
|
||||
tableIndex = 2;
|
||||
}
|
||||
|
||||
rotations = [tableIndex];
|
||||
} else {
|
||||
rotations = [0];
|
||||
}
|
||||
@ -1632,11 +1660,7 @@ function getRandomMissionDrops(
|
||||
(RewardInfo.JobStage === job.xpAmounts.length - 1 || job.isVault) &&
|
||||
!isEndlessJob
|
||||
) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
||||
if (ExportRewards[job.rewards]) {
|
||||
rewardManifests.push(job.rewards);
|
||||
rotations.push(ExportRewards[job.rewards].length - 1);
|
||||
}
|
||||
rotations.push(3);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1801,6 +1825,23 @@ function getRandomMissionDrops(
|
||||
drops.push({ StoreItem: drop.type, ItemCount: drop.itemCount });
|
||||
}
|
||||
}
|
||||
|
||||
if (config.missionsCanGiveAllRelics) {
|
||||
for (const drop of drops) {
|
||||
const itemType = fromStoreItem(drop.StoreItem);
|
||||
if (itemType in ExportRelics) {
|
||||
const relic = ExportRelics[itemType];
|
||||
const replacement = getRandomElement(
|
||||
Object.entries(ExportRelics).filter(
|
||||
arr => arr[1].era == relic.era && arr[1].quality == relic.quality
|
||||
)
|
||||
)!;
|
||||
logger.debug(`replacing ${relic.era} ${relic.category} with ${replacement[1].category}`);
|
||||
drop.StoreItem = toStoreItem(replacement[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return drops;
|
||||
}
|
||||
|
||||
|
||||
@ -11,9 +11,16 @@ import {
|
||||
import { getRandomWeightedRewardUc } from "@/src/services/rngService";
|
||||
import { applyStandingToVendorManifest, getVendorManifestByOid } from "@/src/services/serversideVendorsService";
|
||||
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||
import { IPurchaseRequest, IPurchaseResponse, SlotPurchase, IInventoryChanges } from "@/src/types/purchaseTypes";
|
||||
import {
|
||||
IPurchaseRequest,
|
||||
IPurchaseResponse,
|
||||
SlotPurchase,
|
||||
IInventoryChanges,
|
||||
PurchaseSource
|
||||
} from "@/src/types/purchaseTypes";
|
||||
import { logger } from "@/src/utils/logger";
|
||||
import worldState from "@/static/fixed_responses/worldState/worldState.json";
|
||||
import { getWorldState } from "./worldStateService";
|
||||
import staticWorldState from "@/static/fixed_responses/worldState/worldState.json";
|
||||
import {
|
||||
ExportBoosterPacks,
|
||||
ExportBoosters,
|
||||
@ -52,7 +59,7 @@ export const handlePurchase = async (
|
||||
|
||||
const prePurchaseInventoryChanges: IInventoryChanges = {};
|
||||
let seed: bigint | undefined;
|
||||
if (purchaseRequest.PurchaseParams.Source == 7) {
|
||||
if (purchaseRequest.PurchaseParams.Source == PurchaseSource.Vendor) {
|
||||
let manifest = getVendorManifestByOid(purchaseRequest.PurchaseParams.SourceId!);
|
||||
if (manifest) {
|
||||
manifest = applyStandingToVendorManifest(inventory, manifest);
|
||||
@ -69,18 +76,12 @@ export const handlePurchase = async (
|
||||
}
|
||||
if (!config.dontSubtractPurchaseCreditCost) {
|
||||
if (offer.RegularPrice) {
|
||||
combineInventoryChanges(
|
||||
prePurchaseInventoryChanges,
|
||||
updateCurrency(inventory, offer.RegularPrice[0], false)
|
||||
);
|
||||
updateCurrency(inventory, offer.RegularPrice[0], false, prePurchaseInventoryChanges);
|
||||
}
|
||||
}
|
||||
if (!config.dontSubtractPurchasePlatinumCost) {
|
||||
if (offer.PremiumPrice) {
|
||||
combineInventoryChanges(
|
||||
prePurchaseInventoryChanges,
|
||||
updateCurrency(inventory, offer.PremiumPrice[0], true)
|
||||
);
|
||||
updateCurrency(inventory, offer.PremiumPrice[0], true, prePurchaseInventoryChanges);
|
||||
}
|
||||
}
|
||||
if (!config.dontSubtractPurchaseItemCost) {
|
||||
@ -166,18 +167,16 @@ export const handlePurchase = async (
|
||||
);
|
||||
combineInventoryChanges(purchaseResponse.InventoryChanges, prePurchaseInventoryChanges);
|
||||
|
||||
const currencyChanges = updateCurrency(
|
||||
updateCurrency(
|
||||
inventory,
|
||||
purchaseRequest.PurchaseParams.ExpectedPrice,
|
||||
purchaseRequest.PurchaseParams.UsePremium
|
||||
purchaseRequest.PurchaseParams.UsePremium,
|
||||
prePurchaseInventoryChanges
|
||||
);
|
||||
purchaseResponse.InventoryChanges = {
|
||||
...currencyChanges,
|
||||
...purchaseResponse.InventoryChanges
|
||||
};
|
||||
|
||||
switch (purchaseRequest.PurchaseParams.Source) {
|
||||
case 1: {
|
||||
case PurchaseSource.VoidTrader: {
|
||||
const worldState = getWorldState();
|
||||
if (purchaseRequest.PurchaseParams.SourceId! != worldState.VoidTraders[0]._id.$oid) {
|
||||
throw new Error("invalid request source");
|
||||
}
|
||||
@ -186,10 +185,7 @@ export const handlePurchase = async (
|
||||
);
|
||||
if (offer) {
|
||||
if (!config.dontSubtractPurchaseCreditCost) {
|
||||
combineInventoryChanges(
|
||||
purchaseResponse.InventoryChanges,
|
||||
updateCurrency(inventory, offer.RegularPrice, false)
|
||||
);
|
||||
updateCurrency(inventory, offer.RegularPrice, false, purchaseResponse.InventoryChanges);
|
||||
}
|
||||
if (purchaseRequest.PurchaseParams.ExpectedPrice) {
|
||||
throw new Error(`vendor purchase should not have an expected price`);
|
||||
@ -207,7 +203,7 @@ export const handlePurchase = async (
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
case PurchaseSource.SyndicateFavor:
|
||||
{
|
||||
const syndicateTag = purchaseRequest.PurchaseParams.SyndicateTag!;
|
||||
if (purchaseRequest.PurchaseParams.UseFreeFavor!) {
|
||||
@ -244,22 +240,16 @@ export const handlePurchase = async (
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
case PurchaseSource.Vendor:
|
||||
if (purchaseRequest.PurchaseParams.SourceId! in ExportVendors) {
|
||||
const vendor = ExportVendors[purchaseRequest.PurchaseParams.SourceId!];
|
||||
const offer = vendor.items.find(x => x.storeItem == purchaseRequest.PurchaseParams.StoreItem);
|
||||
if (offer) {
|
||||
if (typeof offer.credits == "number" && !config.dontSubtractPurchaseCreditCost) {
|
||||
combineInventoryChanges(
|
||||
purchaseResponse.InventoryChanges,
|
||||
updateCurrency(inventory, offer.credits, false)
|
||||
);
|
||||
updateCurrency(inventory, offer.credits, false, purchaseResponse.InventoryChanges);
|
||||
}
|
||||
if (typeof offer.platinum == "number" && !config.dontSubtractPurchasePlatinumCost) {
|
||||
combineInventoryChanges(
|
||||
purchaseResponse.InventoryChanges,
|
||||
updateCurrency(inventory, offer.platinum, true)
|
||||
);
|
||||
updateCurrency(inventory, offer.platinum, true, purchaseResponse.InventoryChanges);
|
||||
}
|
||||
if (offer.itemPrices && !config.dontSubtractPurchaseItemCost) {
|
||||
handleItemPrices(
|
||||
@ -275,15 +265,15 @@ export const handlePurchase = async (
|
||||
throw new Error(`vendor purchase should not have an expected price`);
|
||||
}
|
||||
break;
|
||||
case 18: {
|
||||
if (purchaseRequest.PurchaseParams.SourceId! != worldState.PrimeVaultTraders[0]._id.$oid) {
|
||||
case PurchaseSource.PrimeVaultTrader: {
|
||||
if (purchaseRequest.PurchaseParams.SourceId! != staticWorldState.PrimeVaultTraders[0]._id.$oid) {
|
||||
throw new Error("invalid request source");
|
||||
}
|
||||
const offer =
|
||||
worldState.PrimeVaultTraders[0].Manifest.find(
|
||||
staticWorldState.PrimeVaultTraders[0].Manifest.find(
|
||||
x => x.ItemType == purchaseRequest.PurchaseParams.StoreItem
|
||||
) ??
|
||||
worldState.PrimeVaultTraders[0].EvergreenManifest.find(
|
||||
staticWorldState.PrimeVaultTraders[0].EvergreenManifest.find(
|
||||
x => x.ItemType == purchaseRequest.PurchaseParams.StoreItem
|
||||
);
|
||||
if (offer) {
|
||||
|
||||
@ -1,45 +1,12 @@
|
||||
import { unixTimesInMs } from "@/src/constants/timeConstants";
|
||||
import { isDev } from "@/src/helpers/pathHelper";
|
||||
import { args } from "@/src/helpers/commandLineArguments";
|
||||
import { catBreadHash } from "@/src/helpers/stringHelpers";
|
||||
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
|
||||
import { mixSeeds, SRng } from "@/src/services/rngService";
|
||||
import { IItemManifest, IVendorInfo, IVendorManifest } from "@/src/types/vendorTypes";
|
||||
import { logger } from "@/src/utils/logger";
|
||||
import { ExportVendors, IRange, IVendor, IVendorOffer } from "warframe-public-export-plus";
|
||||
|
||||
import DeimosEntratiFragmentVendorProductsManifest from "@/static/fixed_responses/getVendorInfo/DeimosEntratiFragmentVendorProductsManifest.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 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 MaskSalesmanManifest from "@/static/fixed_responses/getVendorInfo/MaskSalesmanManifest.json";
|
||||
import Nova1999ConquestShopManifest from "@/static/fixed_responses/getVendorInfo/Nova1999ConquestShopManifest.json";
|
||||
import OstronPetVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronPetVendorManifest.json";
|
||||
import SolarisDebtTokenVendorRepossessionsManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorRepossessionsManifest.json";
|
||||
|
||||
const rawVendorManifests: IVendorManifest[] = [
|
||||
DeimosEntratiFragmentVendorProductsManifest,
|
||||
DeimosHivemindCommisionsManifestFishmonger,
|
||||
DeimosHivemindCommisionsManifestPetVendor,
|
||||
DeimosHivemindCommisionsManifestProspector,
|
||||
DeimosHivemindCommisionsManifestTokenVendor,
|
||||
DeimosHivemindCommisionsManifestWeaponsmith,
|
||||
DeimosHivemindTokenVendorManifest,
|
||||
DeimosPetVendorManifest,
|
||||
DuviriAcrithisVendorManifest,
|
||||
EntratiLabsEntratiLabsCommisionsManifest,
|
||||
EntratiLabsEntratiLabVendorManifest,
|
||||
MaskSalesmanManifest,
|
||||
Nova1999ConquestShopManifest,
|
||||
OstronPetVendorManifest,
|
||||
SolarisDebtTokenVendorRepossessionsManifest
|
||||
];
|
||||
import { config } from "./configService";
|
||||
|
||||
interface IGeneratableVendorInfo extends Omit<IVendorInfo, "ItemManifest" | "Expiry"> {
|
||||
cycleOffset?: number;
|
||||
@ -93,49 +60,45 @@ const getCycleDuration = (manifest: IVendor): number => {
|
||||
return dur * unixTimesInMs.hour;
|
||||
};
|
||||
|
||||
export const getVendorManifestByTypeName = (typeName: string): IVendorManifest | undefined => {
|
||||
for (const vendorManifest of rawVendorManifests) {
|
||||
if (vendorManifest.VendorInfo.TypeName == typeName) {
|
||||
return vendorManifest;
|
||||
}
|
||||
}
|
||||
export const getVendorManifestByTypeName = (typeName: string, fullStock?: boolean): IVendorManifest | undefined => {
|
||||
for (const vendorInfo of generatableVendors) {
|
||||
if (vendorInfo.TypeName == typeName) {
|
||||
return generateVendorManifest(vendorInfo);
|
||||
return generateVendorManifest(vendorInfo, fullStock ?? config.fullyStockedVendors);
|
||||
}
|
||||
}
|
||||
if (typeName in ExportVendors) {
|
||||
const manifest = ExportVendors[typeName];
|
||||
return generateVendorManifest({
|
||||
_id: { $oid: getVendorOid(typeName) },
|
||||
TypeName: typeName,
|
||||
RandomSeedType: manifest.randomSeedType,
|
||||
cycleDuration: getCycleDuration(manifest)
|
||||
});
|
||||
return generateVendorManifest(
|
||||
{
|
||||
_id: { $oid: getVendorOid(typeName) },
|
||||
TypeName: typeName,
|
||||
RandomSeedType: manifest.randomSeedType,
|
||||
cycleDuration: getCycleDuration(manifest)
|
||||
},
|
||||
fullStock ?? config.fullyStockedVendors
|
||||
);
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
|
||||
export const getVendorManifestByOid = (oid: string): IVendorManifest | undefined => {
|
||||
for (const vendorManifest of rawVendorManifests) {
|
||||
if (vendorManifest.VendorInfo._id.$oid == oid) {
|
||||
return vendorManifest;
|
||||
}
|
||||
}
|
||||
for (const vendorInfo of generatableVendors) {
|
||||
if (vendorInfo._id.$oid == oid) {
|
||||
return generateVendorManifest(vendorInfo);
|
||||
return generateVendorManifest(vendorInfo, config.fullyStockedVendors);
|
||||
}
|
||||
}
|
||||
for (const [typeName, manifest] of Object.entries(ExportVendors)) {
|
||||
const typeNameOid = getVendorOid(typeName);
|
||||
if (typeNameOid == oid) {
|
||||
return generateVendorManifest({
|
||||
_id: { $oid: typeNameOid },
|
||||
TypeName: typeName,
|
||||
RandomSeedType: manifest.randomSeedType,
|
||||
cycleDuration: getCycleDuration(manifest)
|
||||
});
|
||||
return generateVendorManifest(
|
||||
{
|
||||
_id: { $oid: typeNameOid },
|
||||
TypeName: typeName,
|
||||
RandomSeedType: manifest.randomSeedType,
|
||||
cycleDuration: getCycleDuration(manifest)
|
||||
},
|
||||
config.fullyStockedVendors
|
||||
);
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
@ -213,9 +176,26 @@ const getOfferId = (offer: IVendorOffer | IItemManifest): TOfferId => {
|
||||
}
|
||||
};
|
||||
|
||||
let vendorManifestsUsingFullStock = false;
|
||||
const vendorManifestCache: Record<string, IVendorManifest> = {};
|
||||
|
||||
const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorManifest => {
|
||||
const clearVendorCache = (): void => {
|
||||
for (const k of Object.keys(vendorManifestCache)) {
|
||||
delete vendorManifestCache[k];
|
||||
}
|
||||
};
|
||||
|
||||
const generateVendorManifest = (
|
||||
vendorInfo: IGeneratableVendorInfo,
|
||||
fullStock: boolean | undefined
|
||||
): IVendorManifest => {
|
||||
fullStock ??= config.fullyStockedVendors;
|
||||
fullStock ??= false;
|
||||
if (vendorManifestsUsingFullStock != fullStock) {
|
||||
vendorManifestsUsingFullStock = fullStock;
|
||||
clearVendorCache();
|
||||
}
|
||||
|
||||
if (!(vendorInfo.TypeName in vendorManifestCache)) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const { cycleOffset, cycleDuration, ...clientVendorInfo } = vendorInfo;
|
||||
@ -252,7 +232,20 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
|
||||
const cycleIndex = Math.trunc((now - cycleOffset) / cycleDuration);
|
||||
const rng = new SRng(mixSeeds(vendorSeed, cycleIndex));
|
||||
const offersToAdd: IVendorOffer[] = [];
|
||||
if (!manifest.isOneBinPerCycle) {
|
||||
if (manifest.isOneBinPerCycle) {
|
||||
if (fullStock) {
|
||||
for (const rawItem of manifest.items) {
|
||||
offersToAdd.push(rawItem);
|
||||
}
|
||||
} else {
|
||||
const binThisCycle = cycleIndex % 2; // Note: May want to check the actual number of bins, but this is only used for coda weapons right now.
|
||||
for (const rawItem of manifest.items) {
|
||||
if (rawItem.bin == binThisCycle) {
|
||||
offersToAdd.push(rawItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Compute vendor requirements, subtracting existing offers
|
||||
const remainingItemCapacity: Record<TOfferId, number> = {};
|
||||
const missingItemsPerBin: Record<number, number> = {};
|
||||
@ -277,6 +270,7 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
|
||||
|
||||
// Add permanent offers
|
||||
let numUncountedOffers = 0;
|
||||
let numCountedOffers = 0;
|
||||
let offset = 0;
|
||||
for (const item of manifest.items) {
|
||||
if (item.alwaysOffered || item.rotatedWeekly) {
|
||||
@ -287,22 +281,32 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
|
||||
offersToAdd.push(item);
|
||||
++offset;
|
||||
}
|
||||
} else {
|
||||
numCountedOffers += 1 + item.duplicates;
|
||||
}
|
||||
}
|
||||
|
||||
// Add counted offers
|
||||
const useRng = manifest.numItems && manifest.numItems.minValue != manifest.numItems.maxValue;
|
||||
const numItemsTarget = manifest.numItems
|
||||
? numUncountedOffers +
|
||||
(useRng
|
||||
? rng.randomInt(manifest.numItems.minValue, manifest.numItems.maxValue)
|
||||
: manifest.numItems.minValue)
|
||||
: manifest.items.length;
|
||||
const useRng =
|
||||
manifest.numItems &&
|
||||
(manifest.numItems.minValue != manifest.numItems.maxValue ||
|
||||
manifest.numItems.minValue != numCountedOffers);
|
||||
const numItemsTarget = fullStock
|
||||
? numUncountedOffers + numCountedOffers
|
||||
: manifest.numItems
|
||||
? numUncountedOffers +
|
||||
(useRng
|
||||
? rng.randomInt(manifest.numItems.minValue, manifest.numItems.maxValue)
|
||||
: manifest.numItems.minValue)
|
||||
: manifest.items.length;
|
||||
let i = 0;
|
||||
const rollableOffers = manifest.items.filter(x => x.probability !== undefined) as (Omit<
|
||||
IVendorOffer,
|
||||
"probability"
|
||||
> & { probability: number })[];
|
||||
while (info.ItemManifest.length + offersToAdd.length < numItemsTarget) {
|
||||
const item = useRng ? rng.randomElement(manifest.items)! : manifest.items[i++];
|
||||
const item = useRng ? rng.randomReward(rollableOffers)! : rollableOffers[i++];
|
||||
if (
|
||||
!item.alwaysOffered &&
|
||||
remainingItemCapacity[getOfferId(item)] != 0 &&
|
||||
(numOffersThatNeedToMatchABin == 0 || missingItemsPerBin[item.bin])
|
||||
) {
|
||||
@ -313,17 +317,10 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
|
||||
}
|
||||
offersToAdd.splice(offset, 0, item);
|
||||
}
|
||||
if (i == manifest.items.length) {
|
||||
if (i == rollableOffers.length) {
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
const binThisCycle = cycleIndex % 2; // Note: May want to auto-compute the bin size, but this is only used for coda weapons right now.
|
||||
for (const rawItem of manifest.items) {
|
||||
if (rawItem.bin == binThisCycle) {
|
||||
offersToAdd.push(rawItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
const cycleStart = cycleOffset + cycleIndex * cycleDuration;
|
||||
for (const rawItem of offersToAdd) {
|
||||
@ -351,7 +348,7 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
|
||||
}
|
||||
};
|
||||
if (rawItem.numRandomItemPrices) {
|
||||
item.ItemPrices = [];
|
||||
item.ItemPrices ??= [];
|
||||
for (let i = 0; i != rawItem.numRandomItemPrices; ++i) {
|
||||
let itemPrice: { type: string; count: IRange };
|
||||
do {
|
||||
@ -391,11 +388,13 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
|
||||
info.ItemManifest.push(item);
|
||||
}
|
||||
|
||||
info.ItemManifest.sort((a, b) => {
|
||||
const aBin = parseInt(a.Bin.substring(4));
|
||||
const bBin = parseInt(b.Bin.substring(4));
|
||||
return aBin == bBin ? 0 : aBin < bBin ? +1 : -1;
|
||||
});
|
||||
if (manifest.numItemsPerBin) {
|
||||
info.ItemManifest.sort((a, b) => {
|
||||
const aBin = parseInt(a.Bin.substring(4));
|
||||
const bBin = parseInt(b.Bin.substring(4));
|
||||
return aBin == bBin ? 0 : aBin < bBin ? +1 : -1;
|
||||
});
|
||||
}
|
||||
|
||||
// Update vendor expiry
|
||||
let soonestOfferExpiry: number = Number.MAX_SAFE_INTEGER;
|
||||
@ -412,7 +411,7 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
|
||||
return cacheEntry;
|
||||
};
|
||||
|
||||
if (isDev) {
|
||||
if (args.dev) {
|
||||
if (
|
||||
getCycleDuration(ExportVendors["/Lotus/Types/Game/VendorManifests/Hubs/TeshinHardModeVendorManifest"]) !=
|
||||
unixTimesInMs.week
|
||||
@ -420,34 +419,44 @@ if (isDev) {
|
||||
logger.warn(`getCycleDuration self test failed`);
|
||||
}
|
||||
|
||||
const ads = getVendorManifestByTypeName("/Lotus/Types/Game/VendorManifests/Hubs/GuildAdvertisementVendorManifest")!
|
||||
.VendorInfo.ItemManifest;
|
||||
if (
|
||||
ads.length != 5 ||
|
||||
ads[0].Bin != "BIN_4" ||
|
||||
ads[1].Bin != "BIN_3" ||
|
||||
ads[2].Bin != "BIN_2" ||
|
||||
ads[3].Bin != "BIN_1" ||
|
||||
ads[4].Bin != "BIN_0"
|
||||
) {
|
||||
logger.warn(`self test failed for /Lotus/Types/Game/VendorManifests/Hubs/GuildAdvertisementVendorManifest`);
|
||||
for (let i = 0; i != 2; ++i) {
|
||||
const fullStock = !!i;
|
||||
|
||||
const ads = getVendorManifestByTypeName(
|
||||
"/Lotus/Types/Game/VendorManifests/Hubs/GuildAdvertisementVendorManifest",
|
||||
fullStock
|
||||
)!.VendorInfo.ItemManifest;
|
||||
if (
|
||||
ads.length != 5 ||
|
||||
ads[0].Bin != "BIN_4" ||
|
||||
ads[1].Bin != "BIN_3" ||
|
||||
ads[2].Bin != "BIN_2" ||
|
||||
ads[3].Bin != "BIN_1" ||
|
||||
ads[4].Bin != "BIN_0"
|
||||
) {
|
||||
logger.warn(`self test failed for /Lotus/Types/Game/VendorManifests/Hubs/GuildAdvertisementVendorManifest`);
|
||||
}
|
||||
|
||||
const pall = getVendorManifestByTypeName(
|
||||
"/Lotus/Types/Game/VendorManifests/Hubs/IronwakeDondaVendorManifest",
|
||||
fullStock
|
||||
)!.VendorInfo.ItemManifest;
|
||||
if (
|
||||
pall.length != 5 ||
|
||||
pall[0].StoreItem != "/Lotus/StoreItems/Types/Items/ShipDecos/HarrowQuestKeyOrnament" ||
|
||||
pall[1].StoreItem != "/Lotus/StoreItems/Types/BoosterPacks/RivenModPack" ||
|
||||
pall[2].StoreItem != "/Lotus/StoreItems/Types/StoreItems/CreditBundles/150000Credits" ||
|
||||
pall[3].StoreItem != "/Lotus/StoreItems/Types/Items/MiscItems/Kuva" ||
|
||||
pall[4].StoreItem != "/Lotus/StoreItems/Types/BoosterPacks/RivenModPack"
|
||||
) {
|
||||
logger.warn(`self test failed for /Lotus/Types/Game/VendorManifests/Hubs/IronwakeDondaVendorManifest`);
|
||||
}
|
||||
}
|
||||
|
||||
const pall = getVendorManifestByTypeName("/Lotus/Types/Game/VendorManifests/Hubs/IronwakeDondaVendorManifest")!
|
||||
.VendorInfo.ItemManifest;
|
||||
if (
|
||||
pall.length != 5 ||
|
||||
pall[0].StoreItem != "/Lotus/StoreItems/Types/Items/ShipDecos/HarrowQuestKeyOrnament" ||
|
||||
pall[1].StoreItem != "/Lotus/StoreItems/Types/BoosterPacks/RivenModPack" ||
|
||||
pall[2].StoreItem != "/Lotus/StoreItems/Types/StoreItems/CreditBundles/150000Credits" ||
|
||||
pall[3].StoreItem != "/Lotus/StoreItems/Types/Items/MiscItems/Kuva" ||
|
||||
pall[4].StoreItem != "/Lotus/StoreItems/Types/BoosterPacks/RivenModPack"
|
||||
) {
|
||||
logger.warn(`self test failed for /Lotus/Types/Game/VendorManifests/Hubs/IronwakeDondaVendorManifest`);
|
||||
}
|
||||
|
||||
const cms = getVendorManifestByTypeName("/Lotus/Types/Game/VendorManifests/Hubs/RailjackCrewMemberVendorManifest")!
|
||||
.VendorInfo.ItemManifest;
|
||||
const cms = getVendorManifestByTypeName(
|
||||
"/Lotus/Types/Game/VendorManifests/Hubs/RailjackCrewMemberVendorManifest",
|
||||
false
|
||||
)!.VendorInfo.ItemManifest;
|
||||
if (
|
||||
cms.length != 9 ||
|
||||
cms[0].Bin != "BIN_2" ||
|
||||
@ -459,9 +468,27 @@ if (isDev) {
|
||||
logger.warn(`self test failed for /Lotus/Types/Game/VendorManifests/Hubs/RailjackCrewMemberVendorManifest`);
|
||||
}
|
||||
|
||||
const temple = getVendorManifestByTypeName("/Lotus/Types/Game/VendorManifests/TheHex/Temple1999VendorManifest")!
|
||||
.VendorInfo.ItemManifest;
|
||||
const temple = getVendorManifestByTypeName(
|
||||
"/Lotus/Types/Game/VendorManifests/TheHex/Temple1999VendorManifest",
|
||||
false
|
||||
)!.VendorInfo.ItemManifest;
|
||||
if (!temple.find(x => x.StoreItem == "/Lotus/StoreItems/Types/Items/MiscItems/Kuva")) {
|
||||
logger.warn(`self test failed for /Lotus/Types/Game/VendorManifests/TheHex/Temple1999VendorManifest`);
|
||||
}
|
||||
|
||||
const nakak = getVendorManifestByTypeName("/Lotus/Types/Game/VendorManifests/Ostron/MaskSalesmanManifest", false)!
|
||||
.VendorInfo.ItemManifest;
|
||||
if (
|
||||
nakak.length != 10 ||
|
||||
nakak[0].StoreItem != "/Lotus/StoreItems/Upgrades/Skins/Ostron/RevenantMask" ||
|
||||
nakak[1].StoreItem != "/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyThumper" ||
|
||||
nakak[1].ItemPrices?.length != 4 ||
|
||||
nakak[2].StoreItem != "/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyThumperMedium" ||
|
||||
nakak[2].ItemPrices?.length != 4 ||
|
||||
nakak[3].StoreItem != "/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyThumperLarge" ||
|
||||
nakak[3].ItemPrices?.length != 4
|
||||
// The remaining offers should be computed by weighted RNG.
|
||||
) {
|
||||
logger.warn(`self test failed for /Lotus/Types/Game/VendorManifests/Ostron/MaskSalesmanManifest`);
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,9 +5,17 @@ import { config } from "./configService";
|
||||
import { logger } from "../utils/logger";
|
||||
import { app } from "../app";
|
||||
import { AddressInfo } from "node:net";
|
||||
import ws from "ws";
|
||||
import { Account } from "../models/loginModel";
|
||||
import { createAccount, createNonce, getUsernameFromEmail, isCorrectPassword } from "./loginService";
|
||||
import { IDatabaseAccountJson } from "../types/loginTypes";
|
||||
import { HydratedDocument } from "mongoose";
|
||||
import { Agent, WebSocket as UnidiciWebSocket } from "undici";
|
||||
|
||||
let httpServer: http.Server | undefined;
|
||||
let httpsServer: https.Server | undefined;
|
||||
let wsServer: ws.Server | undefined;
|
||||
let wssServer: ws.Server | undefined;
|
||||
|
||||
const tlsOptions = {
|
||||
key: fs.readFileSync("static/certs/key.pem"),
|
||||
@ -21,19 +29,65 @@ export const startWebServer = (): void => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||
httpServer = http.createServer(app);
|
||||
httpServer.listen(httpPort, () => {
|
||||
wsServer = new ws.Server({ server: httpServer });
|
||||
wsServer.on("connection", wsOnConnect);
|
||||
|
||||
logger.info("HTTP server started on port " + httpPort);
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||
httpsServer = https.createServer(tlsOptions, app);
|
||||
httpsServer.listen(httpsPort, () => {
|
||||
wssServer = new ws.Server({ server: httpsServer });
|
||||
wssServer.on("connection", wsOnConnect);
|
||||
|
||||
logger.info("HTTPS server started on port " + httpsPort);
|
||||
|
||||
logger.info(
|
||||
"Access the WebUI in your browser at http://localhost" + (httpPort == 80 ? "" : ":" + httpPort)
|
||||
);
|
||||
|
||||
void runWsSelfTest("wss", httpsPort).then(ok => {
|
||||
if (!ok) {
|
||||
logger.warn(`WSS self-test failed. The server may not actually be reachable at port ${httpsPort}.`);
|
||||
if (process.platform == "win32") {
|
||||
logger.warn(
|
||||
`You can check who actually has that port via powershell: Get-Process -Id (Get-NetTCPConnection -LocalPort ${httpsPort}).OwningProcess`
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const runWsSelfTest = (protocol: "ws" | "wss", port: number): Promise<boolean> => {
|
||||
return new Promise(resolve => {
|
||||
// https://github.com/oven-sh/bun/issues/20547
|
||||
if (process.versions.bun) {
|
||||
const client = new WebSocket(`${protocol}://localhost:${port}/custom/selftest`, {
|
||||
tls: { rejectUnauthorized: false }
|
||||
} as unknown as string);
|
||||
client.onmessage = (e): void => {
|
||||
resolve(e.data == "SpaceNinjaServer");
|
||||
};
|
||||
client.onerror = client.onclose = (): void => {
|
||||
resolve(false);
|
||||
};
|
||||
} else {
|
||||
const agent = new Agent({ connect: { rejectUnauthorized: false } });
|
||||
const client = new UnidiciWebSocket(`${protocol}://localhost:${port}/custom/selftest`, {
|
||||
dispatcher: agent
|
||||
});
|
||||
client.onmessage = (e): void => {
|
||||
resolve(e.data == "SpaceNinjaServer");
|
||||
};
|
||||
client.onerror = client.onclose = (): void => {
|
||||
resolve(false);
|
||||
};
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export const getWebPorts = (): Record<"http" | "https", number | undefined> => {
|
||||
return {
|
||||
http: (httpServer?.address() as AddressInfo | undefined)?.port,
|
||||
@ -61,5 +115,156 @@ export const stopWebServer = async (): Promise<void> => {
|
||||
})
|
||||
);
|
||||
}
|
||||
if (wsServer) {
|
||||
promises.push(
|
||||
new Promise(resolve => {
|
||||
wsServer!.close(() => {
|
||||
resolve();
|
||||
});
|
||||
})
|
||||
);
|
||||
}
|
||||
if (wssServer) {
|
||||
promises.push(
|
||||
new Promise(resolve => {
|
||||
wssServer!.close(() => {
|
||||
resolve();
|
||||
});
|
||||
})
|
||||
);
|
||||
}
|
||||
await Promise.all(promises);
|
||||
};
|
||||
|
||||
interface IWsCustomData extends ws {
|
||||
accountId?: string;
|
||||
}
|
||||
|
||||
interface IWsMsgFromClient {
|
||||
auth?: {
|
||||
email: string;
|
||||
password: string;
|
||||
isRegister: boolean;
|
||||
};
|
||||
logout?: boolean;
|
||||
}
|
||||
|
||||
interface IWsMsgToClient {
|
||||
reload?: boolean;
|
||||
ports?: {
|
||||
http: number | undefined;
|
||||
https: number | undefined;
|
||||
};
|
||||
config_reloaded?: boolean;
|
||||
auth_succ?: {
|
||||
id: string;
|
||||
DisplayName: string;
|
||||
Nonce: number;
|
||||
};
|
||||
auth_fail?: {
|
||||
isRegister: boolean;
|
||||
};
|
||||
logged_out?: boolean;
|
||||
update_inventory?: boolean;
|
||||
}
|
||||
|
||||
const wsOnConnect = (ws: ws, req: http.IncomingMessage): void => {
|
||||
if (req.url == "/custom/selftest") {
|
||||
ws.send("SpaceNinjaServer");
|
||||
ws.close();
|
||||
return;
|
||||
}
|
||||
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||
ws.on("message", async msg => {
|
||||
const data = JSON.parse(String(msg)) as IWsMsgFromClient;
|
||||
if (data.auth) {
|
||||
let account: IDatabaseAccountJson | null = await Account.findOne({ email: data.auth.email });
|
||||
if (account) {
|
||||
if (isCorrectPassword(data.auth.password, account.password)) {
|
||||
if (!account.Nonce) {
|
||||
account.ClientType = "webui";
|
||||
account.Nonce = createNonce();
|
||||
await (account as HydratedDocument<IDatabaseAccountJson>).save();
|
||||
}
|
||||
} else {
|
||||
account = null;
|
||||
}
|
||||
} else if (data.auth.isRegister) {
|
||||
const name = await getUsernameFromEmail(data.auth.email);
|
||||
account = await createAccount({
|
||||
email: data.auth.email,
|
||||
password: data.auth.password,
|
||||
ClientType: "webui",
|
||||
LastLogin: new Date(),
|
||||
DisplayName: name,
|
||||
Nonce: createNonce()
|
||||
});
|
||||
}
|
||||
if (account) {
|
||||
(ws as IWsCustomData).accountId = account.id;
|
||||
ws.send(
|
||||
JSON.stringify({
|
||||
auth_succ: {
|
||||
id: account.id,
|
||||
DisplayName: account.DisplayName,
|
||||
Nonce: account.Nonce
|
||||
}
|
||||
} satisfies IWsMsgToClient)
|
||||
);
|
||||
} else {
|
||||
ws.send(
|
||||
JSON.stringify({
|
||||
auth_fail: {
|
||||
isRegister: data.auth.isRegister
|
||||
}
|
||||
} satisfies IWsMsgToClient)
|
||||
);
|
||||
}
|
||||
}
|
||||
if (data.logout) {
|
||||
const accountId = (ws as IWsCustomData).accountId;
|
||||
(ws as IWsCustomData).accountId = undefined;
|
||||
await Account.updateOne(
|
||||
{
|
||||
_id: accountId,
|
||||
ClientType: "webui"
|
||||
},
|
||||
{
|
||||
Nonce: 0
|
||||
}
|
||||
);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export const sendWsBroadcast = (data: IWsMsgToClient): void => {
|
||||
const msg = JSON.stringify(data);
|
||||
if (wsServer) {
|
||||
for (const client of wsServer.clients) {
|
||||
client.send(msg);
|
||||
}
|
||||
}
|
||||
if (wssServer) {
|
||||
for (const client of wssServer.clients) {
|
||||
client.send(msg);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const sendWsBroadcastTo = (accountId: string, data: IWsMsgToClient): void => {
|
||||
const msg = JSON.stringify(data);
|
||||
if (wsServer) {
|
||||
for (const client of wsServer.clients) {
|
||||
if ((client as IWsCustomData).accountId == accountId) {
|
||||
client.send(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (wssServer) {
|
||||
for (const client of wssServer.clients) {
|
||||
if ((client as IWsCustomData).accountId == accountId) {
|
||||
client.send(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@ -1,12 +1,14 @@
|
||||
import staticWorldState from "@/static/fixed_responses/worldState/worldState.json";
|
||||
import baro from "@/static/fixed_responses/worldState/baro.json";
|
||||
import fissureMissions from "@/static/fixed_responses/worldState/fissureMissions.json";
|
||||
import sortieTilesets from "@/static/fixed_responses/worldState/sortieTilesets.json";
|
||||
import sortieTilesetMissions from "@/static/fixed_responses/worldState/sortieTilesetMissions.json";
|
||||
import syndicateMissions from "@/static/fixed_responses/worldState/syndicateMissions.json";
|
||||
import { buildConfig } from "@/src/services/buildConfigService";
|
||||
import { unixTimesInMs } from "@/src/constants/timeConstants";
|
||||
import { config } from "@/src/services/configService";
|
||||
import { SRng } from "@/src/services/rngService";
|
||||
import { ExportRegions, ExportSyndicates, IRegion } from "warframe-public-export-plus";
|
||||
import { getRandomElement, getRandomInt, SRng } from "@/src/services/rngService";
|
||||
import { eMissionType, ExportRegions, ExportSyndicates, IRegion } from "warframe-public-export-plus";
|
||||
import {
|
||||
ICalendarDay,
|
||||
ICalendarEvent,
|
||||
@ -18,11 +20,14 @@ import {
|
||||
ISyndicateMissionInfo,
|
||||
ITmp,
|
||||
IVoidStorm,
|
||||
IVoidTrader,
|
||||
IVoidTraderOffer,
|
||||
IWorldState,
|
||||
TCircuitGameMode
|
||||
} from "../types/worldStateTypes";
|
||||
import { version_compare } from "../helpers/inventoryHelpers";
|
||||
import { toMongoDate, toOid, version_compare } from "../helpers/inventoryHelpers";
|
||||
import { logger } from "../utils/logger";
|
||||
import { Fissure } from "../models/worldStateModel";
|
||||
|
||||
const sortieBosses = [
|
||||
"SORTIE_BOSS_HYENA",
|
||||
@ -1110,7 +1115,9 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
Alerts: [],
|
||||
Sorties: [],
|
||||
LiteSorties: [],
|
||||
ActiveMissions: [],
|
||||
GlobalUpgrades: [],
|
||||
VoidTraders: [],
|
||||
VoidStorms: [],
|
||||
EndlessXpChoices: [],
|
||||
KnownCalendarSeasons: [],
|
||||
@ -1118,13 +1125,9 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
SyndicateMissions: [...staticWorldState.SyndicateMissions]
|
||||
};
|
||||
|
||||
// Omit void fissures for versions prior to Dante Unbound to avoid script errors.
|
||||
if (buildLabel && version_compare(buildLabel, "2024.03.24.20.00") < 0) {
|
||||
worldState.ActiveMissions = [];
|
||||
if (version_compare(buildLabel, "2017.10.12.17.04") < 0) {
|
||||
// Old versions seem to really get hung up on not being able to load these.
|
||||
worldState.PVPChallengeInstances = [];
|
||||
}
|
||||
// Old versions seem to really get hung up on not being able to load these.
|
||||
if (buildLabel && version_compare(buildLabel, "2017.10.12.17.04") < 0) {
|
||||
worldState.PVPChallengeInstances = [];
|
||||
}
|
||||
|
||||
if (config.worldState?.starDays) {
|
||||
@ -1243,6 +1246,77 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
});
|
||||
}
|
||||
|
||||
// Baro
|
||||
{
|
||||
const baroIndex = Math.trunc((Date.now() - 910800000) / (unixTimesInMs.day * 14));
|
||||
const baroStart = baroIndex * (unixTimesInMs.day * 14) + 910800000;
|
||||
const baroActualStart = baroStart + unixTimesInMs.day * (config.baroAlwaysAvailable ? 0 : 12);
|
||||
const baroEnd = baroStart + unixTimesInMs.day * 14;
|
||||
const baroNode = ["EarthHUB", "MercuryHUB", "SaturnHUB", "PlutoHUB"][baroIndex % 4];
|
||||
const vt: IVoidTrader = {
|
||||
_id: { $oid: ((baroStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "493c96d6067610bc" },
|
||||
Activation: { $date: { $numberLong: baroActualStart.toString() } },
|
||||
Expiry: { $date: { $numberLong: baroEnd.toString() } },
|
||||
Character: "Baro'Ki Teel",
|
||||
Node: baroNode,
|
||||
Manifest: []
|
||||
};
|
||||
worldState.VoidTraders.push(vt);
|
||||
if (isBeforeNextExpectedWorldStateRefresh(timeMs, baroActualStart)) {
|
||||
vt.Manifest = [];
|
||||
if (config.baroFullyStocked) {
|
||||
for (const armorSet of baro.armorSets) {
|
||||
if (Array.isArray(armorSet[0])) {
|
||||
for (const set of armorSet as IVoidTraderOffer[][]) {
|
||||
for (const item of set) {
|
||||
vt.Manifest.push(item);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (const item of armorSet as IVoidTraderOffer[]) {
|
||||
vt.Manifest.push(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (const item of baro.rest) {
|
||||
vt.Manifest.push(item);
|
||||
}
|
||||
} else {
|
||||
const rng = new SRng(new SRng(baroIndex).randomInt(0, 100_000));
|
||||
// TOVERIFY: Constraint for upgrades amount?
|
||||
// TOVERIFY: Constraint for weapon amount?
|
||||
// TOVERIFY: Constraint for relics amount?
|
||||
let armorSet = rng.randomElement(baro.armorSets)!;
|
||||
if (Array.isArray(armorSet[0])) {
|
||||
armorSet = rng.randomElement(baro.armorSets)!;
|
||||
}
|
||||
while (vt.Manifest.length + armorSet.length < 31) {
|
||||
const item = rng.randomElement(baro.rest)!;
|
||||
if (vt.Manifest.indexOf(item) == -1) {
|
||||
const set = baro.allIfAny.find(set => set.indexOf(item.ItemType) != -1);
|
||||
if (set) {
|
||||
for (const itemType of set) {
|
||||
vt.Manifest.push(baro.rest.find(x => x.ItemType == itemType)!);
|
||||
}
|
||||
} else {
|
||||
vt.Manifest.push(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
const overflow = 31 - (vt.Manifest.length + armorSet.length);
|
||||
if (overflow > 0) {
|
||||
vt.Manifest.splice(0, overflow);
|
||||
}
|
||||
for (const armor of armorSet) {
|
||||
vt.Manifest.push(armor as IVoidTraderOffer);
|
||||
}
|
||||
}
|
||||
for (const item of baro.evergreen) {
|
||||
vt.Manifest.push(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Sortie & syndicate missions cycling every day (at 16:00 or 17:00 UTC depending on if London, OT is observing DST)
|
||||
{
|
||||
const rollover = getSortieTime(day);
|
||||
@ -1326,6 +1400,17 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
const cheeseInterval = hourInSeconds * 8;
|
||||
const cheeseDuration = hourInSeconds * 2;
|
||||
const cheeseIndex = Math.trunc(timeSecs / cheeseInterval);
|
||||
let cheeseStart = cheeseIndex * cheeseInterval;
|
||||
let cheeseEnd = cheeseStart + cheeseDuration;
|
||||
let cheeseNext = (cheeseIndex + 1) * cheeseInterval;
|
||||
// Live servers only update the start time once it happens, which makes the
|
||||
// client show a negative countdown during off-hours. Optionally adjust the
|
||||
// times so the next activation is always in the future.
|
||||
if (config.unfaithfulBugFixes?.fixXtraCheeseTimer && timeSecs >= cheeseEnd) {
|
||||
cheeseStart = cheeseNext;
|
||||
cheeseEnd = cheeseStart + cheeseDuration;
|
||||
cheeseNext += cheeseInterval;
|
||||
}
|
||||
const tmp: ITmp = {
|
||||
cavabegin: "1690761600",
|
||||
PurchasePlatformLockEnabled: true,
|
||||
@ -1350,9 +1435,9 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
ennnd: true,
|
||||
mbrt: true,
|
||||
fbst: {
|
||||
a: cheeseIndex * cheeseInterval, // This has a bug where the client shows a negative time for "Xtra cheese starts in ..." until it refreshes the world state. This is because we're only providing the new activation as soon as that time/date is reached. However, this is 100% faithful to live.
|
||||
e: cheeseIndex * cheeseInterval + cheeseDuration,
|
||||
n: (cheeseIndex + 1) * cheeseInterval
|
||||
a: cheeseStart,
|
||||
e: cheeseEnd,
|
||||
n: cheeseNext
|
||||
},
|
||||
sfn: [550, 553, 554, 555][halfHour % 4]
|
||||
};
|
||||
@ -1364,6 +1449,24 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
return worldState;
|
||||
};
|
||||
|
||||
export const populateFissures = async (worldState: IWorldState): Promise<void> => {
|
||||
const fissures = await Fissure.find({});
|
||||
for (const fissure of fissures) {
|
||||
const meta = ExportRegions[fissure.Node];
|
||||
worldState.ActiveMissions.push({
|
||||
_id: toOid(fissure._id),
|
||||
Region: meta.systemIndex + 1,
|
||||
Seed: 1337,
|
||||
Activation: toMongoDate(fissure.Activation),
|
||||
Expiry: toMongoDate(fissure.Expiry),
|
||||
Node: fissure.Node,
|
||||
MissionType: eMissionType[meta.missionIndex].tag,
|
||||
Modifier: fissure.Modifier,
|
||||
Hard: fissure.Hard
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const idToBountyCycle = (id: string): number => {
|
||||
return Math.trunc((parseInt(id.substring(0, 8), 16) * 1000) / 9000_000);
|
||||
};
|
||||
@ -1491,3 +1594,57 @@ const nightwaveTagToSeason: Record<string, number> = {
|
||||
RadioLegionIntermissionSyndicate: 1, // Intermission I
|
||||
RadioLegionSyndicate: 0 // The Wolf of Saturn Six
|
||||
};
|
||||
|
||||
export const updateWorldStateCollections = async (): Promise<void> => {
|
||||
const fissures = await Fissure.find();
|
||||
|
||||
const activeNodes = new Set<string>();
|
||||
const tierToFurthestExpiry: Record<string, number> = {
|
||||
VoidT1: 0,
|
||||
VoidT2: 0,
|
||||
VoidT3: 0,
|
||||
VoidT4: 0,
|
||||
VoidT5: 0,
|
||||
VoidT6: 0,
|
||||
VoidT1Hard: 0,
|
||||
VoidT2Hard: 0,
|
||||
VoidT3Hard: 0,
|
||||
VoidT4Hard: 0,
|
||||
VoidT5Hard: 0,
|
||||
VoidT6Hard: 0
|
||||
};
|
||||
for (const fissure of fissures) {
|
||||
activeNodes.add(fissure.Node);
|
||||
|
||||
const key = fissure.Modifier + (fissure.Hard ? "Hard" : "");
|
||||
tierToFurthestExpiry[key] = Math.max(tierToFurthestExpiry[key], fissure.Expiry.getTime());
|
||||
}
|
||||
|
||||
const deadline = Date.now() - 6 * unixTimesInMs.minute;
|
||||
for (const [tier, expiry] of Object.entries(tierToFurthestExpiry)) {
|
||||
if (expiry < deadline) {
|
||||
const numFissures = getRandomInt(1, 3);
|
||||
for (let i = 0; i != numFissures; ++i) {
|
||||
const modifier = tier.replace("Hard", "") as
|
||||
| "VoidT1"
|
||||
| "VoidT2"
|
||||
| "VoidT3"
|
||||
| "VoidT4"
|
||||
| "VoidT5"
|
||||
| "VoidT6";
|
||||
let node: string;
|
||||
do {
|
||||
node = getRandomElement(fissureMissions[modifier])!;
|
||||
} while (activeNodes.has(node));
|
||||
activeNodes.add(node);
|
||||
await Fissure.insertOne({
|
||||
Activation: new Date(),
|
||||
Expiry: new Date(Date.now() + getRandomInt(60, 120) * unixTimesInMs.minute),
|
||||
Node: node,
|
||||
Modifier: modifier,
|
||||
Hard: tier.indexOf("Hard") != -1 ? true : undefined
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@ -2,7 +2,7 @@ import { Types } from "mongoose";
|
||||
|
||||
export interface IAccountAndLoginResponseCommons {
|
||||
DisplayName: string;
|
||||
CountryCode: string;
|
||||
CountryCode?: string;
|
||||
ClientType?: string;
|
||||
CrossPlatformAllowed?: boolean;
|
||||
ForceLogoutVersion?: number;
|
||||
|
||||
@ -10,14 +10,42 @@ import {
|
||||
ICrewMemberClient
|
||||
} from "./inventoryTypes/inventoryTypes";
|
||||
|
||||
export enum PurchaseSource {
|
||||
Market = 0,
|
||||
VoidTrader = 1,
|
||||
SyndicateFavor = 2,
|
||||
DailyDeal = 3,
|
||||
Arsenal = 4,
|
||||
Profile = 5,
|
||||
Hub = 6,
|
||||
Vendor = 7,
|
||||
AppearancePreview = 8,
|
||||
Museum = 9,
|
||||
Operator = 10,
|
||||
PlayerShip = 11,
|
||||
Crewship = 12,
|
||||
MenuStyle = 13,
|
||||
MenuHud = 14,
|
||||
Chat = 15,
|
||||
Inventory = 16,
|
||||
StarChart = 17,
|
||||
PrimeVaultTrader = 18,
|
||||
Incubator = 19,
|
||||
Prompt = 20,
|
||||
Kaithe = 21,
|
||||
DuviriWeapon = 22,
|
||||
UpdateScreen = 23,
|
||||
Motorcycle = 24
|
||||
}
|
||||
|
||||
export interface IPurchaseRequest {
|
||||
PurchaseParams: IPurchaseParams;
|
||||
buildLabel: string;
|
||||
}
|
||||
|
||||
export interface IPurchaseParams {
|
||||
Source: number;
|
||||
SourceId?: string; // for Source 1, 7 & 18
|
||||
Source: PurchaseSource;
|
||||
SourceId?: string; // VoidTrader, Vendor, PrimeVaultTrader
|
||||
StoreItem: string;
|
||||
StorePage: string;
|
||||
SearchTerm: string;
|
||||
@ -25,10 +53,10 @@ export interface IPurchaseParams {
|
||||
Quantity: number;
|
||||
UsePremium: boolean;
|
||||
ExpectedPrice: number;
|
||||
SyndicateTag?: string; // for Source 2
|
||||
UseFreeFavor?: boolean; // for Source 2
|
||||
ExtraPurchaseInfoJson?: string; // for Source 7
|
||||
IsWeekly?: boolean; // for Source 7
|
||||
SyndicateTag?: string; // SyndicateFavor
|
||||
UseFreeFavor?: boolean; // SyndicateFavor
|
||||
ExtraPurchaseInfoJson?: string; // Vendor
|
||||
IsWeekly?: boolean; // Vendor
|
||||
}
|
||||
|
||||
export type IInventoryChanges = {
|
||||
|
||||
@ -9,9 +9,10 @@ export interface IWorldState {
|
||||
Sorties: ISortie[];
|
||||
LiteSorties: ILiteSortie[];
|
||||
SyndicateMissions: ISyndicateMissionInfo[];
|
||||
GlobalUpgrades: IGlobalUpgrade[];
|
||||
ActiveMissions: IFissure[];
|
||||
GlobalUpgrades: IGlobalUpgrade[];
|
||||
NodeOverrides: INodeOverride[];
|
||||
VoidTraders: IVoidTrader[];
|
||||
VoidStorms: IVoidStorm[];
|
||||
PVPChallengeInstances: IPVPChallengeInstance[];
|
||||
EndlessXpChoices: IEndlessXpChoice[];
|
||||
@ -86,6 +87,14 @@ export interface IFissure {
|
||||
Hard?: boolean;
|
||||
}
|
||||
|
||||
export interface IFissureDatabase {
|
||||
Activation: Date;
|
||||
Expiry: Date;
|
||||
Node: string;
|
||||
Modifier: "VoidT1" | "VoidT2" | "VoidT3" | "VoidT4" | "VoidT5" | "VoidT6";
|
||||
Hard?: boolean;
|
||||
}
|
||||
|
||||
export interface INodeOverride {
|
||||
_id: IOid;
|
||||
Activation?: IMongoDate;
|
||||
@ -132,6 +141,21 @@ export interface ILiteSortie {
|
||||
}[];
|
||||
}
|
||||
|
||||
export interface IVoidTrader {
|
||||
_id: IOid;
|
||||
Activation: IMongoDate;
|
||||
Expiry: IMongoDate;
|
||||
Character: string;
|
||||
Node: string;
|
||||
Manifest: IVoidTraderOffer[];
|
||||
}
|
||||
|
||||
export interface IVoidTraderOffer {
|
||||
ItemType: string;
|
||||
PrimePrice: number;
|
||||
RegularPrice: number;
|
||||
}
|
||||
|
||||
export interface IVoidStorm {
|
||||
_id: IOid;
|
||||
Node: string;
|
||||
|
||||
@ -1,12 +0,0 @@
|
||||
{
|
||||
"Messages": [
|
||||
{
|
||||
"sub": "Welcome to Space Ninja Server",
|
||||
"sndr": "/Lotus/Language/Bosses/Ordis",
|
||||
"msg": "Enjoy your Space Ninja Experience",
|
||||
"icon": "/Lotus/Interface/Icons/Npcs/Ordis.png",
|
||||
"eventMessageDate": "2025-01-30T13:00:00.000Z",
|
||||
"r": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -1,300 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "5f456e01c96976e97d6b802e"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/Deimos/EntratiFragmentVendorProductsManifest",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Deimos/SeriglassShard",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 20,
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentRareA",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e8390"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/PhotoboothTileDeimosBouncy",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 50,
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentRareA",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e8391"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/PhotoboothTileDeimosBreakthrough",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 50,
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentRareA",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e8392"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/PhotoboothTileDeimosCatacombs",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 50,
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentRareA",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e8393"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/PhotoboothTileDeimosDownfall",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 50,
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentRareA",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e8394"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/PhotoboothTileDeimosObsession",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 50,
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentRareA",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e8395"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/PhotoboothTileDeimosTunnels",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 50,
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentRareA",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e8396"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Deimos/FatherTokenShipDeco",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 10,
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentUncommonA",
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemCount": 5,
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentRareA",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e83f1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Deimos/LisetPropEntratiLamp",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentCommonB",
|
||||
"ItemCount": 12,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e83f2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Deimos/LisetPropInfestedCrate",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentCommonA",
|
||||
"ItemCount": 11,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e83f3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Deimos/LisetPropInfestedCystC",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentRareA",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_2",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e83f4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/RequiemRisGlyph",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 15,
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentRareA",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e83f5"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Deimos/MotherTokenShipDeco",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 10,
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentUncommonB",
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemCount": 5,
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentRareA",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e83f6"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "DB953EE163A65B3BCC0552902321D791",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,241 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "5f456e01c96976e97d6b8009"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/Deimos/HivemindCommisionsManifestFishmonger",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Daughter/DaughterTaskC",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishFPartItem",
|
||||
"ItemCount": 6,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishCPartItem",
|
||||
"ItemCount": 16,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_2",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 63978959,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e82cc"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Daughter/DaughterTaskB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishBPartItem",
|
||||
"ItemCount": 5,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishDPartItem",
|
||||
"ItemCount": 4,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 3808064409,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e82cd"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Daughter/DaughterTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishEPartItem",
|
||||
"ItemCount": 2,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishCPartItem",
|
||||
"ItemCount": 2,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 3849710569,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e82d0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Daughter/DaughterTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosGenericInfestedFishPartItem",
|
||||
"ItemCount": 5,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishCPartItem",
|
||||
"ItemCount": 4,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 1687111317,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e82d1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Daughter/DaughterTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishAPartItem",
|
||||
"ItemCount": 4,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishBPartItem",
|
||||
"ItemCount": 4,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2267414276,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e82d2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Daughter/DaughterTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosGenericInfestedFishPartItem",
|
||||
"ItemCount": 6,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosGenericSharedFishPartItem",
|
||||
"ItemCount": 6,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 1497494256,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e82d3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Daughter/DaughterTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosGenericInfestedFishPartItem",
|
||||
"ItemCount": 5,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishCPartItem",
|
||||
"ItemCount": 2,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2883527039,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e82d4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Daughter/DaughterTaskC",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishGPartItem",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishCPartItem",
|
||||
"ItemCount": 12,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_2",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 4116691539,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e82d5"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "54B6992C6314367F8EEA74B7F1A1C352",
|
||||
"RandomSeedType": "VRST_FLAVOUR_TEXT",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,287 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "5f456e03c96976e97d6b80a3"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/Deimos/HivemindCommisionsManifestPetVendor",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Son/SonTaskB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedMaggotRare",
|
||||
"ItemCount": 2,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedMaggotCommon",
|
||||
"ItemCount": 4,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2707699975,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e8897"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Son/SonTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedPredatorCommon",
|
||||
"ItemCount": 2,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedMaggotCommon",
|
||||
"ItemCount": 4,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 3610714639,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e8898"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Son/SonTaskB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedPredatorCommon",
|
||||
"ItemCount": 2,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedMaggotRare",
|
||||
"ItemCount": 1,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 1782149988,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e8899"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Son/SonTaskC",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedMergooCommon",
|
||||
"ItemCount": 3,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_2",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2149416825,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e889a"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Son/SonTaskB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedCritterRare",
|
||||
"ItemCount": 2,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedKdriveUncommon",
|
||||
"ItemCount": 2,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 890863265,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e889b"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Son/SonTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedCritterCommon",
|
||||
"ItemCount": 4,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedPredatorCommon",
|
||||
"ItemCount": 4,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2507606934,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e889c"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Son/SonTaskC",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedPredatorRare",
|
||||
"ItemCount": 5,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_2",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 1037784729,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e889e"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Son/SonTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedMaggotCommon",
|
||||
"ItemCount": 4,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedCritterCommon",
|
||||
"ItemCount": 4,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2048707501,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e889f"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Son/SonTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedKdriveRare",
|
||||
"ItemCount": 2,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedPredatorCommon",
|
||||
"ItemCount": 2,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 4038149313,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e88a0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Son/SonTaskD",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedMergooCommon",
|
||||
"ItemCount": 3,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/AnimalTagInfestedPredatorRare",
|
||||
"ItemCount": 3,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_3",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2155290001,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e88a1"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "61E66B4E9E5A121DD06A476AE2A81B24",
|
||||
"RandomSeedType": "VRST_FLAVOUR_TEXT",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,312 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "5f456e01c96976e97d6b7ff1"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/Deimos/HivemindCommisionsManifestProspector",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Otak/OtakTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonOreAItem",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonGemBItem",
|
||||
"ItemCount": 8,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 1370972414,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e8ef8"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Otak/OtakTaskC",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonOreBItem",
|
||||
"ItemCount": 20,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosUncommonGemAItem",
|
||||
"ItemCount": 8,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosUncommonOreAItem",
|
||||
"ItemCount": 20,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_2",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2361790143,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e8ef9"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Otak/OtakTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonGemAItem",
|
||||
"ItemCount": 6,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonOreAItem",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 472210739,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e8efb"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Otak/OtakTaskB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonOreBItem",
|
||||
"ItemCount": 12,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonOreAItem",
|
||||
"ItemCount": 15,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 3072462886,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e8efd"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Otak/OtakTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonGemAItem",
|
||||
"ItemCount": 8,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonOreAItem",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 767765909,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e8efe"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Otak/OtakTaskD",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosEidolonGemAItem",
|
||||
"ItemCount": 5,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosEidolonGemBItem",
|
||||
"ItemCount": 2,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosRareOreAItem",
|
||||
"ItemCount": 22,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_3",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 512512880,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e8eff"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Otak/OtakTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonOreAItem",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonGemAItem",
|
||||
"ItemCount": 6,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2037734419,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e8f00"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Otak/OtakTaskB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosUncommonOreAItem",
|
||||
"ItemCount": 13,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonOreAItem",
|
||||
"ItemCount": 8,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 1433662587,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e8f01"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Otak/OtakTaskB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonOreAItem",
|
||||
"ItemCount": 12,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonGemAItem",
|
||||
"ItemCount": 8,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 1618492734,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e8f02"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Otak/OtakTaskD",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosUncommonGemAItem",
|
||||
"ItemCount": 7,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonGemBItem",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosRareOreAItem",
|
||||
"ItemCount": 12,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_3",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 4032699594,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e8f03"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "0AC3C284471037011B36EC51238D13A9",
|
||||
"RandomSeedType": "VRST_FLAVOUR_TEXT",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,223 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "5f456e03c96976e97d6b80d2"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/Deimos/HivemindCommisionsManifestTokenVendor",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Grandmother/GrandmotherTaskD",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentCommonC",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentCommonA",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentUncommonB",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentUncommonA",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 1415858946,
|
||||
"Id": {
|
||||
"$oid": "670a47b1872b2325705e746c"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Grandmother/GrandmotherTaskD",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentCommonB",
|
||||
"ItemCount": 2,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentUncommonA",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentCommonA",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentUncommonB",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 3178511462,
|
||||
"Id": {
|
||||
"$oid": "670a47b1872b2325705e746e"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Grandmother/GrandmotherTaskB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentUncommonA",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentCommonC",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 3313207881,
|
||||
"Id": {
|
||||
"$oid": "670a47b1872b2325705e7471"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Grandmother/GrandmotherTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentCommonB",
|
||||
"ItemCount": 2,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2241288767,
|
||||
"Id": {
|
||||
"$oid": "670a47b1872b2325705e7472"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Grandmother/GrandmotherTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentUncommonB",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 3395082536,
|
||||
"Id": {
|
||||
"$oid": "670a47b1872b2325705e7473"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Grandmother/GrandmotherTaskB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentCommonC",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentUncommonB",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 493457277,
|
||||
"Id": {
|
||||
"$oid": "670a47b1872b2325705e7474"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Grandmother/GrandmotherTaskB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentUncommonB",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Deimos/EntratiFragmentCommonB",
|
||||
"ItemCount": 2,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 4225814786,
|
||||
"Id": {
|
||||
"$oid": "670a47b1872b2325705e7475"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "58884EC7ECE7D22AD4BD9E9B436C37A8",
|
||||
"RandomSeedType": "VRST_FLAVOUR_TEXT",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,254 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "5f456e02c96976e97d6b8049"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/Deimos/HivemindCommisionsManifestWeaponsmith",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Father/FatherTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Resources/InfGorgaricusSeedItem",
|
||||
"ItemCount": 16,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2438288725,
|
||||
"Id": {
|
||||
"$oid": "66fd60b00ba592c4c95e7caf"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Father/FatherTaskC",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Game/FishBait/Infested/OrokinFishBaitA",
|
||||
"ItemCount": 6,
|
||||
"ProductCategory": "Consumables"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Resources/InfMapricoFruitItem",
|
||||
"ItemCount": 21,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Game/FishBait/Infested/InfestedFishBaitA",
|
||||
"ItemCount": 6,
|
||||
"ProductCategory": "Consumables"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_2",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2431016296,
|
||||
"Id": {
|
||||
"$oid": "66fd60b00ba592c4c95e7cb2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Father/FatherTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Resources/InfMapricoFruitItem",
|
||||
"ItemCount": 16,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 18484856,
|
||||
"Id": {
|
||||
"$oid": "66fd60b00ba592c4c95e7cb3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Father/FatherTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Resources/InfMapricoFruitItem",
|
||||
"ItemCount": 14,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2278976516,
|
||||
"Id": {
|
||||
"$oid": "66fd60b00ba592c4c95e7cb4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Father/FatherTaskC",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Game/FishBait/Infested/OrokinFishBaitA",
|
||||
"ItemCount": 7,
|
||||
"ProductCategory": "Consumables"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Resources/OrbStoneItem",
|
||||
"ItemCount": 25,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Game/FishBait/Infested/InfestedFishBaitA",
|
||||
"ItemCount": 6,
|
||||
"ProductCategory": "Consumables"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_2",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 3150323898,
|
||||
"Id": {
|
||||
"$oid": "66fd60b00ba592c4c95e7cb5"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Father/FatherTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Resources/InfMapricoFruitItem",
|
||||
"ItemCount": 8,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 3971758486,
|
||||
"Id": {
|
||||
"$oid": "66fd60b00ba592c4c95e7cb6"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Father/FatherTaskB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Resources/InfGorgaricusSeedItem",
|
||||
"ItemCount": 17,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Resources/OrbStoneItem",
|
||||
"ItemCount": 18,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2512835718,
|
||||
"Id": {
|
||||
"$oid": "66fd60b00ba592c4c95e7cb7"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Father/FatherTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Resources/OrbStoneItem",
|
||||
"ItemCount": 8,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 825411410,
|
||||
"Id": {
|
||||
"$oid": "66fd60b00ba592c4c95e7cb8"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Father/FatherTaskB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Resources/InfGorgaricusSeedItem",
|
||||
"ItemCount": 22,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Resources/OrbStoneItem",
|
||||
"ItemCount": 12,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2383349671,
|
||||
"Id": {
|
||||
"$oid": "66fd60b00ba592c4c95e7cb9"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "CE9413585756FA39B793A9814E74E49F",
|
||||
"RandomSeedType": "VRST_FLAVOUR_TEXT",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,286 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "5fb70313c96976e97d6be6fe"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/Deimos/HivemindTokenVendorManifest",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Remedies/RemedySonB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishBPartItem",
|
||||
"ItemCount": 36,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishCPartItem",
|
||||
"ItemCount": 20,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishEPartItem",
|
||||
"ItemCount": 36,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_2",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 379215713,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9308"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Remedies/RemedyMotherB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosGenericInfestedFishPartItem",
|
||||
"ItemCount": 80,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Resources/InfGorgaricusSeedItem",
|
||||
"ItemCount": 32,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishCPartItem",
|
||||
"ItemCount": 28,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2534781881,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9309"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Remedies/RemedyDaughterB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosUncommonGemAItem",
|
||||
"ItemCount": 28,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishCPartItem",
|
||||
"ItemCount": 32,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishAPartItem",
|
||||
"ItemCount": 32,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 1507786123,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e930a"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Remedies/RemedySonA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosRareGemAItem",
|
||||
"ItemCount": 15,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonGemAItem",
|
||||
"ItemCount": 30,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Resources/InfGorgaricusSeedItem",
|
||||
"ItemCount": 21,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 616241643,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e930b"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Remedies/RemedyOtakA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishBPartItem",
|
||||
"ItemCount": 21,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishCPartItem",
|
||||
"ItemCount": 27,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishEPartItem",
|
||||
"ItemCount": 27,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2888479655,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e930c"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Remedies/RemedyGrandmotherA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonGemBItem",
|
||||
"ItemCount": 20,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishBPartItem",
|
||||
"ItemCount": 28,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Resources/InfGorgaricusSeedItem",
|
||||
"ItemCount": 24,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosCommonGemAItem",
|
||||
"ItemCount": 20,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2874726481,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e930d"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Remedies/RemedyFatherA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosGenericSharedFishPartItem",
|
||||
"ItemCount": 75,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Deimos/DeimosUncommonGemAItem",
|
||||
"ItemCount": 27,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Resources/OrbStoneItem",
|
||||
"ItemCount": 30,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 274676857,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e930e"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/Deimos/Remedies/RemedyDaughterA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/InfestedMicroplanet/Resources/InfGorgaricusSeedItem",
|
||||
"ItemCount": 24,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishBPartItem",
|
||||
"ItemCount": 30,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Deimos/FishParts/DeimosGenericSharedFishPartItem",
|
||||
"ItemCount": 51,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"LocTagRandSeed": 2487943761,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e930f"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "C34BF0BEDEAF7CBB0EEBFFECDFD6646D",
|
||||
"RandomSeedType": "VRST_FLAVOUR_TEXT",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,136 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "5f456e02c96976e97d6b8080"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/Deimos/PetVendorManifest",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Deimos/AnimalTagInfestedNexiferaRare",
|
||||
"PremiumPrice": [35, 35],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 5,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e89f6"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Deimos/AnimalTagInfestedNexiferaUncommon",
|
||||
"PremiumPrice": [22, 22],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 5,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e89f7"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Deimos/AnimalTagInfestedMergooUncommon",
|
||||
"PremiumPrice": [28, 28],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 5,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e89f8"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Deimos/AnimalTagInfestedKdriveUncommon",
|
||||
"PremiumPrice": [25, 25],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 5,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e89f9"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Deimos/AnimalTagInfestedZongroCommon",
|
||||
"PremiumPrice": [14, 14],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 5,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e89fa"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Deimos/AnimalTagInfestedPredatorCommon",
|
||||
"PremiumPrice": [12, 12],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 5,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e89fb"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Deimos/AnimalTagInfestedMergooCommon",
|
||||
"PremiumPrice": [13, 13],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 5,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e89fc"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Deimos/AnimalTagInfestedKdriveCommon",
|
||||
"PremiumPrice": [14, 14],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 5,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b10ba592c4c95e89fd"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "F14C6B6A61D7585A10537995661F5220",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,321 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "64493ca759e9b164c86a2e14"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/Duviri/AcrithisVendorManifest",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/DangerRoom/DangerRoomTileDuviriDragonArena",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Duviri/Resource/DuviriDragonDropItem",
|
||||
"ItemCount": 20,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_5",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b00ba592c4c95e7d88"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Recipes/Components/FormaBlueprint",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Duviri/Resource/DuviriDragonDropItem",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_2",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "66fd60b00ba592c4c95e7deb"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/UtilityUnlocker",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Duviri/Resource/DuviriDragonDropItem",
|
||||
"ItemCount": 20,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_2",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "66fd60b00ba592c4c95e7dec"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/Kuva",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Duviri/Resource/DuviriDragonDropItem",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_2",
|
||||
"QuantityMultiplier": 5000,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "66fd60b00ba592c4c95e7ded"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/WeaponUtilityUnlocker",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Duviri/Resource/DuviriDragonDropItem",
|
||||
"ItemCount": 20,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_2",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "66fd60b00ba592c4c95e7dee"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/Kuva",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Duviri/Resource/DuviriDragonDropItem",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_2",
|
||||
"QuantityMultiplier": 5000,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "670c5e12576f461f1e5e739c"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/Plastids",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Duviri/Resource/DuviriPlantItemD",
|
||||
"ItemCount": 40,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6710c312fa0b2c5cd85e73c3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Duviri/DUVxPlanterHangingPot",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Duviri/Resource/DuviriPlantItemE",
|
||||
"ItemCount": 51,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6710c312fa0b2c5cd85e73c6"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Duviri/DUVxPlanterPotB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Duviri/Resource/DuviriRockItem",
|
||||
"ItemCount": 44,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6710c312fa0b2c5cd85e73c7"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/NeuralSensor",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Duviri/Resource/DuviriPlantItemA",
|
||||
"ItemCount": 52,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 3,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6710c312fa0b2c5cd85e73c8"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/ControlModule",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Duviri/Resource/DuviriPlantItemF",
|
||||
"ItemCount": 42,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 3,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6710c312fa0b2c5cd85e73c9"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/PhotoboothTileDuviriArenaOpera",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Duviri/Resource/DuviriProcessedItem",
|
||||
"ItemCount": 240,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "66fd60b00ba592c4c95e7ddd"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Upgrades/CosmeticEnhancers/Utility/HealthWhileUsingChanneledAbilities",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Duviri/Resource/DuviriDragonDropItem",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_3",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "66fd60b00ba592c4c95e7e01"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Upgrades/Boons/DuviriVendorBoonItem",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Duviri/Resource/DuviriPlantItemG",
|
||||
"ItemCount": 50,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_4",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6711a412ba1ba01e405e739c"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "9EE40048EB685549ACA3D01AB1F65BF2",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,245 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "6579d82b553a20c6fc0067ca"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/EntratiLabs/EntratiLabVendorManifest",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalAmar",
|
||||
"Bin": "BIN_3",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"RotatedWeekly": true,
|
||||
"Affiliation": "EntratiLabSyndicate",
|
||||
"MinAffiliationRank": 5,
|
||||
"ReductionPerPositiveRank": 0,
|
||||
"IncreasePerNegativeRank": 0,
|
||||
"StandingCost": 30000,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e920d"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalBoreal",
|
||||
"Bin": "BIN_3",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"RotatedWeekly": true,
|
||||
"Affiliation": "EntratiLabSyndicate",
|
||||
"MinAffiliationRank": 5,
|
||||
"ReductionPerPositiveRank": 0,
|
||||
"IncreasePerNegativeRank": 0,
|
||||
"StandingCost": 30000,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e920e"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalNira",
|
||||
"Bin": "BIN_3",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"RotatedWeekly": true,
|
||||
"Affiliation": "EntratiLabSyndicate",
|
||||
"MinAffiliationRank": 5,
|
||||
"ReductionPerPositiveRank": 0,
|
||||
"IncreasePerNegativeRank": 0,
|
||||
"StandingCost": 30000,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e920f"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/EntratiLabs/ORKxLabStool",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/EntratiLabDogTagUncommon",
|
||||
"ItemCount": 2,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/EntratiLabMiscItemA",
|
||||
"ItemCount": 22,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/MurmurItem",
|
||||
"ItemCount": 18,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9270"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/EntratiLabs/ORKxLabChairA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/MurmurItem",
|
||||
"ItemCount": 15,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/EntratiLabMiscItemA",
|
||||
"ItemCount": 19,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/EntratiLabMiscItemB",
|
||||
"ItemCount": 19,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9271"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/EntratiLabs/ORKxLabLightWallCandleA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/MurmurItem",
|
||||
"ItemCount": 12,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/EntratiLabDogTagCommon",
|
||||
"ItemCount": 3,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9272"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/EntratiLabs/ORKxLabLightChandelierD",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/EntratiLabMiscItemB",
|
||||
"ItemCount": 8,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/EntratiLabDogTagCommon",
|
||||
"ItemCount": 3,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9273"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/EntratiLabs/ORKxLabLightChandelierB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/EntratiLabMiscItemA",
|
||||
"ItemCount": 12,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/EntratiLabDogTagCommon",
|
||||
"ItemCount": 2,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9274"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/EntratiLabs/ORKxLabLightChandelierA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/MurmurItem",
|
||||
"ItemCount": 15,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/EntratiLabMiscItemA",
|
||||
"ItemCount": 13,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9275"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "44DA3839E6F7BDB32ACED53F2B0BE14E",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,97 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "6579d82b553a20c6fc0067ae"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/EntratiLabs/EntratiLabsCommisionsManifest",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/EntratiLabs/LoidTaskC",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/EntratiLabMiscItemB",
|
||||
"ItemCount": 17,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/MurmurItem",
|
||||
"ItemCount": 30,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_2",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "670a2b928ac7854ac55e73d3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/EntratiLabs/LoidTaskB",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/MurmurItem",
|
||||
"ItemCount": 20,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/EntratiLabMiscItemA",
|
||||
"ItemCount": 228,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "670a2b928ac7854ac55e73d4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/Tasks/EntratiLabs/LoidTaskA",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/EntratiLab/Resources/MurmurItem",
|
||||
"ItemCount": 15,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Zariman/Resources/ZarimanMiscItemB",
|
||||
"ItemCount": 1,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "670a2b928ac7854ac55e73d5"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "60C4D85A8DE5E6538AD23CDDFEEF0422",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,301 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "598a090d9a4a313746fd1f24"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/Ostron/MaskSalesmanManifest",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Upgrades/Skins/Ostron/RevenantMask",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 1,
|
||||
"ItemType": "/Lotus/Types/Gameplay/Eidolon/Resources/CetusWispItem",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "63ed01ef4c37f93d0b797674"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyThumper",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 2,
|
||||
"ItemType": "/Lotus/Types/Gameplay/Eidolon/Resources/CetusWispItem",
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Eidolon/FishParts/BothUncommonFishBPartItem",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Eidolon/Resources/NistlebrushItem",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Eidolon/CommonOreAAlloyAItem",
|
||||
"ItemCount": 32,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "63ed01ef4c37f93d0b797675"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyThumperMedium",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 4,
|
||||
"ItemType": "/Lotus/Types/Gameplay/Eidolon/Resources/CetusWispItem",
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Eidolon/CommonGemBCutAItem",
|
||||
"ItemCount": 24,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Eidolon/FishParts/BothUncommonFishAPartItem",
|
||||
"ItemCount": 18,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Eidolon/FishParts/BothUncommonFishBPartItem",
|
||||
"ItemCount": 27,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "63ed01ef4c37f93d0b797676"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyThumperLarge",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 6,
|
||||
"ItemType": "/Lotus/Types/Gameplay/Eidolon/Resources/CetusWispItem",
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Eidolon/CommonGemACutAItem",
|
||||
"ItemCount": 35,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Eidolon/FishParts/BothCommonFishAPartItem",
|
||||
"ItemCount": 95,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Eidolon/Resources/NistlebrushItem",
|
||||
"ItemCount": 60,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "63ed01ef4c37f93d0b797677"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Recipes/SynthicatorRecipes/FlareBlueBlueprint",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Eidolon/FishParts/BothUncommonFishBPartItem",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Eidolon/FishParts/DayCommonFishCPartItem",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6651291214e90115b91b50a1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Recipes/SynthicatorRecipes/FlareRedBlueprint",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Eidolon/CommonOreAAlloyAItem",
|
||||
"ItemCount": 37,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Eidolon/FishParts/BothUncommonFishAPartItem",
|
||||
"ItemCount": 7,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6651291214e90115b91b50a2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Upgrades/Skins/Ostron/VoltMask",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Eidolon/CommonOreBAlloyBItem",
|
||||
"ItemCount": 34,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Eidolon/Resources/GrokdrulItem",
|
||||
"ItemCount": 17,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6651291214e90115b91b50a3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Upgrades/Skins/Ostron/MagMask",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Eidolon/FishParts/DayCommonFishBPartItem",
|
||||
"ItemCount": 16,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Eidolon/Resources/ForestRodentPartItem",
|
||||
"ItemCount": 5,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6651291214e90115b91b50a4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Upgrades/Skins/Ostron/ExcaliburMask",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Eidolon/Resources/BirdOfPreyPartItem",
|
||||
"ItemCount": 5,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Gameplay/Eidolon/Resources/GrokdrulItem",
|
||||
"ItemCount": 20,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6651291214e90115b91b50a5"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Upgrades/Skins/Ostron/GrineerMask",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Eidolon/FishParts/DayCommonFishBPartItem",
|
||||
"ItemCount": 20,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Eidolon/CommonOreAAlloyAItem",
|
||||
"ItemCount": 31,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6651291214e90115b91b50a6"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "6AACA376DA34B35B5C16F1B40DBC017D",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,188 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "67dadc30e4b6e0e5979c8d6a"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/TheHex/Nova1999ConquestShopManifest",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/BoosterPacks/1999StickersPackEchoesArchimedea",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 10,
|
||||
"ItemType": "/Lotus/Types/Items/MiscItems/1999ConquestBucks",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "2051240400000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "67db32b983b2ad79a9c1c18c"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/BoosterPacks/1999StickersPackEchoesArchimedeaFree",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 1,
|
||||
"ItemType": "/Lotus/Types/Items/MiscItems/1999FreeStickersPack",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "2051240400000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "67db32b983b2ad79a9c1c18d"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/BoosterPacks/1999StickersPackEchoesArchimedeaFixed",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 1,
|
||||
"ItemType": "/Lotus/Types/Items/MiscItems/1999FixedStickersPack",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "2051240400000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "67db32b983b2ad79a9c1c18e"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/SyndicateVosforPack",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 6,
|
||||
"ItemType": "/Lotus/Types/Items/MiscItems/1999ConquestBucks",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "2051240400000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "67db32b983b2ad79a9c1c18f"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/StickerPictureFrame",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 10,
|
||||
"ItemType": "/Lotus/Types/Items/MiscItems/1999ConquestBucks",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "2051240400000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "67db32b983b2ad79a9c1c190"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Upgrades/CosmeticEnhancers/Utility/AbilityRadiationProcsCreateUniversalOrbsOnKill",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 5,
|
||||
"ItemType": "/Lotus/Types/Items/MiscItems/1999ConquestBucks",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "2051240400000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "67db32b983b2ad79a9c1c191"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Upgrades/CosmeticEnhancers/Offensive/AbilityHeatProcsGiveCritChance",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 5,
|
||||
"ItemType": "/Lotus/Types/Items/MiscItems/1999ConquestBucks",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "2051240400000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "67db32b983b2ad79a9c1c192"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Upgrades/CosmeticEnhancers/Defensive/InvulnerabilityOnDeathOnMercyKill",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemCount": 5,
|
||||
"ItemType": "/Lotus/Types/Items/MiscItems/1999ConquestBucks",
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "2051240400000"
|
||||
}
|
||||
},
|
||||
"PurchaseQuantityLimit": 1,
|
||||
"AllowMultipurchase": false,
|
||||
"Id": {
|
||||
"$oid": "67db32b983b2ad79a9c1c193"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "CB7D0E807FD5E2BCD059195201D963B9",
|
||||
"RequiredGoalTag": "",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "2051240400000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,94 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "5991d5e6bcc718474ee90c15"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/Ostron/PetVendorManifest",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/LisetPropOstBirdCage",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Eidolon/UncommonOreAAlloyAItem",
|
||||
"ItemCount": 10,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Eidolon/FishParts/DayUncommonFishBPartItem",
|
||||
"ItemCount": 8,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9a8e"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/KubrowColorPackDrahk",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Eidolon/FishParts/DayCommonFishBPartItem",
|
||||
"ItemCount": 14,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Eidolon/FishParts/BothCommonFishBPartItem",
|
||||
"ItemCount": 13,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9a8f"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/Types/StoreItems/Packages/KubrowColorPackFeral",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Fish/Eidolon/FishParts/BothCommonFishAPartItem",
|
||||
"ItemCount": 19,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Gems/Eidolon/CommonOreBAlloyBItem",
|
||||
"ItemCount": 34,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9a90"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "3D85F1A0A2B62734AE90370DEC214C26",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,126 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "5be4a159b144f3cdf1c22edf"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/Solaris/DebtTokenVendorRepossessionsManifest",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Venus/SUToolBox",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Solaris/DebtTokenB",
|
||||
"ItemCount": 6,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6711a412ba1ba01e405e739d"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Venus/SUBookAOpen",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Solaris/DebtTokenC",
|
||||
"ItemCount": 6,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6711a412ba1ba01e405e739e"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Venus/SUFoodCans",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Solaris/DebtTokenC",
|
||||
"ItemCount": 7,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6711a412ba1ba01e405e739f"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Venus/SUTechToolD",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Solaris/DebtTokenD",
|
||||
"ItemCount": 5,
|
||||
"ProductCategory": "MiscItems"
|
||||
},
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Solaris/DebtTokenA",
|
||||
"ItemCount": 15,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6711a412ba1ba01e405e73a0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Venus/SUContainerCrate",
|
||||
"ItemPrices": [
|
||||
{
|
||||
"ItemType": "/Lotus/Types/Items/Solaris/DebtTokenA",
|
||||
"ItemCount": 9,
|
||||
"ProductCategory": "MiscItems"
|
||||
}
|
||||
],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 1,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "6711a412ba1ba01e405e73a1"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "E0E83157D73468DC578403CB9EBA9DA6",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
413
static/fixed_responses/worldState/baro.json
Normal file
413
static/fixed_responses/worldState/baro.json
Normal file
@ -0,0 +1,413 @@
|
||||
{
|
||||
"evergreen": [
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Keys/MummyQuestKeyBlueprint", "PrimePrice": 100, "RegularPrice": 25000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Effects/FootstepsMaple", "PrimePrice": 15, "RegularPrice": 1000 }
|
||||
],
|
||||
"armorSets": [
|
||||
[
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/BaroArmour/BaroArmourA", "PrimePrice": 350, "RegularPrice": 110000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/BaroArmour/BaroArmourC", "PrimePrice": 150, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/BaroArmour/BaroArmourL", "PrimePrice": 300, "RegularPrice": 150000 }
|
||||
],
|
||||
[
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/BaroArmourTwo/BaroArmourTwoA", "PrimePrice": 310, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/BaroArmourTwo/BaroArmourTwoC", "PrimePrice": 175, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/BaroArmourTwo/BaroArmourTwoL", "PrimePrice": 225, "RegularPrice": 150000 }
|
||||
],
|
||||
[
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/BaroArmourThree/BaroArmourThreeA", "PrimePrice": 400, "RegularPrice": 350000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/BaroArmourThree/BaroArmourThreeC", "PrimePrice": 350, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/BaroArmourThree/BaroArmourThreeL", "PrimePrice": 400, "RegularPrice": 350000 }
|
||||
],
|
||||
[
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/FurisArmor/PrismaFurisAArmor", "PrimePrice": 300, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/FurisArmor/PrismaFurisCArmor", "PrimePrice": 250, "RegularPrice": 220000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/FurisArmor/PrismaFurisLArmor", "PrimePrice": 225, "RegularPrice": 175000 }
|
||||
],
|
||||
[
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/GrineerTurbines/WraithTurbinesArmArmor", "PrimePrice": 350, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/GrineerTurbines/WraithTurbinesChestArmor", "PrimePrice": 300, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/GrineerTurbines/WraithTurbinesLegArmor", "PrimePrice": 350, "RegularPrice": 150000 }
|
||||
],
|
||||
[
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/NecraArmor/NecraArmorA", "PrimePrice": 315, "RegularPrice": 215000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/NecraArmor/NecraArmorC", "PrimePrice": 325, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/NecraArmor/NecraArmorL", "PrimePrice": 300, "RegularPrice": 200000 }
|
||||
],
|
||||
[
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/SetThreeWinged/VTSetThreeArmLeftArmor", "PrimePrice": 65, "RegularPrice": 75000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/SetThreeWinged/VTSetThreeArmRightArmor", "PrimePrice": 65, "RegularPrice": 75000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/SetThreeWinged/VTSetThreeChestArmor", "PrimePrice": 150, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/SetThreeWinged/VTSetThreeLegLeftArmor", "PrimePrice": 65, "RegularPrice": 75000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/SetThreeWinged/VTSetThreeLegRightArmor", "PrimePrice": 65, "RegularPrice": 75000 }
|
||||
],
|
||||
[
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/SetTwoSamurai/VTSetTwoArmLeftArmor", "PrimePrice": 100, "RegularPrice": 55000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/SetTwoSamurai/VTSetTwoArmRightArmor", "PrimePrice": 100, "RegularPrice": 55000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/SetTwoSamurai/VTSetTwoChestArmor", "PrimePrice": 225, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/SetTwoSamurai/VTSetTwoLegLeftArmor", "PrimePrice": 100, "RegularPrice": 55000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/SetTwoSamurai/VTSetTwoLegRightArmor", "PrimePrice": 100, "RegularPrice": 55000 }
|
||||
],
|
||||
[
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/TnLatronArmor/TnLatronArmArmorElixis", "PrimePrice": 325, "RegularPrice": 220000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/TnLatronArmor/TnLatronArmArmorPrisma", "PrimePrice": 325, "RegularPrice": 220000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/TnLatronArmor/TnLatronChestArmorElixis", "PrimePrice": 275, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/TnLatronArmor/TnLatronChestArmorPrisma", "PrimePrice": 275, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/TnLatronArmor/TnLatronLegArmorElixis", "PrimePrice": 300, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/TnLatronArmor/TnLatronLegArmorPrisma", "PrimePrice": 300, "RegularPrice": 175000 }
|
||||
],
|
||||
[
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/TnShinaiArmor/TnShinaiArmorA", "PrimePrice": 315, "RegularPrice": 125000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/TnShinaiArmor/TnShinaiArmorC", "PrimePrice": 300, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/TnShinaiArmor/TnShinaiArmorL", "PrimePrice": 275, "RegularPrice": 115000 }
|
||||
],
|
||||
[
|
||||
[{ "ItemType": "/Lotus/Types/StoreItems/Packages/VTEosArmourBundle", "PrimePrice": 285, "RegularPrice": 260000 }],
|
||||
[
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/VTEos/VTEosALArmor", "PrimePrice": 50, "RegularPrice": 75000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/VTEos/VTEosARArmor", "PrimePrice": 50, "RegularPrice": 75000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/VTEos/VTEosChestArmor", "PrimePrice": 125, "RegularPrice": 75000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/VTEos/VTEosLLArmor", "PrimePrice": 65, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/VTEos/VTEosLRArmor", "PrimePrice": 65, "RegularPrice": 50000 }
|
||||
]
|
||||
]
|
||||
],
|
||||
"rest": [
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Armor/Halloween2014Wings/PrismaNaberusArmArmor", "PrimePrice": 220, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/TennoCon2024GlyphAlt", "PrimePrice": 15, "RegularPrice": 1000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/Emotes/Tennocon2024EmoteAlt", "PrimePrice": 15, "RegularPrice": 1000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/HeartOfDeimosAlbumCoverPoster", "PrimePrice": 80, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardTennoConC", "PrimePrice": 75, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardTennoConJ", "PrimePrice": 75, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardTennoConH", "PrimePrice": 75, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Game/Projections/T3VoidProjectionVoltOdonataPrimeBronze", "PrimePrice": 125, "RegularPrice": 55000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Game/Projections/T4VoidProjectionVoltOdonataPrimeBronze", "PrimePrice": 125, "RegularPrice": 55000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Game/Projections/T4VoidProjectionMagNovaVaultBBronze", "PrimePrice": 125, "RegularPrice": 55000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/SolsticeNelumboCape", "PrimePrice": 325, "RegularPrice": 275000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/SummerSolstice/SummerSolsticeTwinGrakatas", "PrimePrice": 300, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Weapons/Staff/TnRibbonStaffSkin", "PrimePrice": 350, "RegularPrice": 275000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Grineer/Melee/GunBlade/GrnGunBlade/GrnGunblade", "PrimePrice": 550, "RegularPrice": 325000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Corpus/LongGuns/CrpBFG/Vandal/VandalCrpBFG", "PrimePrice": 650, "RegularPrice": 550000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/Event/AmbulasEvent/Expert/SecondaryExplosionRadiusModExpert", "PrimePrice": 350, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Clan/Dragon2024BadgeItem", "PrimePrice": 55, "RegularPrice": 45000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Archwing/Rifle/PrimedArchwingDamageOnReloadMod", "PrimePrice": 375, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Archwing/Rifle/PrimedArchwingRifleFireIterationsMod", "PrimePrice": 400, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageBaruukDoanStyle", "PrimePrice": 75, "RegularPrice": 60000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/OctaviaBobbleHead", "PrimePrice": 50, "RegularPrice": 275000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sentinels/Skins/GaussSentinelSkin", "PrimePrice": 500, "RegularPrice": 425000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sigils/PrismaLotusVinesSigil", "PrimePrice": 55, "RegularPrice": 60000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageExcaliburActionProto", "PrimePrice": 75, "RegularPrice": 60000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageIvaraAction", "PrimePrice": 75, "RegularPrice": 60000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/HornSkullScarf", "PrimePrice": 325, "RegularPrice": 350000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sigils/RhinoDeluxeSigil", "PrimePrice": 45, "RegularPrice": 55000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Events/InfQuantaInfestedAladV", "PrimePrice": 325, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/JavisExperimentsPosterD", "PrimePrice": 90, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/JavisExperimentsPosterB", "PrimePrice": 90, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/JavisExperimentsPosterC", "PrimePrice": 90, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/Expert/PrimedWeaponElectricityDamageMod", "PrimePrice": 350, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/Expert/AvatarShieldMaxModExpert", "PrimePrice": 350, "RegularPrice": 225000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/JavisExperimentsPosterA", "PrimePrice": 90, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sigils/EventSigilScarletSpear", "PrimePrice": 45, "RegularPrice": 45000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Grineer/LongGuns/GrnOrokinRifle/GrnOrokinRifleWeapon", "PrimePrice": 675, "RegularPrice": 625000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/VoidTrader/ElixisNikana", "PrimePrice": 375, "RegularPrice": 275000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sentinels/Wings/GaussSentinelWings", "PrimePrice": 400, "RegularPrice": 500000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sentinels/Tails/GaussSentinelTail", "PrimePrice": 400, "RegularPrice": 500000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sentinels/Masks/GaussSentinelMask", "PrimePrice": 450, "RegularPrice": 400000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/LisetPropGrineerCutter", "PrimePrice": 100, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Clan/CNY2023EmblemItem", "PrimePrice": 55, "RegularPrice": 45000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sigils/WeGameNewYearFreeTigerSigil", "PrimePrice": 55, "RegularPrice": 45000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Clan/CNY2022EmblemItem", "PrimePrice": 55, "RegularPrice": 45000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/Leverian/IvaraLeverianPovisRecordsDecoration", "PrimePrice": 75, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Operator/Hoods/HoodDuviriOperator", "PrimePrice": 550, "RegularPrice": 500000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Corpus/Melee/CrpTonfa/CrpPrismaTonfa", "PrimePrice": 450, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/LisetPropCleaningDroneDuviri", "PrimePrice": 800, "RegularPrice": 650000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Operator/Accessories/AshLevarianTiara", "PrimePrice": 550, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Effects/BaroEphemeraB", "PrimePrice": 250, "RegularPrice": 350000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Promo/Warframe/PromoParis", "PrimePrice": 315, "RegularPrice": 275000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sigils/ThraxSigil", "PrimePrice": 50, "RegularPrice": 55000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Corpus/Bow/Longbow/PrismaLenz/PrismaLenzWeapon", "PrimePrice": 575, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/Vignettes/Warframes/ArchwingAFItem", "PrimePrice": 100, "RegularPrice": 330000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Game/QuartersWallpapers/LavosAlchemistWallpaper", "PrimePrice": 275, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/GrendelOrokinDishSet", "PrimePrice": 110, "RegularPrice": 130000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/ColourPickerKiteerItemB", "PrimePrice": 200, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/NezhaEtchingsTablets", "PrimePrice": 100, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/GaussTowerOfAltraDeco", "PrimePrice": 110, "RegularPrice": 125000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/BaroPlanter", "PrimePrice": 125, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/BaroPedestal", "PrimePrice": 150, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Operator/Leggings/LeggingsNovaEngineer", "PrimePrice": 300, "RegularPrice": 275000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Operator/BodySuits/BodySuitNovaEngineer", "PrimePrice": 300, "RegularPrice": 275000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Operator/Sleeves/SleevesNovaEngineer", "PrimePrice": 300, "RegularPrice": 275000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Operator/Hoods/HoodNovaEngineer", "PrimePrice": 350, "RegularPrice": 375000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/BekranZaftBucketBroom", "PrimePrice": 100, "RegularPrice": 125000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Melee/Warfan/TnMoonWarfan/MoonWarfanWeapon", "PrimePrice": 410, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/MeleeDangles/MoonWarfanSugatraMeleeDangle", "PrimePrice": 250, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/OstronHeadStatue", "PrimePrice": 125, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/DomsFinalDrink", "PrimePrice": 100, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Wisp/WispAlternateSkin", "PrimePrice": 550, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Pacifist/BaruukImmortalSkin", "PrimePrice": 550, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/ErraBobbleHead", "PrimePrice": 75, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/OwlOrdisStatue", "PrimePrice": 350, "RegularPrice": 275000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/TNWVesoBobbleHead", "PrimePrice": 75, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/TNWTeshinBobbleHead", "PrimePrice": 75, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/CosmeticEnhancers/Peculiars/EvilSpiritMod", "PrimePrice": 250, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/BaroCape3Scarf", "PrimePrice": 500, "RegularPrice": 500000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/VoidTrader/ElixisTiberon", "PrimePrice": 315, "RegularPrice": 275000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Effects/LotusFlowers", "PrimePrice": 250, "RegularPrice": 450000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/UmbraPedestal", "PrimePrice": 0, "RegularPrice": 1000000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Dragon/ChromaAlternateSkin", "PrimePrice": 550, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Hoverboard/HoverboardStickerBaroB", "PrimePrice": 75, "RegularPrice": 75000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/VoidTrader/ElixisLatronPistol", "PrimePrice": 400, "RegularPrice": 215000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/WeaponGlaiveOnKillBuffSecondary", "PrimePrice": 300, "RegularPrice": 115000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardTennoConA", "PrimePrice": 75, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/WeaponGlaiveSecondaryHeadshotKillMod", "PrimePrice": 300, "RegularPrice": 115000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardTennoConD", "PrimePrice": 75, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardTennoConB", "PrimePrice": 75, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/Expert/WeaponIncreaseRadialExplosionModExpert", "PrimePrice": 350, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Archwing/Primary/ArchwingHeavyPistols/Prisma/PrismaArchHeavyPistols", "PrimePrice": 525, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/TwinSnakesGlyph", "PrimePrice": 80, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardTennoConF", "PrimePrice": 75, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardTennoConE", "PrimePrice": 75, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/WeaponGlaiveOnSixKillsBuffSecondary", "PrimePrice": 300, "RegularPrice": 115000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sigils/WeGameNewYearOxSigil", "PrimePrice": 55, "RegularPrice": 45000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardTennoConG", "PrimePrice": 75, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Shotgun/Expert/WeaponFreezeDamageModExpert", "PrimePrice": 350, "RegularPrice": 125000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/GarvLatroxPoster", "PrimePrice": 80, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Grineer/Melee/GrnBoomerang/HalikarWraithWeapon", "PrimePrice": 450, "RegularPrice": 350000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardTennoConI", "PrimePrice": 75, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Shotgun/Expert/WeaponReloadSpeedModExpert", "PrimePrice": 300, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Grineer/Melee/GrineerMachetteAndCleaver/PrismaMachete", "PrimePrice": 400, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/MoaPet/BaroMoaPetSkin", "PrimePrice": 500, "RegularPrice": 325000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/Deimos/PlushySunMonsterCommon", "PrimePrice": 150, "RegularPrice": 125000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/Deimos/PlushyMoonMonsterCommon", "PrimePrice": 150, "RegularPrice": 125000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/Expert/WeaponClipMaxModExpert", "PrimePrice": 280, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Shotgun/Expert/WeaponClipMaxModExpert", "PrimePrice": 280, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/TnShinaiSword/TnShinaiSwordSkin", "PrimePrice": 375, "RegularPrice": 280000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Weapons/DualSword/DualRibbonKamasSkin", "PrimePrice": 350, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Infestation/NidusAlternateSkin", "PrimePrice": 550, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Game/ActionFigureDioramas/EmpyreanRegionADiorama", "PrimePrice": 155, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/LisetPropGrineerFlak", "PrimePrice": 100, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/LisetPropGrineerTaktis", "PrimePrice": 100, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/VoidTrader/AshLeverianLiosPistol", "PrimePrice": 400, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Glass/GaraAlternateSkin", "PrimePrice": 550, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/Expert/WeaponSnipersConvertAmmoModExpert", "PrimePrice": 400, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/EraHypnosisPoster", "PrimePrice": 100, "RegularPrice": 110000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/NezhaLeverianCape", "PrimePrice": 400, "RegularPrice": 350000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Leverian/NezhaLeverian/NezhaLeverianPolearm", "PrimePrice": 350, "RegularPrice": 325000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/BoredTennoPoster", "PrimePrice": 90, "RegularPrice": 120000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/LisetPropCorpusBasilisk", "PrimePrice": 100, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/LisetPropCorpusWeaver", "PrimePrice": 100, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/LisetPropCorpusHarpi", "PrimePrice": 100, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Archwing/GrendelArchwingSkin", "PrimePrice": 400, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Operator/Hoods/JaviExecutionHood", "PrimePrice": 450, "RegularPrice": 450000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/DualStat/ElectEventMeleeMod", "PrimePrice": 300, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/DualStat/FireEventMeleeMod", "PrimePrice": 300, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Melee/MeleeTrees/ClawCmbTwoMeleeTree", "PrimePrice": 385, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/DualStat/FireEventRifleMod", "PrimePrice": 300, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Melee/MeleeTrees/AxeCmbThreeMeleeTree", "PrimePrice": 385, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Shotgun/WeaponEventSlashDamageMod", "PrimePrice": 375, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/BowMultiShotOnHitMod", "PrimePrice": 300, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Shotgun/DualStat/ElectEventShotgunMod", "PrimePrice": 300, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/DualStat/FireEventPistolMod", "PrimePrice": 300, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Shotgun/DualStat/FireEventShotgunMod", "PrimePrice": 300, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/WeaponEventPistolImpactDamageMod", "PrimePrice": 300, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/Expert/PrimedWeaponCritDamageMod", "PrimePrice": 400, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/Expert/WeaponMeleeFactionDamageInfestedExpert", "PrimePrice": 350, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/Expert/WeaponMeleeFactionDamageGrineerExpert", "PrimePrice": 350, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/Expert/WeaponMeleeFactionDamageCorruptedExpert", "PrimePrice": 350, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/Expert/WeaponMeleeFactionDamageCorpusExpert", "PrimePrice": 350, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/Expert/WeaponClipMaxModExpert", "PrimePrice": 280, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Shotgun/Expert/WeaponShotgunConvertAmmoModExpert", "PrimePrice": 400, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Archwing/Rifle/Expert/ArchwingRifleDamageAmountModExpert", "PrimePrice": 350, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/Expert/WeaponRifleConvertAmmoModExpert", "PrimePrice": 400, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Sentinels/SentinelPrecepts/PrimedRegen", "PrimePrice": 300, "RegularPrice": 220000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/Expert/WeaponMeleeRangeIncModExpert", "PrimePrice": 300, "RegularPrice": 220000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Shotgun/Expert/WeaponCritDamageModExpert", "PrimePrice": 280, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/Expert/WeaponReloadSpeedModExpert", "PrimePrice": 375, "RegularPrice": 120000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/Expert/WeaponMeleeDamageModExpert", "PrimePrice": 385, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Shotgun/Expert/WeaponDamageAmountModExpert", "PrimePrice": 300, "RegularPrice": 110000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/Expert/WeaponCritChanceModBeginnerExpert", "PrimePrice": 400, "RegularPrice": 220000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/Expert/WeaponPistolConvertAmmoModExpert", "PrimePrice": 400, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Sentinel/Kubrow/Expert/KubrowPackLeaderExpertMod", "PrimePrice": 300, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Archwing/Expert/ArchwingSuitAbilityStrengthModExpert", "PrimePrice": 350, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/Expert/WeaponImpactDamageModExpert", "PrimePrice": 350, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/Expert/WeaponFireDamageModExpert", "PrimePrice": 350, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/Expert/AvatarPowerMaxModExpert", "PrimePrice": 350, "RegularPrice": 110000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/Expert/WeaponToxinDamageModExpert", "PrimePrice": 350, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/Expert/WeaponReloadSpeedModExpert", "PrimePrice": 375, "RegularPrice": 120000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/Expert/WeaponPistolFactionDamageInfestedExpert", "PrimePrice": 350, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/Expert/WeaponPistolFactionDamageGrineerExpert", "PrimePrice": 350, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/Expert/WeaponPistolFactionDamageCorruptedExpert", "PrimePrice": 350, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/Expert/WeaponPistolFactionDamageCorpusExpert", "PrimePrice": 350, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/Expert/WeaponFreezeDamageModExpert", "PrimePrice": 350, "RegularPrice": 110000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/Expert/AvatarAbilityDurationModExpert", "PrimePrice": 350, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Shotgun/Expert/WeaponShotgunFactionDamageInfestedExpert", "PrimePrice": 350, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Shotgun/Expert/WeaponShotgunFactionDamageGrineerExpert", "PrimePrice": 350, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Shotgun/Expert/WeaponShotgunFactionDamageCorruptedExpert", "PrimePrice": 350, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Shotgun/Expert/WeaponShotgunFactionDamageCorpusExpert", "PrimePrice": 350, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Shotgun/Expert/WeaponElectricityDamageModExpert", "PrimePrice": 350, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/Expert/PrimedWeaponFactionDamageInfested", "PrimePrice": 400, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/Expert/PrimedWeaponFactionDamageGrineer", "PrimePrice": 400, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/Expert/PrimedWeaponFactionDamageCorrupted", "PrimePrice": 400, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/Expert/PrimedWeaponFactionDamageCorpus", "PrimePrice": 400, "RegularPrice": 140000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Sentinel/SentinelLootRadarEnemyRadarExpertMod", "PrimePrice": 300, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Melee/MeleeTrees/GlaiveCmbTwoMeleeTree", "PrimePrice": 385, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/WeaponEventSlashDamageMod", "PrimePrice": 375, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/WeaponEventMeleeImpactDamageMod", "PrimePrice": 400, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/WeaponEventRifleImpactDamageMod", "PrimePrice": 330, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/WeaponEventSlashDamageMod", "PrimePrice": 375, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Shotgun/WeaponEventShotgunImpactDamageMod", "PrimePrice": 365, "RegularPrice": 220000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/DualStat/ElectEventRifleMod", "PrimePrice": 300, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/DualStat/ElectEventPistolMod", "PrimePrice": 300, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/WeaponEventSlashDamageMod", "PrimePrice": 375, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/VoidTrader/VTDetron", "PrimePrice": 500, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Corpus/LongGuns/CrpFreezeRay/Vandal/CrpFreezeRayVandalRifle", "PrimePrice": 475, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/ClanTech/Chemical/FlameThrowerWraith", "PrimePrice": 550, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Grineer/Melee/GrineerMachetteAndCleaver/WraithMacheteWeapon", "PrimePrice": 410, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Corpus/Pistols/CrpHandRL/PrismaAngstrum", "PrimePrice": 475, "RegularPrice": 210000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Grineer/Melee/GrineerMachetteAndCleaver/PrismaDualCleavers", "PrimePrice": 490, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Grineer/LongGuns/VoidTraderGorgon/VTGorgon", "PrimePrice": 600, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/VoidTrader/PrismaGrakata", "PrimePrice": 610, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Grineer/LongGuns/GrineerLeverActionRifle/PrismaGrinlokWeapon", "PrimePrice": 500, "RegularPrice": 220000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Corpus/Melee/KickAndPunch/PrismaObex", "PrimePrice": 500, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/VoidTrader/PrismaSkana", "PrimePrice": 510, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Corpus/LongGuns/CorpusUMP/PrismaCorpusUMP", "PrimePrice": 400, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Grineer/Pistols/GrineerBulbousSMG/Prisma/PrismaTwinGremlinsWeapon", "PrimePrice": 500, "RegularPrice": 220000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Archwing/Melee/VoidTraderArchsword/VTArchSwordWeapon", "PrimePrice": 550, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/ClanTech/Energy/VandalElectroProd", "PrimePrice": 410, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Corpus/LongGuns/CrpShockRifle/QuantaVandal", "PrimePrice": 450, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Corpus/LongGuns/Machinegun/SupraVandal", "PrimePrice": 500, "RegularPrice": 275000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Grineer/Pistols/WraithSingleViper/WraithSingleViper", "PrimePrice": 400, "RegularPrice": 75000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Grineer/LongGuns/GrineerSniperRifle/VulkarWraith", "PrimePrice": 450, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Pistols/ConclaveLeverPistol/ConclaveLeverPistol", "PrimePrice": 500, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/MeleeDangles/FireMeleeDangle", "PrimePrice": 100, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/VoidTrader/BaroInarosPolearmSkin", "PrimePrice": 325, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/MeleeDangles/BaroInarosMeleeDangle", "PrimePrice": 250, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/MeleeDangles/InfestedMeleeDangle", "PrimePrice": 250, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/VoidTrader/VTHalloweenDarkSword", "PrimePrice": 320, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/SummerSolstice/SummerSolsticeGorgon", "PrimePrice": 300, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/SummerSolstice/SummerIgnisSkin", "PrimePrice": 300, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/VoidTrader/BaroArrow", "PrimePrice": 375, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/MeleeDangles/BaroMeleeDangle", "PrimePrice": 250, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/VoidTrader/BaroScytheMacheteSkin", "PrimePrice": 375, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/VoidTrader/ElixisOdonataSkin", "PrimePrice": 350, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/VoidTrader/ElixisBallasSword", "PrimePrice": 350, "RegularPrice": 350000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/VoidTrader/PrismaArrow", "PrimePrice": 350, "RegularPrice": 75000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/VoidTrader/VTRedeemerSkin", "PrimePrice": 325, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/VoidTrader/ElixisSonicor", "PrimePrice": 380, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/VoidTrader/ElixisTigris", "PrimePrice": 300, "RegularPrice": 275000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/VoidTrader/VTQuanta", "PrimePrice": 300, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/VoidTrader/ElixisOpticor", "PrimePrice": 325, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Halloween/HalloweenDread", "PrimePrice": 300, "RegularPrice": 275000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/ImageBaroKiteer", "PrimePrice": 80, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/Seasonal/AvatarImageGlyphCookieKavat", "PrimePrice": 80, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/Seasonal/AvatarImageGlyphCookieKubrow", "PrimePrice": 80, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/LisetScarf", "PrimePrice": 600, "RegularPrice": 400000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/ColourPickerTwitchBItemA", "PrimePrice": 220, "RegularPrice": 220000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Effects/FootstepsMaple", "PrimePrice": 15, "RegularPrice": 1000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Clan/BaroKavatBadgeItem", "PrimePrice": 50, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sigils/BaroKavatSigil", "PrimePrice": 55, "RegularPrice": 45000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/WraithTurbinesScarf", "PrimePrice": 400, "RegularPrice": 500000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Pirate/HydroidAlternateSkin", "PrimePrice": 550, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/Seasonal/Halloween2019GrendelTreat", "PrimePrice": 80, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/ColourPickerKiteerItemA", "PrimePrice": 150, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/KazBaroCape", "PrimePrice": 325, "RegularPrice": 450000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Effects/BaroEphemeraA", "PrimePrice": 100, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/BaroCape2Scarf", "PrimePrice": 400, "RegularPrice": 350000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Clan/BaroQuantumBadgeItem", "PrimePrice": 400, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/SolsticeBaroCape", "PrimePrice": 425, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/BaroCape", "PrimePrice": 500, "RegularPrice": 500000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageBaroIcon", "PrimePrice": 80, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Magician/LimboImmortalSkin", "PrimePrice": 550, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Cowgirl/MesaImmortallSkin", "PrimePrice": 550, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Harlequin/MirageAlternateSkin", "PrimePrice": 550, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Clan/BaroKubrowBadgeItem", "PrimePrice": 50, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sigils/BaroKubrowSigil", "PrimePrice": 55, "RegularPrice": 45000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/VTHornSkullScarf", "PrimePrice": 250, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Clan/PrismaLotusEmblem", "PrimePrice": 80, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageBaroTwoIcon", "PrimePrice": 80, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sigils/PrismaLotusSigil", "PrimePrice": 55, "RegularPrice": 45000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sigils/PrimeTraderSigil", "PrimePrice": 50, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/PrismaRazorScarf", "PrimePrice": 350, "RegularPrice": 275000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Scarves/VTDinoSpikeScarf", "PrimePrice": 400, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageLowPolyKavat", "PrimePrice": 80, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageLowPolyKubrow", "PrimePrice": 80, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Tengu/ZephyrAlternateSkin", "PrimePrice": 550, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Game/KubrowPet/Patterns/KubrowPetPatternPrimeTraderA", "PrimePrice": 150, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Camo/DesertDirigaSkin", "PrimePrice": 225, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sentinels/Masks/KavatPetMask", "PrimePrice": 500, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sentinels/Tails/KavatPetTail", "PrimePrice": 400, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sentinels/Wings/KavatPetWings", "PrimePrice": 400, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Catbrows/Armor/CatbrowArmorVoidTraderA", "PrimePrice": 500, "RegularPrice": 275000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Kubrows/Armor/KubrowArmorBaro", "PrimePrice": 500, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sentinels/Masks/BaroPetMask", "PrimePrice": 500, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sentinels/Tails/BaroPetTail", "PrimePrice": 400, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sentinels/Wings/BaroPetWings", "PrimePrice": 400, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/Types/StoreItems/Packages/KavatColorPackNexus", "PrimePrice": 200, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sentinels/Wings/PrismaJetWings", "PrimePrice": 300, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sentinels/Tails/PrismaFishTail", "PrimePrice": 200, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sentinels/Masks/PrismaMechHeadMask", "PrimePrice": 175, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Kubrows/Armor/KubrowArmorPrisma", "PrimePrice": 400, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Sentinels/SentinelPowersuits/PrismaShadePowerSuit", "PrimePrice": 500, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sentinels/Skins/DesertTaxonSkin", "PrimePrice": 200, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Catbrows/Armor/CatbrowArmorHalloweenA", "PrimePrice": 400, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/Types/StoreItems/Boosters/AffinityBooster3DayStoreItem", "PrimePrice": 450, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/Types/StoreItems/Boosters/CreditBooster3DayStoreItem", "PrimePrice": 350, "RegularPrice": 75000 },
|
||||
{ "ItemType": "/Lotus/Types/StoreItems/Boosters/ModDropChanceBooster3DayStoreItem", "PrimePrice": 500, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/Types/StoreItems/Boosters/ResourceAmount3DayStoreItem", "PrimePrice": 400, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Game/Projections/T4VoidProjectionPBronze", "PrimePrice": 50, "RegularPrice": 45000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Recipes/Components/CorruptedBombardBallBlueprint", "PrimePrice": 100, "RegularPrice": 50000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Restoratives/Consumable/CorruptedHeavyGunnerBall", "PrimePrice": 100, "RegularPrice": 40000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/OrbiterPictureFrameBaro", "PrimePrice": 100, "RegularPrice": 75000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Restoratives/Consumable/AssassinBaitC", "PrimePrice": 200, "RegularPrice": 125000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/MiscItems/PhotoboothTileInarosTomb", "PrimePrice": 325, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Restoratives/Consumable/BaroFireWorksCrate", "PrimePrice": 50, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/MiscItems/PhotoboothTileOrokinExtraction", "PrimePrice": 325, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Keys/MummyQuestKeyBlueprint", "PrimePrice": 100, "RegularPrice": 25000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Restoratives/Consumable/AssassinBait", "PrimePrice": 200, "RegularPrice": 125000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Restoratives/Consumable/AssassinBaitB", "PrimePrice": 200, "RegularPrice": 125000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/BaroKiTeerDecorationB", "PrimePrice": 100, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/BaroKiTeerDecorationE", "PrimePrice": 100, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/LisetPropCleaningDroneBaro", "PrimePrice": 700, "RegularPrice": 500000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/BaroKiTeerBobbleHead", "PrimePrice": 70, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Hoverboard/HoverboardStickerBaroA", "PrimePrice": 75, "RegularPrice": 75000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/KavatBust", "PrimePrice": 220, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/KubrowBust", "PrimePrice": 220, "RegularPrice": 250000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyDesertSkate", "PrimePrice": 125, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/BaroKiTeerDecorationD", "PrimePrice": 100, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/ExcaliburArchwingBobbleHead", "PrimePrice": 90, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Operator/Accessories/BaroTiara", "PrimePrice": 525, "RegularPrice": 375000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Operator/Accessories/EarpieceBaroC", "PrimePrice": 500, "RegularPrice": 400000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Operator/Accessories/BaroMouthPieceA", "PrimePrice": 500, "RegularPrice": 400000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Operator/Accessories/BaroVisor", "PrimePrice": 525, "RegularPrice": 375000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Operator/Accessories/BaroHorn", "PrimePrice": 525, "RegularPrice": 375000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Operator/Accessories/EarpieceBaroA", "PrimePrice": 500, "RegularPrice": 400000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Operator/Accessories/EarpieceBaroB", "PrimePrice": 250, "RegularPrice": 200000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Game/QuartersWallpapers/BaroWallpaper", "PrimePrice": 250, "RegularPrice": 175000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Liset/InarosLisetSkin", "PrimePrice": 400, "RegularPrice": 300000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/BaroKiTeerDecorationA", "PrimePrice": 100, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Liset/LisetInsectSkinInaros", "PrimePrice": 425, "RegularPrice": 320000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Liset/LisetInsectSkinPrimeTrader", "PrimePrice": 230, "RegularPrice": 375000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/ParazonPoster", "PrimePrice": 100, "RegularPrice": 125000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/KubrowKavatLowPolyPoster", "PrimePrice": 90, "RegularPrice": 110000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Liset/LisetSkinVoidTrader", "PrimePrice": 120, "RegularPrice": 150000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Liset/LisetBlueSkySkinPrimeTrader", "PrimePrice": 210, "RegularPrice": 450000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/BaroKiTeerDecorationF", "PrimePrice": 100, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Liset/LisetBlueSkySkinInaros", "PrimePrice": 375, "RegularPrice": 340000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/BaroKiTeerDecorationG", "PrimePrice": 100, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/LisetPropOstRugBaro", "PrimePrice": 225, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/BaroKiTeerDecorationH", "PrimePrice": 100, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Liset/Gyroscope/LisetGyroscopeSkinPrimeTrader", "PrimePrice": 220, "RegularPrice": 400000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/BaroKiTeerDecorationC", "PrimePrice": 100, "RegularPrice": 100000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/PedistalPrime", "PrimePrice": 0, "RegularPrice": 1000000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Types/Items/Emotes/BaroEmote", "PrimePrice": 0, "RegularPrice": 1000000 },
|
||||
{ "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/EventSniperReloadDamageMod", "PrimePrice": 2995, "RegularPrice": 1000000 }
|
||||
],
|
||||
"allIfAny": [
|
||||
[
|
||||
"/Lotus/StoreItems/Upgrades/Skins/Operator/Leggings/LeggingsNovaEngineer",
|
||||
"/Lotus/StoreItems/Upgrades/Skins/Operator/BodySuits/BodySuitNovaEngineer",
|
||||
"/Lotus/StoreItems/Upgrades/Skins/Operator/Sleeves/SleevesNovaEngineer",
|
||||
"/Lotus/StoreItems/Upgrades/Skins/Operator/Hoods/HoodNovaEngineer"
|
||||
]
|
||||
]
|
||||
}
|
||||
154
static/fixed_responses/worldState/fissureMissions.json
Normal file
154
static/fixed_responses/worldState/fissureMissions.json
Normal file
@ -0,0 +1,154 @@
|
||||
{
|
||||
"VoidT1": [
|
||||
"SolNode23",
|
||||
"SolNode66",
|
||||
"SolNode45",
|
||||
"SolNode41",
|
||||
"SolNode59",
|
||||
"SolNode39",
|
||||
"SolNode75",
|
||||
"SolNode113",
|
||||
"SolNode85",
|
||||
"SolNode58",
|
||||
"SolNode101",
|
||||
"SolNode109",
|
||||
"SolNode26",
|
||||
"SolNode15",
|
||||
"SolNode61",
|
||||
"SolNode123",
|
||||
"SolNode16",
|
||||
"SolNode79",
|
||||
"SolNode2",
|
||||
"SolNode22",
|
||||
"SolNode68",
|
||||
"SolNode89",
|
||||
"SolNode11",
|
||||
"SolNode46",
|
||||
"SolNode36",
|
||||
"SolNode27",
|
||||
"SolNode14",
|
||||
"SolNode106",
|
||||
"SolNode30",
|
||||
"SolNode107",
|
||||
"SolNode63",
|
||||
"SolNode128"
|
||||
],
|
||||
"VoidT2": [
|
||||
"SolNode141",
|
||||
"SolNode149",
|
||||
"SolNode10",
|
||||
"SolNode93",
|
||||
"SettlementNode11",
|
||||
"SolNode137",
|
||||
"SolNode132",
|
||||
"SolNode73",
|
||||
"SolNode82",
|
||||
"SolNode25",
|
||||
"SolNode88",
|
||||
"SolNode126",
|
||||
"SolNode135",
|
||||
"SolNode74",
|
||||
"SettlementNode15",
|
||||
"SolNode147",
|
||||
"SolNode67",
|
||||
"SolNode20",
|
||||
"SolNode42",
|
||||
"SolNode18",
|
||||
"SolNode31",
|
||||
"SolNode139",
|
||||
"SettlementNode12",
|
||||
"SolNode100",
|
||||
"SolNode140",
|
||||
"SolNode70",
|
||||
"SettlementNode1",
|
||||
"SettlementNode14",
|
||||
"SolNode50",
|
||||
"SettlementNode2",
|
||||
"SolNode146",
|
||||
"SettlementNode3",
|
||||
"SolNode97",
|
||||
"SolNode125",
|
||||
"SolNode19",
|
||||
"SolNode121",
|
||||
"SolNode96",
|
||||
"SolNode131"
|
||||
],
|
||||
"VoidT3": [
|
||||
"SolNode62",
|
||||
"SolNode17",
|
||||
"SolNode403",
|
||||
"SolNode6",
|
||||
"SolNode118",
|
||||
"SolNode211",
|
||||
"SolNode217",
|
||||
"SolNode401",
|
||||
"SolNode64",
|
||||
"SolNode405",
|
||||
"SolNode84",
|
||||
"SolNode402",
|
||||
"SolNode408",
|
||||
"SolNode122",
|
||||
"SolNode57",
|
||||
"SolNode216",
|
||||
"SolNode205",
|
||||
"SolNode215",
|
||||
"SolNode404",
|
||||
"SolNode209",
|
||||
"SolNode406",
|
||||
"SolNode204",
|
||||
"SolNode203",
|
||||
"SolNode409",
|
||||
"SolNode400",
|
||||
"SolNode212",
|
||||
"SolNode1",
|
||||
"SolNode412",
|
||||
"SolNode49",
|
||||
"SolNode78",
|
||||
"SolNode410",
|
||||
"SolNode407",
|
||||
"SolNode220"
|
||||
],
|
||||
"VoidT4": [
|
||||
"SolNode188",
|
||||
"SolNode403",
|
||||
"SolNode189",
|
||||
"SolNode21",
|
||||
"SolNode102",
|
||||
"SolNode171",
|
||||
"SolNode196",
|
||||
"SolNode184",
|
||||
"SolNode185",
|
||||
"SolNode76",
|
||||
"SolNode195",
|
||||
"SolNode164",
|
||||
"SolNode401",
|
||||
"SolNode405",
|
||||
"SolNode56",
|
||||
"SolNode402",
|
||||
"SolNode408",
|
||||
"SolNode4",
|
||||
"SolNode181",
|
||||
"SolNode406",
|
||||
"SolNode162",
|
||||
"SolNode72",
|
||||
"SolNode407",
|
||||
"SolNode177",
|
||||
"SolNode404",
|
||||
"SolNode400",
|
||||
"SolNode409",
|
||||
"SolNode43",
|
||||
"SolNode166",
|
||||
"SolNode172",
|
||||
"SolNode412",
|
||||
"SolNode187",
|
||||
"SolNode38",
|
||||
"SolNode175",
|
||||
"SolNode81",
|
||||
"SolNode48",
|
||||
"SolNode410",
|
||||
"SolNode153",
|
||||
"SolNode173"
|
||||
],
|
||||
"VoidT5": ["SolNode747", "SolNode743", "SolNode742", "SolNode744", "SolNode745", "SolNode748", "SolNode746", "SolNode741"],
|
||||
"VoidT6": ["SolNode717", "SolNode309", "SolNode718", "SolNode232", "SolNode230", "SolNode310"]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -37,7 +37,7 @@
|
||||
<li class="nav-item dropdown user-dropdown">
|
||||
<button class="nav-link dropdown-toggle displayname" data-bs-toggle="dropdown" aria-expanded="false"></button>
|
||||
<ul class="dropdown-menu dropdown-menu-end">
|
||||
<li><a class="dropdown-item" href="/webui/" onclick="logout();" data-loc="navbar_logout"></a></li>
|
||||
<li><a class="dropdown-item" href="/webui/" onclick="doLogout();" data-loc="navbar_logout"></a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" href="#" onclick="event.preventDefault();renameAccount();" data-loc="navbar_renameAccount"></a></li>
|
||||
<li><a class="dropdown-item" href="#" onclick="event.preventDefault();deleteAccount();" data-loc="navbar_deleteAccount"></a></li>
|
||||
@ -584,10 +584,6 @@
|
||||
<input class="form-check-input" type="checkbox" id="unlockAllScans" />
|
||||
<label class="form-check-label" for="unlockAllScans" data-loc="cheats_unlockAllScans"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="unlockAllMissions" />
|
||||
<label class="form-check-label" for="unlockAllMissions" data-loc="cheats_unlockAllMissions"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="infiniteCredits" />
|
||||
<label class="form-check-label" for="infiniteCredits" data-loc="cheats_infiniteCredits"></label>
|
||||
@ -704,10 +700,26 @@
|
||||
<input class="form-check-input" type="checkbox" id="noKimCooldowns" />
|
||||
<label class="form-check-label" for="noKimCooldowns" data-loc="cheats_noKimCooldowns"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="fullyStockedVendors" />
|
||||
<label class="form-check-label" for="fullyStockedVendors" data-loc="cheats_fullyStockedVendors"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="baroAlwaysAvailable" />
|
||||
<label class="form-check-label" for="baroAlwaysAvailable" data-loc="cheats_baroAlwaysAvailable"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="baroFullyStocked" />
|
||||
<label class="form-check-label" for="baroFullyStocked" data-loc="cheats_baroFullyStocked"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="syndicateMissionsRepeatable" />
|
||||
<label class="form-check-label" for="syndicateMissionsRepeatable" data-loc="cheats_syndicateMissionsRepeatable"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="unlockAllProfitTakerStages" />
|
||||
<label class="form-check-label" for="unlockAllProfitTakerStages" data-loc="cheats_unlockAllProfitTakerStages"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="instantFinishRivenChallenge" />
|
||||
<label class="form-check-label" for="instantFinishRivenChallenge" data-loc="cheats_instantFinishRivenChallenge"></label>
|
||||
@ -748,6 +760,14 @@
|
||||
<input class="form-check-input" type="checkbox" id="fastClanAscension" />
|
||||
<label class="form-check-label" for="fastClanAscension" data-loc="cheats_fastClanAscension"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="missionsCanGiveAllRelics" />
|
||||
<label class="form-check-label" for="missionsCanGiveAllRelics" data-loc="cheats_missionsCanGiveAllRelics"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="unlockAllSimarisResearchEntries" />
|
||||
<label class="form-check-label" for="unlockAllSimarisResearchEntries" data-loc="cheats_unlockAllSimarisResearchEntries"></label>
|
||||
</div>
|
||||
<form class="form-group mt-2" onsubmit="doSaveConfig('spoofMasteryRank'); return false;">
|
||||
<label class="form-label" for="spoofMasteryRank" data-loc="cheats_spoofMasteryRank"></label>
|
||||
<div class="input-group">
|
||||
@ -771,9 +791,11 @@
|
||||
<h5 class="card-header" data-loc="cheats_account"></h5>
|
||||
<div class="card-body">
|
||||
<div class="mb-2 d-flex flex-wrap gap-2">
|
||||
<button class="btn btn-primary" onclick="debounce(doUnlockAllMissions);" data-loc="cheats_unlockAllMissions"></button>
|
||||
<button class="btn btn-primary" onclick="doUnlockAllFocusSchools();" data-loc="cheats_unlockAllFocusSchools"></button>
|
||||
<button class="btn btn-primary" onclick="doHelminthUnlockAll();" data-loc="cheats_helminthUnlockAll"></button>
|
||||
<button class="btn btn-primary" onclick="doIntrinsicsUnlockAll();" data-loc="cheats_intrinsicsUnlockAll"></button>
|
||||
<button class="btn btn-primary" onclick="debounce(doMaxPlexus);" data-loc="inventory_maxPlexus"></button>
|
||||
</div>
|
||||
<form class="mt-2" onsubmit="doChangeSupportedSyndicate(); return false;">
|
||||
<label class="form-label" for="changeSyndicate" data-loc="cheats_changeSupportedSyndicate"></label>
|
||||
@ -789,8 +811,12 @@
|
||||
</div>
|
||||
<div data-route="/webui/import" data-title="Import | OpenWF WebUI">
|
||||
<p data-loc="import_importNote"></p>
|
||||
<textarea class="form-control" id="import-inventory"></textarea>
|
||||
<textarea class="form-control" id="import-inventory" style="height: calc(100vh - 300px)"></textarea>
|
||||
<button class="btn btn-primary mt-3" onclick="doImport();" data-loc="import_submit"></button>
|
||||
<p class="mt-3 mb-1" data-loc="import_samples"></p>
|
||||
<ul>
|
||||
<li><a href="#" onclick="event.preventDefault();setImportSample('maxFocus');" data-loc="import_samples_maxFocus"></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="toast-container position-fixed bottom-0 end-0 p-3"></div>
|
||||
|
||||
6
static/webui/libs/bootstrap.bundle.min.js
vendored
6
static/webui/libs/bootstrap.bundle.min.js
vendored
File diff suppressed because one or more lines are too long
1
static/webui/libs/bootstrap.bundle.min.js.map
Normal file
1
static/webui/libs/bootstrap.bundle.min.js.map
Normal file
File diff suppressed because one or more lines are too long
6
static/webui/libs/bootstrap.min.css
vendored
6
static/webui/libs/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
1
static/webui/libs/bootstrap.min.css.map
Normal file
1
static/webui/libs/bootstrap.min.css.map
Normal file
File diff suppressed because one or more lines are too long
@ -1,21 +1,58 @@
|
||||
let loginOrRegisterPending = false;
|
||||
window.registerSubmit = false;
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
||||
/* eslint-disable @typescript-eslint/no-floating-promises */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||
/* eslint-disable no-undef */
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
||||
|
||||
function doLogin() {
|
||||
if (loginOrRegisterPending) {
|
||||
return;
|
||||
let auth_pending = false,
|
||||
did_initial_auth = false,
|
||||
ws_is_open = false;
|
||||
const sendAuth = isRegister => {
|
||||
if (ws_is_open && localStorage.getItem("email") && localStorage.getItem("password")) {
|
||||
auth_pending = true;
|
||||
window.ws.send(
|
||||
JSON.stringify({
|
||||
auth: {
|
||||
email: localStorage.getItem("email"),
|
||||
password: wp.encSync(localStorage.getItem("password")),
|
||||
isRegister
|
||||
}
|
||||
})
|
||||
);
|
||||
}
|
||||
loginOrRegisterPending = true;
|
||||
localStorage.setItem("email", $("#email").val());
|
||||
localStorage.setItem("password", $("#password").val());
|
||||
loginFromLocalStorage();
|
||||
registerSubmit = false;
|
||||
}
|
||||
};
|
||||
|
||||
function loginFromLocalStorage() {
|
||||
const isRegister = registerSubmit;
|
||||
doLoginRequest(
|
||||
data => {
|
||||
function openWebSocket() {
|
||||
window.ws = new WebSocket("/custom/ws");
|
||||
window.ws.onopen = () => {
|
||||
ws_is_open = true;
|
||||
sendAuth(false);
|
||||
};
|
||||
window.ws.onmessage = e => {
|
||||
const msg = JSON.parse(e.data);
|
||||
if ("reload" in msg) {
|
||||
setTimeout(() => {
|
||||
getWebSocket().then(() => {
|
||||
location.reload();
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
if ("ports" in msg) {
|
||||
location.port = location.protocol == "https:" ? msg.ports.https : msg.ports.http;
|
||||
}
|
||||
if ("config_reloaded" in msg) {
|
||||
//window.is_admin = undefined;
|
||||
if (single.getCurrentPath() == "/webui/cheats") {
|
||||
single.loadRoute("/webui/cheats");
|
||||
}
|
||||
}
|
||||
if ("auth_succ" in msg) {
|
||||
auth_pending = false;
|
||||
const data = msg.auth_succ;
|
||||
if (single.getCurrentPath() == "/webui/") {
|
||||
single.loadRoute("/webui/inventory");
|
||||
}
|
||||
@ -25,60 +62,81 @@ function loginFromLocalStorage() {
|
||||
if (window.dict) {
|
||||
updateLocElements();
|
||||
}
|
||||
if (!did_initial_auth) {
|
||||
did_initial_auth = true;
|
||||
updateInventory();
|
||||
}
|
||||
}
|
||||
if ("auth_fail" in msg) {
|
||||
auth_pending = false;
|
||||
logout();
|
||||
if (single.getCurrentPath() == "/webui/") {
|
||||
alert(loc(msg.auth_fail.isRegister ? "code_regFail" : "code_loginFail"));
|
||||
} else {
|
||||
single.loadRoute("/webui/");
|
||||
}
|
||||
}
|
||||
if ("logged_out" in msg) {
|
||||
sendAuth();
|
||||
}
|
||||
if ("update_inventory" in msg) {
|
||||
updateInventory();
|
||||
},
|
||||
() => {
|
||||
logout();
|
||||
alert(loc(isRegister ? "code_regFail" : "code_loginFail"));
|
||||
}
|
||||
);
|
||||
};
|
||||
window.ws.onclose = function () {
|
||||
ws_is_open = false;
|
||||
setTimeout(openWebSocket, 3000);
|
||||
};
|
||||
}
|
||||
openWebSocket();
|
||||
|
||||
function doLoginRequest(succ_cb, fail_cb) {
|
||||
const req = $.post({
|
||||
url: "/api/login.php",
|
||||
contentType: "text/plain",
|
||||
data: JSON.stringify({
|
||||
email: localStorage.getItem("email").toLowerCase(),
|
||||
password: wp.encSync(localStorage.getItem("password"), "hex"),
|
||||
time: parseInt(new Date() / 1000),
|
||||
s: "W0RFXVN0ZXZlIGxpa2VzIGJpZyBidXR0cw==", // signature of some kind
|
||||
lang: "en",
|
||||
date: 1501230947855458660, // ???
|
||||
ClientType: registerSubmit ? "webui-register" : "webui",
|
||||
PS: "W0RFXVN0ZXZlIGxpa2VzIGJpZyBidXR0cw==" // anti-cheat data
|
||||
})
|
||||
});
|
||||
req.done(succ_cb);
|
||||
req.fail(fail_cb);
|
||||
req.always(() => {
|
||||
loginOrRegisterPending = false;
|
||||
function getWebSocket() {
|
||||
return new Promise(resolve => {
|
||||
let interval;
|
||||
interval = setInterval(() => {
|
||||
if (ws_is_open) {
|
||||
clearInterval(interval);
|
||||
resolve(window.ws);
|
||||
}
|
||||
}, 10);
|
||||
});
|
||||
}
|
||||
|
||||
function revalidateAuthz(succ_cb) {
|
||||
return doLoginRequest(
|
||||
data => {
|
||||
window.authz = "accountId=" + data.id + "&nonce=" + data.Nonce;
|
||||
succ_cb();
|
||||
},
|
||||
() => {
|
||||
logout();
|
||||
alert(loc("code_nonValidAuthz"));
|
||||
single.loadRoute("/webui/"); // Show login screen
|
||||
}
|
||||
);
|
||||
window.registerSubmit = false;
|
||||
|
||||
function doLogin() {
|
||||
if (auth_pending) {
|
||||
return;
|
||||
}
|
||||
localStorage.setItem("email", $("#email").val());
|
||||
localStorage.setItem("password", $("#password").val());
|
||||
sendAuth(registerSubmit);
|
||||
window.registerSubmit = false;
|
||||
}
|
||||
|
||||
async function revalidateAuthz() {
|
||||
await getWebSocket();
|
||||
// We have a websocket connection, so authz should be good.
|
||||
}
|
||||
|
||||
function logout() {
|
||||
localStorage.removeItem("email");
|
||||
localStorage.removeItem("password");
|
||||
did_initial_auth = false;
|
||||
}
|
||||
|
||||
function doLogout() {
|
||||
logout();
|
||||
if (ws_is_open) {
|
||||
// Unsubscribe from notifications about nonce invalidation
|
||||
window.ws.send(JSON.stringify({ logout: true }));
|
||||
}
|
||||
}
|
||||
|
||||
function renameAccount() {
|
||||
const newname = window.prompt(loc("code_changeNameConfirm"));
|
||||
if (newname) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
fetch("/custom/renameAccount?" + window.authz + "&newname=" + newname).then(() => {
|
||||
$(".displayname").text(newname);
|
||||
updateLocElements();
|
||||
@ -89,7 +147,7 @@ function renameAccount() {
|
||||
|
||||
function deleteAccount() {
|
||||
if (window.confirm(loc("code_deleteAccountConfirm"))) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
fetch("/custom/deleteAccount?" + window.authz).then(() => {
|
||||
logout();
|
||||
single.loadRoute("/webui/"); // Show login screen
|
||||
@ -98,10 +156,6 @@ function deleteAccount() {
|
||||
}
|
||||
}
|
||||
|
||||
if (localStorage.getItem("email") && localStorage.getItem("password")) {
|
||||
loginFromLocalStorage();
|
||||
}
|
||||
|
||||
single.on("route_load", function (event) {
|
||||
if (event.route.paths[0] != "/webui/") {
|
||||
// Authorised route?
|
||||
@ -593,9 +647,10 @@ function updateInventory() {
|
||||
a.href = "#";
|
||||
a.onclick = function (event) {
|
||||
event.preventDefault();
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
const promises = [];
|
||||
if (item.XP < maxXP) {
|
||||
addGearExp(category, item.ItemId.$oid, maxXP - item.XP);
|
||||
promises.push(addGearExp(category, item.ItemId.$oid, maxXP - item.XP));
|
||||
}
|
||||
if ("exalted" in itemMap[item.ItemType]) {
|
||||
for (const exaltedType of itemMap[item.ItemType].exalted) {
|
||||
@ -604,15 +659,20 @@ function updateInventory() {
|
||||
const exaltedCap =
|
||||
itemMap[exaltedType]?.type == "weapons" ? 800_000 : 1_600_000;
|
||||
if (exaltedItem.XP < exaltedCap) {
|
||||
addGearExp(
|
||||
"SpecialItems",
|
||||
exaltedItem.ItemId.$oid,
|
||||
exaltedCap - exaltedItem.XP
|
||||
promises.push(
|
||||
addGearExp(
|
||||
"SpecialItems",
|
||||
exaltedItem.ItemId.$oid,
|
||||
exaltedCap - exaltedItem.XP
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Promise.all(promises).then(() => {
|
||||
updateInventory();
|
||||
});
|
||||
});
|
||||
};
|
||||
a.title = loc("code_maxRank");
|
||||
@ -761,6 +821,13 @@ function updateInventory() {
|
||||
giveAllQEvolutionProgress.disabled = true;
|
||||
}
|
||||
|
||||
if (data.CrewShipHarnesses?.length) {
|
||||
window.plexus = {
|
||||
id: data.CrewShipHarnesses[0].ItemId.$oid,
|
||||
xp: data.CrewShipHarnesses[0].XP
|
||||
};
|
||||
}
|
||||
|
||||
// Populate quests route
|
||||
document.getElementById("QuestKeys-list").innerHTML = "";
|
||||
data.QuestKeys.forEach(item => {
|
||||
@ -1170,7 +1237,7 @@ function doAcquireEquipment(category) {
|
||||
.focus();
|
||||
return;
|
||||
}
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
const req = $.post({
|
||||
url: "/custom/addItems?" + window.authz,
|
||||
contentType: "application/json",
|
||||
@ -1297,7 +1364,7 @@ function doAcquireModularEquipment(category, WeaponType) {
|
||||
}
|
||||
});
|
||||
if (category == "KubrowPets") Parts.unshift(WeaponType);
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
const req = $.post({
|
||||
url: "/api/modularWeaponCrafting.php?" + window.authz,
|
||||
contentType: "application/octet-stream",
|
||||
@ -1350,7 +1417,7 @@ $("input[list]").on("input", function () {
|
||||
});
|
||||
|
||||
function dispatchAddItemsRequestsBatch(requests) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
const req = $.post({
|
||||
url: "/custom/addItems?" + window.authz,
|
||||
contentType: "application/json",
|
||||
@ -1394,7 +1461,7 @@ function addMissingEvolutionProgress() {
|
||||
}
|
||||
|
||||
function maxRankAllEvolutions() {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
|
||||
req.done(data => {
|
||||
const requests = [];
|
||||
@ -1418,7 +1485,7 @@ function maxRankAllEvolutions() {
|
||||
}
|
||||
|
||||
function maxRankAllEquipment(categories) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
|
||||
req.done(data => {
|
||||
window.itemListPromise.then(itemMap => {
|
||||
@ -1443,20 +1510,17 @@ function maxRankAllEquipment(categories) {
|
||||
XP: maxXP
|
||||
});
|
||||
}
|
||||
if (category === "Suits") {
|
||||
if ("exalted" in itemMap[item.ItemType]) {
|
||||
for (const exaltedType of itemMap[item.ItemType].exalted) {
|
||||
const exaltedItem = data["SpecialItems"].find(x => x.ItemType == exaltedType);
|
||||
if (exaltedItem) {
|
||||
const exaltedCap =
|
||||
itemMap[exaltedType]?.type == "weapons" ? 800_000 : 1_600_000;
|
||||
if (exaltedItem.XP < exaltedCap) {
|
||||
batchData["SpecialItems"] ??= [];
|
||||
batchData["SpecialItems"].push({
|
||||
ItemId: { $oid: exaltedItem.ItemId.$oid },
|
||||
XP: exaltedCap
|
||||
});
|
||||
}
|
||||
if (item.ItemType in itemMap && "exalted" in itemMap[item.ItemType]) {
|
||||
for (const exaltedType of itemMap[item.ItemType].exalted) {
|
||||
const exaltedItem = data["SpecialItems"].find(x => x.ItemType == exaltedType);
|
||||
if (exaltedItem) {
|
||||
const exaltedCap = itemMap[exaltedType]?.type == "weapons" ? 800_000 : 1_600_000;
|
||||
if (exaltedItem.XP < exaltedCap) {
|
||||
batchData["SpecialItems"] ??= [];
|
||||
batchData["SpecialItems"].push({
|
||||
ItemId: { $oid: exaltedItem.ItemId.$oid },
|
||||
XP: exaltedCap
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1483,19 +1547,19 @@ function addGearExp(category, oid, xp) {
|
||||
XP: xp
|
||||
}
|
||||
];
|
||||
$.post({
|
||||
url: "/custom/addXp?" + window.authz,
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data)
|
||||
}).done(function () {
|
||||
if (category != "SpecialItems") {
|
||||
updateInventory();
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
$.post({
|
||||
url: "/custom/addXp?" + window.authz,
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data)
|
||||
})
|
||||
.done(resolve)
|
||||
.fail(reject);
|
||||
});
|
||||
}
|
||||
|
||||
function sendBatchGearExp(data) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/custom/addXp?" + window.authz,
|
||||
contentType: "application/json",
|
||||
@ -1508,7 +1572,7 @@ function sendBatchGearExp(data) {
|
||||
}
|
||||
|
||||
function renameGear(category, oid, name) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
if (category == "KubrowPets") {
|
||||
$.post({
|
||||
url: "/api/renamePet.php?" + window.authz + "&webui=1",
|
||||
@ -1536,7 +1600,7 @@ function renameGear(category, oid, name) {
|
||||
|
||||
function disposeOfGear(category, oid) {
|
||||
if (category == "KubrowPets") {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/api/releasePet.php?" + window.authz,
|
||||
contentType: "application/octet-stream",
|
||||
@ -1558,7 +1622,7 @@ function disposeOfGear(category, oid) {
|
||||
Count: 0
|
||||
}
|
||||
];
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/api/sell.php?" + window.authz,
|
||||
contentType: "text/plain",
|
||||
@ -1580,7 +1644,7 @@ function disposeOfItems(category, type, count) {
|
||||
Count: count
|
||||
}
|
||||
];
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/api/sell.php?" + window.authz,
|
||||
contentType: "text/plain",
|
||||
@ -1590,7 +1654,7 @@ function disposeOfItems(category, type, count) {
|
||||
}
|
||||
|
||||
function gildEquipment(category, oid) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/api/gildWeapon.php?" + window.authz + "&ItemId=" + oid + "&Category=" + category,
|
||||
contentType: "application/octet-stream",
|
||||
@ -1604,7 +1668,7 @@ function gildEquipment(category, oid) {
|
||||
}
|
||||
|
||||
function maturePet(oid, revert) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/api/maturePet.php?" + window.authz,
|
||||
contentType: "application/octet-stream",
|
||||
@ -1619,7 +1683,7 @@ function maturePet(oid, revert) {
|
||||
}
|
||||
|
||||
function setEvolutionProgress(requests) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
const req = $.post({
|
||||
url: "/custom/setEvolutionProgress?" + window.authz,
|
||||
contentType: "application/json",
|
||||
@ -1639,7 +1703,7 @@ function doAcquireMiscItems() {
|
||||
}
|
||||
const count = parseInt($("#miscitem-count").val());
|
||||
if (count != 0) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/custom/addItems?" + window.authz,
|
||||
contentType: "application/json",
|
||||
@ -1667,7 +1731,9 @@ function doAcquireRiven() {
|
||||
if (typeof fingerprint !== "object") {
|
||||
fingerprint = JSON.parse(fingerprint);
|
||||
}
|
||||
} catch (e) {}
|
||||
} catch (e) {
|
||||
/* empty */
|
||||
}
|
||||
if (
|
||||
typeof fingerprint !== "object" ||
|
||||
!("compat" in fingerprint) ||
|
||||
@ -1678,7 +1744,7 @@ function doAcquireRiven() {
|
||||
return;
|
||||
}
|
||||
const uniqueName = "/Lotus/Upgrades/Mods/Randomized/" + $("#addriven-type").val();
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
// Add riven type to inventory
|
||||
$.post({
|
||||
url: "/custom/addItems?" + window.authz,
|
||||
@ -1725,7 +1791,7 @@ $("#addriven-fingerprint").on("input", () => {
|
||||
});
|
||||
|
||||
function setFingerprint(ItemType, ItemId, fingerprint) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/api/artifacts.php?" + window.authz,
|
||||
contentType: "text/plain",
|
||||
@ -1753,7 +1819,7 @@ function doAcquireMod() {
|
||||
}
|
||||
const count = parseInt($("#mod-count").val());
|
||||
if (count != 0) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/custom/addItems?" + window.authz,
|
||||
contentType: "application/json",
|
||||
@ -1812,6 +1878,7 @@ single.getRoute("/webui/cheats").on("beforeload", function () {
|
||||
clearInterval(interval);
|
||||
fetch("/custom/config?" + window.authz).then(async res => {
|
||||
if (res.status == 200) {
|
||||
//window.is_admin = true;
|
||||
$("#server-settings-no-perms").addClass("d-none");
|
||||
$("#server-settings").removeClass("d-none");
|
||||
res.json().then(json =>
|
||||
@ -1820,9 +1887,7 @@ single.getRoute("/webui/cheats").on("beforeload", function () {
|
||||
var x = document.getElementById(`${key}`);
|
||||
if (x != null) {
|
||||
if (x.type == "checkbox") {
|
||||
if (value === true) {
|
||||
x.setAttribute("checked", "checked");
|
||||
}
|
||||
x.checked = value;
|
||||
} else if (x.type == "number") {
|
||||
x.setAttribute("value", `${value}`);
|
||||
}
|
||||
@ -1831,12 +1896,13 @@ single.getRoute("/webui/cheats").on("beforeload", function () {
|
||||
);
|
||||
} else {
|
||||
if ((await res.text()) == "Log-in expired") {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
if (single.getCurrentPath() == "/webui/cheats") {
|
||||
single.loadRoute("/webui/cheats");
|
||||
}
|
||||
});
|
||||
} else {
|
||||
//window.is_admin = false;
|
||||
$("#server-settings-no-perms").removeClass("d-none");
|
||||
$("#server-settings").addClass("d-none");
|
||||
}
|
||||
@ -1847,7 +1913,7 @@ single.getRoute("/webui/cheats").on("beforeload", function () {
|
||||
});
|
||||
|
||||
function doUnlockAllFocusSchools() {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1").done(async data => {
|
||||
const missingFocusUpgrades = {
|
||||
"/Lotus/Upgrades/Focus/Attack/AttackFocusAbility": true,
|
||||
@ -1898,13 +1964,13 @@ function unlockFocusSchool(upgradeType) {
|
||||
}
|
||||
|
||||
function doHelminthUnlockAll() {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post("/api/infestedFoundry.php?" + window.authz + "&mode=custom_unlockall");
|
||||
});
|
||||
}
|
||||
|
||||
function doIntrinsicsUnlockAll() {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.get("/custom/unlockAllIntrinsics?" + window.authz);
|
||||
});
|
||||
}
|
||||
@ -1916,11 +1982,11 @@ function doAddAllMods() {
|
||||
}
|
||||
modsAll.delete("/Lotus/Upgrades/Mods/Fusers/LegendaryModFuser");
|
||||
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
|
||||
req.done(data => {
|
||||
for (const modOwned of data.RawUpgrades) {
|
||||
if (modOwned.ItemCount ?? 1 > 0) {
|
||||
if ((modOwned.ItemCount ?? 1) > 0) {
|
||||
modsAll.delete(modOwned.ItemType);
|
||||
}
|
||||
}
|
||||
@ -1948,7 +2014,7 @@ function doAddAllMods() {
|
||||
}
|
||||
|
||||
function doRemoveUnrankedMods() {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
|
||||
req.done(inventory => {
|
||||
window.itemListPromise.then(itemMap => {
|
||||
@ -1973,7 +2039,7 @@ function doRemoveUnrankedMods() {
|
||||
}
|
||||
|
||||
function doAddMissingMaxRankMods() {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
fetch("/custom/addMissingMaxRankMods?" + window.authz).then(() => {
|
||||
updateInventory();
|
||||
});
|
||||
@ -1995,7 +2061,7 @@ function doPushArchonCrystalUpgrade() {
|
||||
$("[list='datalist-archonCrystalUpgrades']").addClass("is-invalid").focus();
|
||||
return;
|
||||
}
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.get(
|
||||
"/custom/pushArchonCrystalUpgrade?" +
|
||||
window.authz +
|
||||
@ -2013,7 +2079,7 @@ function doPushArchonCrystalUpgrade() {
|
||||
}
|
||||
|
||||
function doPopArchonCrystalUpgrade(type) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.get(
|
||||
"/custom/popArchonCrystalUpgrade?" +
|
||||
window.authz +
|
||||
@ -2028,7 +2094,7 @@ function doPopArchonCrystalUpgrade(type) {
|
||||
}
|
||||
|
||||
function doImport() {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/custom/import?" + window.authz,
|
||||
contentType: "application/json",
|
||||
@ -2045,7 +2111,7 @@ function doImport() {
|
||||
function doChangeSupportedSyndicate() {
|
||||
const uniqueName = document.getElementById("changeSyndicate").value;
|
||||
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.get("/api/setSupportedSyndicate.php?" + window.authz + "&syndicate=" + uniqueName).done(function () {
|
||||
updateInventory();
|
||||
});
|
||||
@ -2053,7 +2119,7 @@ function doChangeSupportedSyndicate() {
|
||||
}
|
||||
|
||||
function doAddCurrency(currency) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/custom/addCurrency?" + window.authz,
|
||||
contentType: "application/json",
|
||||
@ -2068,7 +2134,7 @@ function doAddCurrency(currency) {
|
||||
}
|
||||
|
||||
function doQuestUpdate(operation, itemType) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/custom/manageQuests?" + window.authz + "&operation=" + operation + "&itemType=" + itemType,
|
||||
contentType: "application/json"
|
||||
@ -2079,7 +2145,7 @@ function doQuestUpdate(operation, itemType) {
|
||||
}
|
||||
|
||||
function doBulkQuestUpdate(operation) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/custom/manageQuests?" + window.authz + "&operation=" + operation,
|
||||
contentType: "application/json"
|
||||
@ -2177,7 +2243,7 @@ function handleModularSelection(category) {
|
||||
}
|
||||
|
||||
function setBooster(ItemType, ExpiryDate, callback) {
|
||||
revalidateAuthz(() => {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/custom/setBooster?" + window.authz,
|
||||
contentType: "application/json",
|
||||
@ -2249,3 +2315,262 @@ function formatDatetime(fmt, date) {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const calls_in_flight = new Set();
|
||||
|
||||
async function debounce(func, ...args) {
|
||||
calls_in_flight.add(func);
|
||||
await func(...args);
|
||||
calls_in_flight.delete(func);
|
||||
}
|
||||
|
||||
async function doMaxPlexus() {
|
||||
if ((window.plexus?.xp ?? 0) < 900_000) {
|
||||
await addGearExp("CrewShipHarnesses", window.plexus.id, 900_000 - window.plexus.xp);
|
||||
window.plexus.xp = 900_000;
|
||||
toast(loc("code_succRankUp"));
|
||||
} else {
|
||||
toast(loc("code_noEquipmentToRankUp"));
|
||||
}
|
||||
}
|
||||
|
||||
async function doUnlockAllMissions() {
|
||||
await revalidateAuthz();
|
||||
await fetch("/custom/completeAllMissions?" + window.authz);
|
||||
updateInventory();
|
||||
}
|
||||
|
||||
const importSamples = {
|
||||
maxFocus: {
|
||||
FocusUpgrades: [
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Attack/AttackFocusAbility"
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Attack/Stats/MoreAmmoFocusUpgrade",
|
||||
Level: 3,
|
||||
IsUniversal: true
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Attack/Residual/PowerSnapFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Attack/Residual/PhysicalDamageFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Attack/Active/CloakAttackChargeFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Attack/Stats/RegenAmmoFocusUpgrade",
|
||||
Level: 3,
|
||||
IsUniversal: true
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Tactic/TacticFocusAbility"
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Ward/WardFocusAbility"
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Defense/DefenseFocusAbility"
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Power/PowerFocusAbility"
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Ward/Active/KnockdownImmunityFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Ward/Active/UnairuWispFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Ward/Active/SunderingDissipationUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Ward/Active/MagneticExtensionUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Ward/Active/MagneticFieldFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Ward/Residual/ArmourBuffFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Ward/Active/ClearStaticOnKillFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Ward/Residual/SecondChanceDamageBuffFocusUpgrade",
|
||||
Level: 3,
|
||||
IsUniversal: true
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Ward/Residual/SecondChanceFocusUpgrade",
|
||||
Level: 3,
|
||||
IsUniversal: true
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Ward/Active/InvulnerableReturnFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Attack/Active/ConsecutivePowerUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Attack/Active/AttackEfficiencyFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Attack/Active/GhostlyTouchUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Attack/Active/GhostWaveUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Attack/Active/ConsecutiveEfficienyUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Tactic/Active/ProjectionStretchUpgrade",
|
||||
Level: 3,
|
||||
IsUniversal: true
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Tactic/Active/ProjectionExecutionUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Tactic/Active/FinisherTransferenceUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Tactic/Active/ComboAmpDamageFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Tactic/Residual/MeleeComboFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Tactic/Residual/MeleeXpFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Tactic/Active/LiftHitWaveUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Tactic/Active/LiftHitDamageUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Tactic/Stats/MoveSpeedFocusUpgrade",
|
||||
Level: 3,
|
||||
IsUniversal: true
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Tactic/Active/SlamComboFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Power/Active/PowerFieldFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Power/Active/DisarmedEnergyUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Power/Stats/EnergyPoolFocusUpgrade",
|
||||
Level: 3,
|
||||
IsUniversal: true
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Power/Residual/EnergyOverTimeFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Power/Active/BlastSlowFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Power/Stats/EnergyRestoreFocusUpgrade",
|
||||
Level: 3,
|
||||
IsUniversal: true
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Power/Residual/FreeAbilityCastsFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Power/Active/DisarmingProjectionUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Power/Residual/SlowHeadshotDamageFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Power/Active/DashBubbleFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Defense/Stats/HealthRegenFocusUpgrade",
|
||||
Level: 3,
|
||||
IsUniversal: true
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Defense/Residual/RadialXpFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Defense/Active/DefenseShieldFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Defense/Active/CloakHealFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Defense/Active/DefenseShieldBreakFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Defense/Active/DashImmunityFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Defense/Residual/InstantReviveFocusUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Defense/Active/SonicDissipationUpgrade",
|
||||
Level: 3
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Defense/Stats/HealthMaxFocusUpgrade",
|
||||
Level: 3,
|
||||
IsUniversal: true
|
||||
},
|
||||
{
|
||||
ItemType: "/Lotus/Upgrades/Focus/Defense/Active/CloakHealOthersFocusUpgrade",
|
||||
Level: 2
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
function setImportSample(key) {
|
||||
$("#import-inventory").val(JSON.stringify(importSamples[key], null, 2));
|
||||
}
|
||||
|
||||
@ -5,7 +5,6 @@ dict = {
|
||||
general_bulkActions: `Massenaktionen`,
|
||||
code_loginFail: `[UNTRANSLATED] Login failed. Double-check the email and password.`,
|
||||
code_regFail: `[UNTRANSLATED] Registration failed. Account already exists?`,
|
||||
code_nonValidAuthz: `Deine Anmeldedaten sind nicht mehr gültig.`,
|
||||
code_changeNameConfirm: `In welchen Namen möchtest du deinen Account umbenennen?`,
|
||||
code_deleteAccountConfirm: `Bist du sicher, dass du deinen Account |DISPLAYNAME| (|EMAIL|) löschen möchtest? Diese Aktion kann nicht rückgängig gemacht werden.`,
|
||||
code_archgun: `Arch-Gewehr`,
|
||||
@ -86,6 +85,7 @@ dict = {
|
||||
inventory_moaPets: `Moas`,
|
||||
inventory_kubrowPets: `Bestien`,
|
||||
inventory_evolutionProgress: `Incarnon-Entwicklungsfortschritte`,
|
||||
inventory_Boosters: `[UNTRANSLATED] Boosters`,
|
||||
inventory_bulkAddSuits: `Fehlende Warframes hinzufügen`,
|
||||
inventory_bulkAddWeapons: `Fehlende Waffen hinzufügen`,
|
||||
inventory_bulkAddSpaceSuits: `Fehlende Archwings hinzufügen`,
|
||||
@ -100,7 +100,7 @@ dict = {
|
||||
inventory_bulkRankUpSentinels: `Alle Wächter auf Max. Rang`,
|
||||
inventory_bulkRankUpSentinelWeapons: `Alle Wächter-Waffen auf Max. Rang`,
|
||||
inventory_bulkRankUpEvolutionProgress: `Alle Incarnon-Entwicklungsfortschritte auf Max. Rang`,
|
||||
inventory_Boosters: `[UNTRANSLATED] Boosters`,
|
||||
inventory_maxPlexus: `[UNTRANSLATED] Max Rank Plexus`,
|
||||
|
||||
quests_list: `Quests`,
|
||||
quests_completeAll: `Alle Quests abschließen`,
|
||||
@ -158,7 +158,11 @@ dict = {
|
||||
cheats_noVendorPurchaseLimits: `Keine Kaufbeschränkungen bei Händlern`,
|
||||
cheats_noDeathMarks: `Keine Todesmarkierungen`,
|
||||
cheats_noKimCooldowns: `Keine Wartezeit bei KIM`,
|
||||
cheats_fullyStockedVendors: `[UNTRANSLATED] Fully Stocked Vendors`,
|
||||
cheats_baroAlwaysAvailable: `[UNTRANSLATED] Baro Always Available`,
|
||||
cheats_baroFullyStocked: `[UNTRANSLATED] Baro Fully Stocked`,
|
||||
cheats_syndicateMissionsRepeatable: `Syndikat-Missionen wiederholbar`,
|
||||
cheats_unlockAllProfitTakerStages: `[UNTRANSLATED] Unlock All Profit Taker Stages`,
|
||||
cheats_instantFinishRivenChallenge: `Riven-Mod Herausforderung sofort abschließen`,
|
||||
cheats_instantResourceExtractorDrones: `Sofortige Ressourcen-Extraktor-Drohnen`,
|
||||
cheats_noResourceExtractorDronesDamage: `Kein Schaden für Ressourcen-Extraktor-Drohnen`,
|
||||
@ -169,6 +173,8 @@ dict = {
|
||||
cheats_noDojoResearchCosts: `Keine Dojo-Forschungskosten`,
|
||||
cheats_noDojoResearchTime: `Keine Dojo-Forschungszeit`,
|
||||
cheats_fastClanAscension: `Schneller Clan-Aufstieg`,
|
||||
cheats_missionsCanGiveAllRelics: `[UNTRANSLATED] Missions Can Give All Relics`,
|
||||
cheats_unlockAllSimarisResearchEntries: `[UNTRANSLATED] Unlock All Simaris Research Entries`,
|
||||
cheats_spoofMasteryRank: `Gefälschter Meisterschaftsrang (-1 zum deaktivieren)`,
|
||||
cheats_nightwaveStandingMultiplier: `[UNTRANSLATED] Nightwave Standing Multiplier`,
|
||||
cheats_save: `[UNTRANSLATED] Save`,
|
||||
@ -181,6 +187,8 @@ dict = {
|
||||
cheats_none: `Keines`,
|
||||
import_importNote: `Du kannst hier eine vollständige oder teilweise Inventarantwort (Client-Darstellung) einfügen. Alle Felder, die vom Importer unterstützt werden, <b>werden in deinem Account überschrieben</b>.`,
|
||||
import_submit: `Absenden`,
|
||||
import_samples: `[UNTRANSLATED] Samples:`,
|
||||
import_samples_maxFocus: `[UNTRANSLATED] All Focus Schools Maxed Out`,
|
||||
|
||||
upgrade_Equilibrium: `[UNTRANSLATED] +|VAL|% Energy from Health pickups, +|VAL|% Health from Energy pickups`,
|
||||
upgrade_MeleeCritDamage: `[UNTRANSLATED] +|VAL|% Melee Critical Damage`,
|
||||
@ -223,7 +231,7 @@ dict = {
|
||||
upgrade_DamageReductionOnHack: `[UNTRANSLATED] 75% Damage Reduction while Hacking`,
|
||||
upgrade_OnExecutionReviveCompanion: `[UNTRANSLATED] Mercy Kills reduce Companion Recovery by 15s`,
|
||||
upgrade_OnExecutionParkourSpeed: `[UNTRANSLATED] +60% Parkour Speed after a Mercy for 15s`,
|
||||
upgrade_AvatarTimeLimitIncrease: `[UNTRANSLATED] s to Hacking`,
|
||||
upgrade_AvatarTimeLimitIncrease: `[UNTRANSLATED] +8s to Hacking`,
|
||||
upgrade_ElectrifyOnHack: `[UNTRANSLATED] Shock enemies within 20m while Hacking`,
|
||||
upgrade_OnExecutionTerrify: `[UNTRANSLATED] 50% chance for enemies within 15m to cower in fear for 8 seconds on Mercy`,
|
||||
upgrade_OnHackLockers: `[UNTRANSLATED] Unlock 5 lockers within 20m after Hacking`,
|
||||
|
||||
@ -4,7 +4,6 @@ dict = {
|
||||
general_bulkActions: `Bulk Actions`,
|
||||
code_loginFail: `Login failed. Double-check the email and password.`,
|
||||
code_regFail: `Registration failed. Account already exists?`,
|
||||
code_nonValidAuthz: `Your credentials are no longer valid.`,
|
||||
code_changeNameConfirm: `What would you like to change your account name to?`,
|
||||
code_deleteAccountConfirm: `Are you sure you want to delete your account |DISPLAYNAME| (|EMAIL|)? This action cannot be undone.`,
|
||||
code_archgun: `Archgun`,
|
||||
@ -85,6 +84,7 @@ dict = {
|
||||
inventory_moaPets: `Moas`,
|
||||
inventory_kubrowPets: `Beasts`,
|
||||
inventory_evolutionProgress: `Incarnon Evolution Progress`,
|
||||
inventory_Boosters: `Boosters`,
|
||||
inventory_bulkAddSuits: `Add Missing Warframes`,
|
||||
inventory_bulkAddWeapons: `Add Missing Weapons`,
|
||||
inventory_bulkAddSpaceSuits: `Add Missing Archwings`,
|
||||
@ -99,7 +99,7 @@ dict = {
|
||||
inventory_bulkRankUpSentinels: `Max Rank All Sentinels`,
|
||||
inventory_bulkRankUpSentinelWeapons: `Max Rank All Sentinel Weapons`,
|
||||
inventory_bulkRankUpEvolutionProgress: `Max Rank All Incarnon Evolution Progress`,
|
||||
inventory_Boosters: `Boosters`,
|
||||
inventory_maxPlexus: `Max Rank Plexus`,
|
||||
|
||||
quests_list: `Quests`,
|
||||
quests_completeAll: `Complete All Quests`,
|
||||
@ -157,7 +157,11 @@ dict = {
|
||||
cheats_noVendorPurchaseLimits: `No Vendor Purchase Limits`,
|
||||
cheats_noDeathMarks: `No Death Marks`,
|
||||
cheats_noKimCooldowns: `No KIM Cooldowns`,
|
||||
cheats_fullyStockedVendors: `Fully Stocked Vendors`,
|
||||
cheats_baroAlwaysAvailable: `Baro Always Available`,
|
||||
cheats_baroFullyStocked: `Baro Fully Stocked`,
|
||||
cheats_syndicateMissionsRepeatable: `Syndicate Missions Repeatable`,
|
||||
cheats_unlockAllProfitTakerStages: `Unlock All Profit Taker Stages`,
|
||||
cheats_instantFinishRivenChallenge: `Instant Finish Riven Challenge`,
|
||||
cheats_instantResourceExtractorDrones: `Instant Resource Extractor Drones`,
|
||||
cheats_noResourceExtractorDronesDamage: `No Resource Extractor Drones Damage`,
|
||||
@ -168,6 +172,8 @@ dict = {
|
||||
cheats_noDojoResearchCosts: `No Dojo Research Costs`,
|
||||
cheats_noDojoResearchTime: `No Dojo Research Time`,
|
||||
cheats_fastClanAscension: `Fast Clan Ascension`,
|
||||
cheats_missionsCanGiveAllRelics: `Missions Can Give All Relics`,
|
||||
cheats_unlockAllSimarisResearchEntries: `Unlock All Simaris Research Entries`,
|
||||
cheats_spoofMasteryRank: `Spoofed Mastery Rank (-1 to disable)`,
|
||||
cheats_nightwaveStandingMultiplier: `Nightwave Standing Multiplier`,
|
||||
cheats_save: `Save`,
|
||||
@ -180,6 +186,8 @@ dict = {
|
||||
cheats_none: `None`,
|
||||
import_importNote: `You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer <b>will be overwritten</b> in your account.`,
|
||||
import_submit: `Submit`,
|
||||
import_samples: `Samples:`,
|
||||
import_samples_maxFocus: `All Focus Schools Maxed Out`,
|
||||
|
||||
upgrade_Equilibrium: `+|VAL|% Energy from Health pickups, +|VAL|% Health from Energy pickups`,
|
||||
upgrade_MeleeCritDamage: `+|VAL|% Melee Critical Damage`,
|
||||
@ -222,7 +230,7 @@ dict = {
|
||||
upgrade_DamageReductionOnHack: `75% Damage Reduction while Hacking`,
|
||||
upgrade_OnExecutionReviveCompanion: `Mercy Kills reduce Companion Recovery by 15s`,
|
||||
upgrade_OnExecutionParkourSpeed: `+60% Parkour Speed after a Mercy for 15s`,
|
||||
upgrade_AvatarTimeLimitIncrease: `s to Hacking`,
|
||||
upgrade_AvatarTimeLimitIncrease: `+8s to Hacking`,
|
||||
upgrade_ElectrifyOnHack: `Shock enemies within 20m while Hacking`,
|
||||
upgrade_OnExecutionTerrify: `50% chance for enemies within 15m to cower in fear for 8 seconds on Mercy`,
|
||||
upgrade_OnHackLockers: `Unlock 5 lockers within 20m after Hacking`,
|
||||
|
||||
@ -5,7 +5,6 @@ dict = {
|
||||
general_bulkActions: `Acciones masivas`,
|
||||
code_loginFail: `Error al iniciar sesión. Verifica el correo electrónico y la contraseña.`,
|
||||
code_regFail: `Error al registrar la cuenta. ¿Ya existe una cuenta con este correo?`,
|
||||
code_nonValidAuthz: `Tus credenciales no son válidas.`,
|
||||
code_changeNameConfirm: `¿Qué nombre te gustaría ponerle a tu cuenta?`,
|
||||
code_deleteAccountConfirm: `¿Estás seguro de que deseas eliminar tu cuenta |DISPLAYNAME| (|EMAIL|)? Esta acción es permanente.`,
|
||||
code_archgun: `Archcañón`,
|
||||
@ -86,6 +85,7 @@ dict = {
|
||||
inventory_moaPets: `Moas`,
|
||||
inventory_kubrowPets: `Bestias`,
|
||||
inventory_evolutionProgress: `Progreso de evolución Incarnon`,
|
||||
inventory_Boosters: `Potenciadores`,
|
||||
inventory_bulkAddSuits: `Agregar Warframes faltantes`,
|
||||
inventory_bulkAddWeapons: `Agregar armas faltantes`,
|
||||
inventory_bulkAddSpaceSuits: `Agregar Archwings faltantes`,
|
||||
@ -100,7 +100,7 @@ dict = {
|
||||
inventory_bulkRankUpSentinels: `Maximizar rango de todos los centinelas`,
|
||||
inventory_bulkRankUpSentinelWeapons: `Maximizar rango de todas las armas de centinela`,
|
||||
inventory_bulkRankUpEvolutionProgress: `Maximizar todo el progreso de evolución Incarnon`,
|
||||
inventory_Boosters: `Potenciadores`,
|
||||
inventory_maxPlexus: `Rango máximo de Plexus`,
|
||||
|
||||
quests_list: `Misiones`,
|
||||
quests_completeAll: `Completar todas las misiones`,
|
||||
@ -135,10 +135,10 @@ dict = {
|
||||
cheats_infiniteRegalAya: `Aya Real infinita`,
|
||||
cheats_infiniteHelminthMaterials: `Materiales Helminto infinitos`,
|
||||
cheats_claimingBlueprintRefundsIngredients: `Reclamar ingredientes devueltos por planos`,
|
||||
cheats_dontSubtractPurchaseCreditCost: `[UNTRANSLATED] Don't Subtract Purchase Credit Cost`,
|
||||
cheats_dontSubtractPurchasePlatinumCost: `[UNTRANSLATED] Don't Subtract Purchase Platinum Cost`,
|
||||
cheats_dontSubtractPurchaseItemCost: `[UNTRANSLATED] Don't Subtract Purchase Item Cost`,
|
||||
cheats_dontSubtractPurchaseStandingCost: `[UNTRANSLATED] Don't Subtract Purchase Standing Cost`,
|
||||
cheats_dontSubtractPurchaseCreditCost: `No restar costo en créditos de la compra`,
|
||||
cheats_dontSubtractPurchasePlatinumCost: `No restar costo en platino de la compra`,
|
||||
cheats_dontSubtractPurchaseItemCost: `No restar costo de ítem en la compra`,
|
||||
cheats_dontSubtractPurchaseStandingCost: `No restar costo en reputación de la compra`,
|
||||
cheats_dontSubtractVoidTraces: `No descontar vestigios del Vacío`,
|
||||
cheats_dontSubtractConsumables: `No restar consumibles`,
|
||||
cheats_unlockAllShipFeatures: `Desbloquear todas las funciones de nave`,
|
||||
@ -158,7 +158,11 @@ dict = {
|
||||
cheats_noVendorPurchaseLimits: `Sin límite de compras de vendedores`,
|
||||
cheats_noDeathMarks: `Sin marcas de muerte`,
|
||||
cheats_noKimCooldowns: `Sin tiempo de espera para conversaciones KIM`,
|
||||
cheats_fullyStockedVendors: `Vendedores con stock completo`,
|
||||
cheats_baroAlwaysAvailable: `Baro siempre disponible`,
|
||||
cheats_baroFullyStocked: `Baro con stock completo`,
|
||||
cheats_syndicateMissionsRepeatable: `Misiones de sindicato rejugables`,
|
||||
cheats_unlockAllProfitTakerStages: `Deslobquea todas las etapas del Roba-ganancias`,
|
||||
cheats_instantFinishRivenChallenge: `Terminar desafío de agrietado inmediatamente`,
|
||||
cheats_instantResourceExtractorDrones: `Drones de extracción de recursos instantáneos`,
|
||||
cheats_noResourceExtractorDronesDamage: `Sin daño a los drones extractores de recursos`,
|
||||
@ -169,6 +173,8 @@ dict = {
|
||||
cheats_noDojoResearchCosts: `Sin costo de investigación del dojo`,
|
||||
cheats_noDojoResearchTime: `Sin tiempo de investigación del dojo`,
|
||||
cheats_fastClanAscension: `Ascenso rápido del clan`,
|
||||
cheats_missionsCanGiveAllRelics: `Las misiones pueden otorgar todas las reliquias`,
|
||||
cheats_unlockAllSimarisResearchEntries: `Desbloquear todas las entradas de investigación de Simaris`,
|
||||
cheats_spoofMasteryRank: `Rango de maestría simulado (-1 para desactivar)`,
|
||||
cheats_nightwaveStandingMultiplier: `Multiplicador de Reputación de Onda Nocturna`,
|
||||
cheats_save: `Guardar`,
|
||||
@ -181,6 +187,8 @@ dict = {
|
||||
cheats_none: `Ninguno`,
|
||||
import_importNote: `Puedes proporcionar una respuesta de inventario completa o parcial (representación del cliente) aquí. Todos los campos compatibles con el importador <b>serán sobrescritos</b> en tu cuenta.`,
|
||||
import_submit: `Enviar`,
|
||||
import_samples: `Muestras:`,
|
||||
import_samples_maxFocus: `Todas las escuelas de enfoque al máximo`,
|
||||
|
||||
upgrade_Equilibrium: `+|VAL|% de Energía al recoger salud, +|VAL|% de Salud al recoger energía`,
|
||||
upgrade_MeleeCritDamage: `+|VAL|% de daño crítico cuerpo a cuerpo`,
|
||||
@ -223,7 +231,7 @@ dict = {
|
||||
upgrade_DamageReductionOnHack: `75% de reducción de daño al hackear`,
|
||||
upgrade_OnExecutionReviveCompanion: `Las ejecuciones reducen el tiempo de recuperación del compañero en 15s`,
|
||||
upgrade_OnExecutionParkourSpeed: `+60% de velocidad de parkour durante 15s tras una ejecución`,
|
||||
upgrade_AvatarTimeLimitIncrease: `+|VAL|s al tiempo de hackeo`,
|
||||
upgrade_AvatarTimeLimitIncrease: `[UNTRANSLATED] +8s to Hacking`,
|
||||
upgrade_ElectrifyOnHack: `Electrocuta a los enemigos en un radio de 20m al hackear`,
|
||||
upgrade_OnExecutionTerrify: `50% de probabilidad de que enemigos en un radio de 15m entren en pánico por 8s tras una ejecución`,
|
||||
upgrade_OnHackLockers: `Desbloquea 5 casilleros en un radio de 20m tras hackear`,
|
||||
|
||||
@ -5,7 +5,6 @@ dict = {
|
||||
general_bulkActions: `Action groupée`,
|
||||
code_loginFail: `[UNTRANSLATED] Login failed. Double-check the email and password.`,
|
||||
code_regFail: `[UNTRANSLATED] Registration failed. Account already exists?`,
|
||||
code_nonValidAuthz: `Informations de connexion invalides`,
|
||||
code_changeNameConfirm: `Nouveau nom du compte :`,
|
||||
code_deleteAccountConfirm: `Supprimer |DISPLAYNAME| (|EMAIL|) ? Cette action est irreversible.`,
|
||||
code_archgun: `Archgun`,
|
||||
@ -86,6 +85,7 @@ dict = {
|
||||
inventory_moaPets: `Moas`,
|
||||
inventory_kubrowPets: `Bêtes`,
|
||||
inventory_evolutionProgress: `Progrès de l'évolution Incarnon`,
|
||||
inventory_Boosters: `[UNTRANSLATED] Boosters`,
|
||||
inventory_bulkAddSuits: `Ajouter les Warframes manquantes`,
|
||||
inventory_bulkAddWeapons: `Ajouter les armes manquantes`,
|
||||
inventory_bulkAddSpaceSuits: `Ajouter les Archwings manquants`,
|
||||
@ -100,7 +100,7 @@ dict = {
|
||||
inventory_bulkRankUpSentinels: `Toutes les Sentinelles au rang max`,
|
||||
inventory_bulkRankUpSentinelWeapons: `Toutes les armes de Sentinelles au rang max`,
|
||||
inventory_bulkRankUpEvolutionProgress: `Toutes les évolutions Incarnon au rang max`,
|
||||
inventory_Boosters: `[UNTRANSLATED] Boosters`,
|
||||
inventory_maxPlexus: `[UNTRANSLATED] Max Rank Plexus`,
|
||||
|
||||
quests_list: `Quêtes`,
|
||||
quests_completeAll: `Compléter toutes les quêtes`,
|
||||
@ -158,7 +158,11 @@ dict = {
|
||||
cheats_noVendorPurchaseLimits: `Aucune limite d'achat chez les PNJ`,
|
||||
cheats_noDeathMarks: `Aucune marque d'assassin`,
|
||||
cheats_noKimCooldowns: `Aucun cooldown sur le KIM`,
|
||||
cheats_fullyStockedVendors: `[UNTRANSLATED] Fully Stocked Vendors`,
|
||||
cheats_baroAlwaysAvailable: `[UNTRANSLATED] Baro Always Available`,
|
||||
cheats_baroFullyStocked: `[UNTRANSLATED] Baro Fully Stocked`,
|
||||
cheats_syndicateMissionsRepeatable: `Mission syndicat répétables`,
|
||||
cheats_unlockAllProfitTakerStages: `[UNTRANSLATED] Unlock All Profit Taker Stages`,
|
||||
cheats_instantFinishRivenChallenge: `Débloquer le challenge Riven instantanément`,
|
||||
cheats_instantResourceExtractorDrones: `Ressources de drones d'extraction instantannées`,
|
||||
cheats_noResourceExtractorDronesDamage: `Aucun dégâts aux drones d'extraction de resources`,
|
||||
@ -169,6 +173,8 @@ dict = {
|
||||
cheats_noDojoResearchCosts: `Aucun coût de recherche (Dojo)`,
|
||||
cheats_noDojoResearchTime: `Aucun temps de recherche (Dojo)`,
|
||||
cheats_fastClanAscension: `Ascension de clan rapide`,
|
||||
cheats_missionsCanGiveAllRelics: `[UNTRANSLATED] Missions Can Give All Relics`,
|
||||
cheats_unlockAllSimarisResearchEntries: `[UNTRANSLATED] Unlock All Simaris Research Entries`,
|
||||
cheats_spoofMasteryRank: `Rang de maîtrise personnalisé (-1 pour désactiver)`,
|
||||
cheats_nightwaveStandingMultiplier: `[UNTRANSLATED] Nightwave Standing Multiplier`,
|
||||
cheats_save: `[UNTRANSLATED] Save`,
|
||||
@ -181,6 +187,8 @@ dict = {
|
||||
cheats_none: `Aucun`,
|
||||
import_importNote: `Import manuel. Toutes les modifcations supportées par l'inventaire <b>écraseront celles présentes dans la base de données</b>.`,
|
||||
import_submit: `Soumettre`,
|
||||
import_samples: `[UNTRANSLATED] Samples:`,
|
||||
import_samples_maxFocus: `[UNTRANSLATED] All Focus Schools Maxed Out`,
|
||||
|
||||
upgrade_Equilibrium: `[UNTRANSLATED] +|VAL|% Energy from Health pickups, +|VAL|% Health from Energy pickups`,
|
||||
upgrade_MeleeCritDamage: `[UNTRANSLATED] +|VAL|% Melee Critical Damage`,
|
||||
@ -223,7 +231,7 @@ dict = {
|
||||
upgrade_DamageReductionOnHack: `[UNTRANSLATED] 75% Damage Reduction while Hacking`,
|
||||
upgrade_OnExecutionReviveCompanion: `[UNTRANSLATED] Mercy Kills reduce Companion Recovery by 15s`,
|
||||
upgrade_OnExecutionParkourSpeed: `[UNTRANSLATED] +60% Parkour Speed after a Mercy for 15s`,
|
||||
upgrade_AvatarTimeLimitIncrease: `[UNTRANSLATED] s to Hacking`,
|
||||
upgrade_AvatarTimeLimitIncrease: `[UNTRANSLATED] +8s to Hacking`,
|
||||
upgrade_ElectrifyOnHack: `[UNTRANSLATED] Shock enemies within 20m while Hacking`,
|
||||
upgrade_OnExecutionTerrify: `[UNTRANSLATED] 50% chance for enemies within 15m to cower in fear for 8 seconds on Mercy`,
|
||||
upgrade_OnHackLockers: `[UNTRANSLATED] Unlock 5 lockers within 20m after Hacking`,
|
||||
|
||||
@ -5,7 +5,6 @@ dict = {
|
||||
general_bulkActions: `Массовые действия`,
|
||||
code_loginFail: `[UNTRANSLATED] Login failed. Double-check the email and password.`,
|
||||
code_regFail: `[UNTRANSLATED] Registration failed. Account already exists?`,
|
||||
code_nonValidAuthz: `Ваши данные больше не действительны.`,
|
||||
code_changeNameConfirm: `Какое имя вы хотите установить для своей учетной записи?`,
|
||||
code_deleteAccountConfirm: `Вы уверены, что хотите удалить аккаунт |DISPLAYNAME| (|EMAIL|)? Это действие нельзя отменить.`,
|
||||
code_archgun: `Арч-Пушка`,
|
||||
@ -86,6 +85,7 @@ dict = {
|
||||
inventory_moaPets: `МОА`,
|
||||
inventory_kubrowPets: `Звери`,
|
||||
inventory_evolutionProgress: `Прогресс эволюции Инкарнонов`,
|
||||
inventory_Boosters: `[UNTRANSLATED] Boosters`,
|
||||
inventory_bulkAddSuits: `Добавить отсутствующие варфреймы`,
|
||||
inventory_bulkAddWeapons: `Добавить отсутствующее оружие`,
|
||||
inventory_bulkAddSpaceSuits: `Добавить отсутствующие арчвинги`,
|
||||
@ -100,7 +100,7 @@ dict = {
|
||||
inventory_bulkRankUpSentinels: `Максимальный ранг всех стражей`,
|
||||
inventory_bulkRankUpSentinelWeapons: `Максимальный ранг всего оружия стражей`,
|
||||
inventory_bulkRankUpEvolutionProgress: `Максимальный ранг всех эволюций Инкарнонов`,
|
||||
inventory_Boosters: `[UNTRANSLATED] Boosters`,
|
||||
inventory_maxPlexus: `[UNTRANSLATED] Max Rank Plexus`,
|
||||
|
||||
quests_list: `Квесты`,
|
||||
quests_completeAll: `Завершить все квесты`,
|
||||
@ -158,7 +158,11 @@ dict = {
|
||||
cheats_noVendorPurchaseLimits: `Отсутствие лимитов на покупки у вендоров`,
|
||||
cheats_noDeathMarks: `Без меток сметри`,
|
||||
cheats_noKimCooldowns: `Чаты KIM без кулдауна`,
|
||||
cheats_fullyStockedVendors: `[UNTRANSLATED] Fully Stocked Vendors`,
|
||||
cheats_baroAlwaysAvailable: `[UNTRANSLATED] Baro Always Available`,
|
||||
cheats_baroFullyStocked: `[UNTRANSLATED] Baro Fully Stocked`,
|
||||
cheats_syndicateMissionsRepeatable: `[UNTRANSLATED] Syndicate Missions Repeatable`,
|
||||
cheats_unlockAllProfitTakerStages: `[UNTRANSLATED] Unlock All Profit Taker Stages`,
|
||||
cheats_instantFinishRivenChallenge: `[UNTRANSLATED] Instant Finish Riven Challenge`,
|
||||
cheats_instantResourceExtractorDrones: `Мгновенные Экстракторы Ресурсов`,
|
||||
cheats_noResourceExtractorDronesDamage: `Без урона по дронам-сборщикам`,
|
||||
@ -169,6 +173,8 @@ dict = {
|
||||
cheats_noDojoResearchCosts: `Бесплатные Исследование Додзё`,
|
||||
cheats_noDojoResearchTime: `Мгновенные Исследование Додзё`,
|
||||
cheats_fastClanAscension: `Мгновенное Вознесение Клана`,
|
||||
cheats_missionsCanGiveAllRelics: `[UNTRANSLATED] Missions Can Give All Relics`,
|
||||
cheats_unlockAllSimarisResearchEntries: `[UNTRANSLATED] Unlock All Simaris Research Entries`,
|
||||
cheats_spoofMasteryRank: `Подделанный ранг мастерства (-1 для отключения)`,
|
||||
cheats_nightwaveStandingMultiplier: `[UNTRANSLATED] Nightwave Standing Multiplier`,
|
||||
cheats_save: `[UNTRANSLATED] Save`,
|
||||
@ -181,6 +187,8 @@ dict = {
|
||||
cheats_none: `Отсутствует`,
|
||||
import_importNote: `Вы можете загрузить полный или частичный ответ инвентаря (клиентское представление) здесь. Все поддерживаемые поля <b>будут перезаписаны</b> в вашем аккаунте.`,
|
||||
import_submit: `Отправить`,
|
||||
import_samples: `[UNTRANSLATED] Samples:`,
|
||||
import_samples_maxFocus: `[UNTRANSLATED] All Focus Schools Maxed Out`,
|
||||
|
||||
upgrade_Equilibrium: `[UNTRANSLATED] +|VAL|% Energy from Health pickups, +|VAL|% Health from Energy pickups`,
|
||||
upgrade_MeleeCritDamage: `[UNTRANSLATED] +|VAL|% Melee Critical Damage`,
|
||||
@ -223,7 +231,7 @@ dict = {
|
||||
upgrade_DamageReductionOnHack: `[UNTRANSLATED] 75% Damage Reduction while Hacking`,
|
||||
upgrade_OnExecutionReviveCompanion: `[UNTRANSLATED] Mercy Kills reduce Companion Recovery by 15s`,
|
||||
upgrade_OnExecutionParkourSpeed: `[UNTRANSLATED] +60% Parkour Speed after a Mercy for 15s`,
|
||||
upgrade_AvatarTimeLimitIncrease: `[UNTRANSLATED] s to Hacking`,
|
||||
upgrade_AvatarTimeLimitIncrease: `[UNTRANSLATED] +8s to Hacking`,
|
||||
upgrade_ElectrifyOnHack: `[UNTRANSLATED] Shock enemies within 20m while Hacking`,
|
||||
upgrade_OnExecutionTerrify: `[UNTRANSLATED] 50% chance for enemies within 15m to cower in fear for 8 seconds on Mercy`,
|
||||
upgrade_OnHackLockers: `[UNTRANSLATED] Unlock 5 lockers within 20m after Hacking`,
|
||||
|
||||
@ -5,7 +5,6 @@ dict = {
|
||||
general_bulkActions: `批量操作`,
|
||||
code_loginFail: `登录失败。请检查邮箱和密码。`,
|
||||
code_regFail: `注册失败。账号已存在。`,
|
||||
code_nonValidAuthz: `您的登录凭证已失效。`,
|
||||
code_changeNameConfirm: `您想将账户名称更改为什么?`,
|
||||
code_deleteAccountConfirm: `确定要删除账户 |DISPLAYNAME| (|EMAIL|) 吗?此操作不可撤销。`,
|
||||
code_archgun: `空战`,
|
||||
@ -86,6 +85,7 @@ dict = {
|
||||
inventory_moaPets: `恐鸟`,
|
||||
inventory_kubrowPets: `动物同伴`,
|
||||
inventory_evolutionProgress: `灵化之源进度`,
|
||||
inventory_Boosters: `加成器`,
|
||||
inventory_bulkAddSuits: `添加缺失战甲`,
|
||||
inventory_bulkAddWeapons: `添加缺失武器`,
|
||||
inventory_bulkAddSpaceSuits: `添加缺失Archwing`,
|
||||
@ -100,7 +100,7 @@ dict = {
|
||||
inventory_bulkRankUpSentinels: `所有守护升满级`,
|
||||
inventory_bulkRankUpSentinelWeapons: `所有守护武器升满级`,
|
||||
inventory_bulkRankUpEvolutionProgress: `所有灵化之源最大等级`,
|
||||
inventory_Boosters: `加成器`,
|
||||
inventory_maxPlexus: `最大深控等级`,
|
||||
|
||||
quests_list: `任务`,
|
||||
quests_completeAll: `完成所有任务`,
|
||||
@ -135,10 +135,10 @@ dict = {
|
||||
cheats_infiniteRegalAya: `无限御品阿耶`,
|
||||
cheats_infiniteHelminthMaterials: `无限Helminth材料`,
|
||||
cheats_claimingBlueprintRefundsIngredients: `取消蓝图制造时返还材料`,
|
||||
cheats_dontSubtractPurchaseCreditCost: `[UNTRANSLATED] Don't Subtract Purchase Credit Cost`,
|
||||
cheats_dontSubtractPurchasePlatinumCost: `[UNTRANSLATED] Don't Subtract Purchase Platinum Cost`,
|
||||
cheats_dontSubtractPurchaseItemCost: `[UNTRANSLATED] Don't Subtract Purchase Item Cost`,
|
||||
cheats_dontSubtractPurchaseStandingCost: `[UNTRANSLATED] Don't Subtract Purchase Standing Cost`,
|
||||
cheats_dontSubtractPurchaseCreditCost: `不减少现金花费`,
|
||||
cheats_dontSubtractPurchasePlatinumCost: `不减少白金花费`,
|
||||
cheats_dontSubtractPurchaseItemCost: `不减少物品花费`,
|
||||
cheats_dontSubtractPurchaseStandingCost: `不减少声望花费`,
|
||||
cheats_dontSubtractVoidTraces: `虚空光体无消耗`,
|
||||
cheats_dontSubtractConsumables: `消耗物品使用时无损耗`,
|
||||
cheats_unlockAllShipFeatures: `解锁所有飞船功能`,
|
||||
@ -158,7 +158,11 @@ dict = {
|
||||
cheats_noVendorPurchaseLimits: `商城或商人无购买限制`,
|
||||
cheats_noDeathMarks: `无死亡标记(不会被 Stalker/Grustrag 三霸/Zanuka 猎人等标记)`,
|
||||
cheats_noKimCooldowns: `无 KIM 冷却时间`,
|
||||
cheats_fullyStockedVendors: `[UNTRANSLATED] Fully Stocked Vendors`,
|
||||
cheats_baroAlwaysAvailable: `[UNTRANSLATED] Baro Always Available`,
|
||||
cheats_baroFullyStocked: `[UNTRANSLATED] Baro Fully Stocked`,
|
||||
cheats_syndicateMissionsRepeatable: `集团任务可重复`,
|
||||
cheats_unlockAllProfitTakerStages: `解锁利润收割者圆蛛所有阶段`,
|
||||
cheats_instantFinishRivenChallenge: `立即完成裂罅挑战`,
|
||||
cheats_instantResourceExtractorDrones: `即时资源采集无人机`,
|
||||
cheats_noResourceExtractorDronesDamage: `资源提取器不会损毁`,
|
||||
@ -169,9 +173,11 @@ dict = {
|
||||
cheats_noDojoResearchCosts: `无视道场研究消耗`,
|
||||
cheats_noDojoResearchTime: `无视道场研究时间`,
|
||||
cheats_fastClanAscension: `快速升级氏族`,
|
||||
cheats_missionsCanGiveAllRelics: `任务可获取所有遗物`,
|
||||
cheats_unlockAllSimarisResearchEntries: `[UNTRANSLATED] Unlock All Simaris Research Entries`,
|
||||
cheats_spoofMasteryRank: `伪造精通段位(-1为禁用)`,
|
||||
cheats_nightwaveStandingMultiplier: `午夜电波声望倍率`,
|
||||
cheats_save: `[UNTRANSLATED] Save`,
|
||||
cheats_save: `保存`,
|
||||
cheats_account: `账户`,
|
||||
cheats_unlockAllFocusSchools: `解锁所有专精学派`,
|
||||
cheats_helminthUnlockAll: `完全升级Helminth`,
|
||||
@ -181,6 +187,8 @@ dict = {
|
||||
cheats_none: `无`,
|
||||
import_importNote: `您可以在此处提供完整或部分库存响应(客户端表示)。支持的所有字段<b>将被覆盖</b>到您的账户中。`,
|
||||
import_submit: `提交`,
|
||||
import_samples: `[UNTRANSLATED] Samples:`,
|
||||
import_samples_maxFocus: `[UNTRANSLATED] All Focus Schools Maxed Out`,
|
||||
|
||||
upgrade_Equilibrium: `+|VAL|% 能量 来自生命球, +|VAL|% 生命 来自能量球`,
|
||||
upgrade_MeleeCritDamage: `+|VAL|% 近战暴击伤害`,
|
||||
@ -189,7 +197,7 @@ dict = {
|
||||
upgrade_WarframeAbilityDuration: `+|VAL|% 技能持续时间`,
|
||||
upgrade_WarframeAbilityStrength: `+|VAL|% 技能强度`,
|
||||
upgrade_WarframeArmourMax: `+|VAL| 护甲`,
|
||||
upgrade_WarframeBlastProc: `[UNTRANSLATED] +|VAL| Shields on kill with Blast Damage`,
|
||||
upgrade_WarframeBlastProc: `+|VAL| 护盾在击杀时附带爆炸伤害`,
|
||||
upgrade_WarframeCastingSpeed: `+|VAL|% 施放速度`,
|
||||
upgrade_WarframeCorrosiveDamageBoost: `对受腐蚀状态影响的敌人 +|VAL|% 技能伤害`,
|
||||
upgrade_WarframeCorrosiveStack: `腐蚀状态最大堆叠数 +|VAL|`,
|
||||
@ -223,7 +231,7 @@ dict = {
|
||||
upgrade_DamageReductionOnHack: `入侵时,+75% 伤害减免`,
|
||||
upgrade_OnExecutionReviveCompanion: `怜悯之击 减少同伴复苏时间 15秒`,
|
||||
upgrade_OnExecutionParkourSpeed: `怜悯之击 15秒内 +60% 跑酷速度`,
|
||||
upgrade_AvatarTimeLimitIncrease: `增加入侵限制时间`,
|
||||
upgrade_AvatarTimeLimitIncrease: `[UNTRANSLATED] +8s to Hacking`,
|
||||
upgrade_ElectrifyOnHack: `入侵时震慑20米之内的敌人`,
|
||||
upgrade_OnExecutionTerrify: `怜悯之击 50% 几率让 15米 以内的敌人恐慌`,
|
||||
upgrade_OnHackLockers: `入侵后解锁20米内的5个储物柜`,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user