feat: acquisition of peely pix + free pack for first visit (#1292)
Reviewed-on: #1292
This commit is contained in:
parent
e0d31b8988
commit
b5a0a2297e
@ -10,8 +10,7 @@ import { IGenericUpdate } from "@/src/types/genericUpdate";
|
|||||||
const genericUpdateController: RequestHandler = async (request, response) => {
|
const genericUpdateController: RequestHandler = async (request, response) => {
|
||||||
const accountId = await getAccountIdForRequest(request);
|
const accountId = await getAccountIdForRequest(request);
|
||||||
const update = getJSONfromString<IGenericUpdate>(String(request.body));
|
const update = getJSONfromString<IGenericUpdate>(String(request.body));
|
||||||
await updateGeneric(update, accountId);
|
response.json(await updateGeneric(update, accountId));
|
||||||
response.json(update);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export { genericUpdateController };
|
export { genericUpdateController };
|
||||||
|
@ -28,7 +28,7 @@ import {
|
|||||||
IUpgradeClient,
|
IUpgradeClient,
|
||||||
ICrewShipWeaponClient
|
ICrewShipWeaponClient
|
||||||
} from "@/src/types/inventoryTypes/inventoryTypes";
|
} from "@/src/types/inventoryTypes/inventoryTypes";
|
||||||
import { IGenericUpdate } from "../types/genericUpdate";
|
import { IGenericUpdate, IUpdateNodeIntrosResponse } from "../types/genericUpdate";
|
||||||
import {
|
import {
|
||||||
IMissionInventoryUpdateRequest,
|
IMissionInventoryUpdateRequest,
|
||||||
IThemeUpdateRequest,
|
IThemeUpdateRequest,
|
||||||
@ -574,6 +574,39 @@ export const addItem = async (
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "Stickers":
|
||||||
|
{
|
||||||
|
const entry = inventory.RawUpgrades.find(x => x.ItemType == typeName);
|
||||||
|
if (entry && entry.ItemCount >= 10) {
|
||||||
|
const miscItemChanges = [
|
||||||
|
{
|
||||||
|
ItemType: "/Lotus/Types/Items/MiscItems/1999ConquestBucks",
|
||||||
|
ItemCount: 1
|
||||||
|
}
|
||||||
|
];
|
||||||
|
addMiscItems(inventory, miscItemChanges);
|
||||||
|
return {
|
||||||
|
InventoryChanges: {
|
||||||
|
MiscItems: miscItemChanges
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
const changes = [
|
||||||
|
{
|
||||||
|
ItemType: typeName,
|
||||||
|
ItemCount: quantity
|
||||||
|
}
|
||||||
|
];
|
||||||
|
addMods(inventory, changes);
|
||||||
|
return {
|
||||||
|
InventoryChanges: {
|
||||||
|
RawUpgrades: changes
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -876,14 +909,27 @@ export const updateStandingLimit = (
|
|||||||
};
|
};
|
||||||
|
|
||||||
// TODO: AffiliationMods support (Nightwave).
|
// TODO: AffiliationMods support (Nightwave).
|
||||||
export const updateGeneric = async (data: IGenericUpdate, accountId: string): Promise<void> => {
|
export const updateGeneric = async (data: IGenericUpdate, accountId: string): Promise<IUpdateNodeIntrosResponse> => {
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(accountId, "NodeIntrosCompleted MiscItems");
|
||||||
|
|
||||||
// Make it an array for easier parsing.
|
// Make it an array for easier parsing.
|
||||||
if (typeof data.NodeIntrosCompleted === "string") {
|
if (typeof data.NodeIntrosCompleted === "string") {
|
||||||
data.NodeIntrosCompleted = [data.NodeIntrosCompleted];
|
data.NodeIntrosCompleted = [data.NodeIntrosCompleted];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const inventoryChanges: IInventoryChanges = {};
|
||||||
|
for (const node of data.NodeIntrosCompleted) {
|
||||||
|
if (node == "KayaFirstVisitPack") {
|
||||||
|
inventoryChanges.MiscItems = [
|
||||||
|
{
|
||||||
|
ItemType: "/Lotus/Types/Items/MiscItems/1999FixedStickersPack",
|
||||||
|
ItemCount: 1
|
||||||
|
}
|
||||||
|
];
|
||||||
|
addMiscItems(inventory, inventoryChanges.MiscItems);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Combine the two arrays into one.
|
// Combine the two arrays into one.
|
||||||
data.NodeIntrosCompleted = inventory.NodeIntrosCompleted.concat(data.NodeIntrosCompleted);
|
data.NodeIntrosCompleted = inventory.NodeIntrosCompleted.concat(data.NodeIntrosCompleted);
|
||||||
|
|
||||||
@ -892,6 +938,11 @@ export const updateGeneric = async (data: IGenericUpdate, accountId: string): Pr
|
|||||||
|
|
||||||
inventory.NodeIntrosCompleted = nodes;
|
inventory.NodeIntrosCompleted = nodes;
|
||||||
await inventory.save();
|
await inventory.save();
|
||||||
|
|
||||||
|
return {
|
||||||
|
MissionRewards: [],
|
||||||
|
InventoryChanges: inventoryChanges
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export const updateTheme = async (data: IThemeUpdateRequest, accountId: string): Promise<void> => {
|
export const updateTheme = async (data: IThemeUpdateRequest, accountId: string): Promise<void> => {
|
||||||
|
@ -54,11 +54,16 @@ export const handlePurchase = async (
|
|||||||
if (purchaseRequest.PurchaseParams.Source == 7) {
|
if (purchaseRequest.PurchaseParams.Source == 7) {
|
||||||
const manifest = getVendorManifestByOid(purchaseRequest.PurchaseParams.SourceId!);
|
const manifest = getVendorManifestByOid(purchaseRequest.PurchaseParams.SourceId!);
|
||||||
if (manifest) {
|
if (manifest) {
|
||||||
const ItemId = (JSON.parse(purchaseRequest.PurchaseParams.ExtraPurchaseInfoJson!) as { ItemId: string })
|
let ItemId: string | undefined;
|
||||||
|
if (purchaseRequest.PurchaseParams.ExtraPurchaseInfoJson) {
|
||||||
|
ItemId = (JSON.parse(purchaseRequest.PurchaseParams.ExtraPurchaseInfoJson) as { ItemId: string })
|
||||||
.ItemId;
|
.ItemId;
|
||||||
const offer = manifest.VendorInfo.ItemManifest.find(x => x.Id.$oid == ItemId);
|
}
|
||||||
|
const offer = ItemId
|
||||||
|
? manifest.VendorInfo.ItemManifest.find(x => x.Id.$oid == ItemId)
|
||||||
|
: manifest.VendorInfo.ItemManifest.find(x => x.StoreItem == purchaseRequest.PurchaseParams.StoreItem);
|
||||||
if (!offer) {
|
if (!offer) {
|
||||||
throw new Error(`unknown vendor offer: ${ItemId}`);
|
throw new Error(`unknown vendor offer: ${ItemId ? ItemId : purchaseRequest.PurchaseParams.StoreItem}`);
|
||||||
}
|
}
|
||||||
if (offer.ItemPrices) {
|
if (offer.ItemPrices) {
|
||||||
handleItemPrices(
|
handleItemPrices(
|
||||||
@ -68,7 +73,7 @@ export const handlePurchase = async (
|
|||||||
prePurchaseInventoryChanges
|
prePurchaseInventoryChanges
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (!config.noVendorPurchaseLimits) {
|
if (!config.noVendorPurchaseLimits && ItemId) {
|
||||||
inventory.RecentVendorPurchases ??= [];
|
inventory.RecentVendorPurchases ??= [];
|
||||||
let vendorPurchases = inventory.RecentVendorPurchases.find(
|
let vendorPurchases = inventory.RecentVendorPurchases.find(
|
||||||
x => x.VendorType == manifest.VendorInfo.TypeName
|
x => x.VendorType == manifest.VendorInfo.TypeName
|
||||||
@ -410,6 +415,15 @@ const handleBoosterPackPurchase = async (
|
|||||||
"attempt to roll over 100 booster packs in a single go. possible but unlikely to be desirable for the user or the server."
|
"attempt to roll over 100 booster packs in a single go. possible but unlikely to be desirable for the user or the server."
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (typeName == "/Lotus/Types/BoosterPacks/1999StickersPackEchoesArchimedeaFixed") {
|
||||||
|
for (const result of pack.components) {
|
||||||
|
purchaseResponse.BoosterPackItems += toStoreItem(result.Item) + ',{"lvl":0};';
|
||||||
|
combineInventoryChanges(
|
||||||
|
purchaseResponse.InventoryChanges,
|
||||||
|
(await addItem(inventory, result.Item, 1)).InventoryChanges
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
for (let i = 0; i != quantity; ++i) {
|
for (let i = 0; i != quantity; ++i) {
|
||||||
for (const weights of pack.rarityWeightsPerRoll) {
|
for (const weights of pack.rarityWeightsPerRoll) {
|
||||||
const result = getRandomWeightedRewardUc(pack.components, weights);
|
const result = getRandomWeightedRewardUc(pack.components, weights);
|
||||||
@ -423,6 +437,7 @@ const handleBoosterPackPurchase = async (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return purchaseResponse;
|
return purchaseResponse;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ import HubsIronwakeDondaVendorManifest from "@/static/fixed_responses/getVendorI
|
|||||||
import HubsPerrinSequenceWeaponVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsPerrinSequenceWeaponVendorManifest.json";
|
import HubsPerrinSequenceWeaponVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsPerrinSequenceWeaponVendorManifest.json";
|
||||||
import HubsRailjackCrewMemberVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsRailjackCrewMemberVendorManifest.json";
|
import HubsRailjackCrewMemberVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsRailjackCrewMemberVendorManifest.json";
|
||||||
import MaskSalesmanManifest from "@/static/fixed_responses/getVendorInfo/MaskSalesmanManifest.json";
|
import MaskSalesmanManifest from "@/static/fixed_responses/getVendorInfo/MaskSalesmanManifest.json";
|
||||||
|
import Nova1999ConquestShopManifest from "@/static/fixed_responses/getVendorInfo/Nova1999ConquestShopManifest.json";
|
||||||
import OstronFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronFishmongerVendorManifest.json";
|
import OstronFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronFishmongerVendorManifest.json";
|
||||||
import OstronPetVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronPetVendorManifest.json";
|
import OstronPetVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronPetVendorManifest.json";
|
||||||
import OstronProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronProspectorVendorManifest.json";
|
import OstronProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronProspectorVendorManifest.json";
|
||||||
@ -69,6 +70,7 @@ const vendorManifests: IVendorManifest[] = [
|
|||||||
HubsPerrinSequenceWeaponVendorManifest,
|
HubsPerrinSequenceWeaponVendorManifest,
|
||||||
HubsRailjackCrewMemberVendorManifest,
|
HubsRailjackCrewMemberVendorManifest,
|
||||||
MaskSalesmanManifest,
|
MaskSalesmanManifest,
|
||||||
|
Nova1999ConquestShopManifest,
|
||||||
OstronFishmongerVendorManifest,
|
OstronFishmongerVendorManifest,
|
||||||
OstronPetVendorManifest,
|
OstronPetVendorManifest,
|
||||||
OstronProspectorVendorManifest,
|
OstronProspectorVendorManifest,
|
||||||
|
@ -1,4 +1,11 @@
|
|||||||
|
import { IInventoryChanges } from "./purchaseTypes";
|
||||||
|
|
||||||
export interface IGenericUpdate {
|
export interface IGenericUpdate {
|
||||||
NodeIntrosCompleted: string | string[];
|
NodeIntrosCompleted: string | string[];
|
||||||
// AffiliationMods: any[];
|
// AffiliationMods: any[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IUpdateNodeIntrosResponse {
|
||||||
|
MissionRewards: [];
|
||||||
|
InventoryChanges: IInventoryChanges;
|
||||||
|
}
|
||||||
|
@ -0,0 +1,188 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user