feat: purchase modular weapon from daily special (#1217)
Closes #685 Reviewed-on: OpenWF/SpaceNinjaServer#1217
This commit is contained in:
parent
1d091e3c4c
commit
0be54dd7ce
@ -1,7 +1,6 @@
|
||||
import { RequestHandler } from "express";
|
||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||
import { TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||
import {
|
||||
getInventory,
|
||||
updateCurrency,
|
||||
@ -11,26 +10,9 @@ import {
|
||||
occupySlot,
|
||||
productCategoryToInventoryBin
|
||||
} from "@/src/services/inventoryService";
|
||||
import { ExportWeapons } from "warframe-public-export-plus";
|
||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
||||
|
||||
const modularWeaponTypes: Record<string, TEquipmentKey> = {
|
||||
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimary": "LongGuns",
|
||||
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryBeam": "LongGuns",
|
||||
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryLauncher": "LongGuns",
|
||||
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryShotgun": "LongGuns",
|
||||
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimarySniper": "LongGuns",
|
||||
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary": "Pistols",
|
||||
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryBeam": "Pistols",
|
||||
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryShotgun": "Pistols",
|
||||
"/Lotus/Weapons/Ostron/Melee/LotusModularWeapon": "Melee",
|
||||
"/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon": "OperatorAmps",
|
||||
"/Lotus/Types/Vehicles/Hoverboard/HoverboardSuit": "Hoverboards",
|
||||
"/Lotus/Types/Friendly/Pets/MoaPets/MoaPetPowerSuit": "MoaPets",
|
||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetAPowerSuit": "MoaPets",
|
||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetBPowerSuit": "MoaPets",
|
||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetCPowerSuit": "MoaPets"
|
||||
};
|
||||
import { getDefaultUpgrades } from "@/src/services/itemDataService";
|
||||
import { modularWeaponTypes } from "@/src/helpers/modularWeaponHelper";
|
||||
|
||||
interface IModularCraftRequest {
|
||||
WeaponType: string;
|
||||
@ -46,14 +28,15 @@ export const modularWeaponCraftingController: RequestHandler = async (req, res)
|
||||
const category = modularWeaponTypes[data.WeaponType];
|
||||
const inventory = await getInventory(accountId);
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
||||
const configs = applyDefaultUpgrades(inventory, ExportWeapons[data.Parts[0]]?.defaultUpgrades);
|
||||
|
||||
// Give weapon
|
||||
const defaultUpgrades = getDefaultUpgrades(data.Parts);
|
||||
const configs = applyDefaultUpgrades(inventory, defaultUpgrades);
|
||||
const inventoryChanges: IInventoryChanges = {
|
||||
...addEquipment(inventory, category, data.WeaponType, data.Parts, {}, { Configs: configs }),
|
||||
...occupySlot(inventory, productCategoryToInventoryBin(category)!, false)
|
||||
};
|
||||
if (defaultUpgrades) {
|
||||
inventoryChanges.RawUpgrades = defaultUpgrades.map(x => ({ ItemType: x.ItemType, ItemCount: 1 }));
|
||||
}
|
||||
|
||||
// Remove credits & parts
|
||||
const miscItemChanges = [];
|
||||
|
@ -3,9 +3,22 @@ import { ExportWeapons } from "warframe-public-export-plus";
|
||||
import { IMongoDate } from "@/src/types/commonTypes";
|
||||
import { toMongoDate } from "@/src/helpers/inventoryHelpers";
|
||||
import { CRng } from "@/src/services/rngService";
|
||||
import { ArtifactPolarity, EquipmentFeatures } from "@/src/types/inventoryTypes/commonInventoryTypes";
|
||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||
import {
|
||||
addEquipment,
|
||||
applyDefaultUpgrades,
|
||||
getInventory,
|
||||
occupySlot,
|
||||
productCategoryToInventoryBin,
|
||||
updateCurrency
|
||||
} from "@/src/services/inventoryService";
|
||||
import { getDefaultUpgrades } from "@/src/services/itemDataService";
|
||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import { modularWeaponTypes } from "@/src/helpers/modularWeaponHelper";
|
||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
||||
|
||||
// op=SyncAll
|
||||
export const modularWeaponSaleController: RequestHandler = (_req, res) => {
|
||||
export const modularWeaponSaleController: RequestHandler = async (req, res) => {
|
||||
const partTypeToParts: Record<string, string[]> = {};
|
||||
for (const [uniqueName, data] of Object.entries(ExportWeapons)) {
|
||||
if (data.partType) {
|
||||
@ -15,34 +28,80 @@ export const modularWeaponSaleController: RequestHandler = (_req, res) => {
|
||||
}
|
||||
}
|
||||
|
||||
const today: number = Math.trunc(Date.now() / 86400000);
|
||||
const kitgunIsPrimary: boolean = (today & 1) != 0;
|
||||
if (req.query.op == "SyncAll") {
|
||||
res.json({
|
||||
SaleInfos: [
|
||||
SaleInfos: getSaleInfos(partTypeToParts, Math.trunc(Date.now() / 86400000))
|
||||
});
|
||||
} else if (req.query.op == "Purchase") {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const inventory = await getInventory(accountId);
|
||||
const payload = getJSONfromString<IModularWeaponPurchaseRequest>(String(req.body));
|
||||
const weaponInfo = getSaleInfos(partTypeToParts, payload.Revision).find(x => x.Name == payload.SaleName)!
|
||||
.Weapons[payload.ItemIndex];
|
||||
const category = modularWeaponTypes[weaponInfo.ItemType];
|
||||
const defaultUpgrades = getDefaultUpgrades(weaponInfo.ModularParts);
|
||||
const configs = applyDefaultUpgrades(inventory, defaultUpgrades);
|
||||
const inventoryChanges: IInventoryChanges = {
|
||||
...addEquipment(
|
||||
inventory,
|
||||
category,
|
||||
weaponInfo.ItemType,
|
||||
weaponInfo.ModularParts,
|
||||
{},
|
||||
{
|
||||
Features: EquipmentFeatures.DOUBLE_CAPACITY | EquipmentFeatures.GILDED,
|
||||
ItemName: payload.ItemName,
|
||||
Configs: configs,
|
||||
Polarity: [
|
||||
{
|
||||
Slot: payload.PolarizeSlot,
|
||||
Value: payload.PolarizeValue
|
||||
}
|
||||
]
|
||||
}
|
||||
),
|
||||
...occupySlot(inventory, productCategoryToInventoryBin(category)!, true),
|
||||
...updateCurrency(inventory, weaponInfo.PremiumPrice, true)
|
||||
};
|
||||
if (defaultUpgrades) {
|
||||
inventoryChanges.RawUpgrades = defaultUpgrades.map(x => ({ ItemType: x.ItemType, ItemCount: 1 }));
|
||||
}
|
||||
await inventory.save();
|
||||
res.json({
|
||||
InventoryChanges: inventoryChanges
|
||||
});
|
||||
} else {
|
||||
throw new Error(`unknown modularWeaponSale op: ${String(req.query.op)}`);
|
||||
}
|
||||
};
|
||||
|
||||
const getSaleInfos = (partTypeToParts: Record<string, string[]>, day: number): IModularWeaponSaleInfo[] => {
|
||||
const kitgunIsPrimary: boolean = (day & 1) != 0;
|
||||
return [
|
||||
getModularWeaponSale(
|
||||
partTypeToParts,
|
||||
today,
|
||||
day,
|
||||
"Ostron",
|
||||
["LWPT_HILT", "LWPT_BLADE", "LWPT_HILT_WEIGHT"],
|
||||
() => "/Lotus/Weapons/Ostron/Melee/LotusModularWeapon"
|
||||
),
|
||||
getModularWeaponSale(
|
||||
partTypeToParts,
|
||||
today,
|
||||
day,
|
||||
"SolarisUnitedHoverboard",
|
||||
["LWPT_HB_DECK", "LWPT_HB_ENGINE", "LWPT_HB_FRONT", "LWPT_HB_JET"],
|
||||
() => "/Lotus/Types/Vehicles/Hoverboard/HoverboardSuit"
|
||||
),
|
||||
getModularWeaponSale(
|
||||
partTypeToParts,
|
||||
today,
|
||||
day,
|
||||
"SolarisUnitedMoaPet",
|
||||
["LWPT_MOA_LEG", "LWPT_MOA_HEAD", "LWPT_MOA_ENGINE", "LWPT_MOA_PAYLOAD"],
|
||||
() => "/Lotus/Types/Friendly/Pets/MoaPets/MoaPetPowerSuit"
|
||||
),
|
||||
getModularWeaponSale(
|
||||
partTypeToParts,
|
||||
today,
|
||||
day,
|
||||
"SolarisUnitedKitGun",
|
||||
[
|
||||
kitgunIsPrimary ? "LWPT_GUN_PRIMARY_HANDLE" : "LWPT_GUN_SECONDARY_HANDLE",
|
||||
@ -67,8 +126,7 @@ export const modularWeaponSaleController: RequestHandler = (_req, res) => {
|
||||
}
|
||||
}
|
||||
)
|
||||
]
|
||||
});
|
||||
];
|
||||
};
|
||||
|
||||
const priceFactor: Record<string, number> = {
|
||||
@ -121,3 +179,12 @@ interface IModularWeaponSaleItem {
|
||||
PremiumPrice: number;
|
||||
ModularParts: string[];
|
||||
}
|
||||
|
||||
interface IModularWeaponPurchaseRequest {
|
||||
SaleName: string;
|
||||
ItemIndex: number;
|
||||
Revision: number;
|
||||
ItemName: string;
|
||||
PolarizeSlot: number;
|
||||
PolarizeValue: ArtifactPolarity;
|
||||
}
|
||||
|
19
src/helpers/modularWeaponHelper.ts
Normal file
19
src/helpers/modularWeaponHelper.ts
Normal file
@ -0,0 +1,19 @@
|
||||
import { TEquipmentKey } from "../types/inventoryTypes/inventoryTypes";
|
||||
|
||||
export const modularWeaponTypes: Record<string, TEquipmentKey> = {
|
||||
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimary": "LongGuns",
|
||||
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryBeam": "LongGuns",
|
||||
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryLauncher": "LongGuns",
|
||||
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryShotgun": "LongGuns",
|
||||
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimarySniper": "LongGuns",
|
||||
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary": "Pistols",
|
||||
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryBeam": "Pistols",
|
||||
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryShotgun": "Pistols",
|
||||
"/Lotus/Weapons/Ostron/Melee/LotusModularWeapon": "Melee",
|
||||
"/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon": "OperatorAmps",
|
||||
"/Lotus/Types/Vehicles/Hoverboard/HoverboardSuit": "Hoverboards",
|
||||
"/Lotus/Types/Friendly/Pets/MoaPets/MoaPetPowerSuit": "MoaPets",
|
||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetAPowerSuit": "MoaPets",
|
||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetBPowerSuit": "MoaPets",
|
||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetCPowerSuit": "MoaPets"
|
||||
};
|
@ -201,6 +201,7 @@ apiRouter.post("/joinSession.php", joinSessionController);
|
||||
apiRouter.post("/login.php", loginController);
|
||||
apiRouter.post("/missionInventoryUpdate.php", missionInventoryUpdateController);
|
||||
apiRouter.post("/modularWeaponCrafting.php", modularWeaponCraftingController);
|
||||
apiRouter.post("/modularWeaponSale.php", modularWeaponSaleController);
|
||||
apiRouter.post("/nameWeapon.php", nameWeaponController);
|
||||
apiRouter.post("/placeDecoInComponent.php", placeDecoInComponentController);
|
||||
apiRouter.post("/playerSkills.php", playerSkillsController);
|
||||
|
@ -29,6 +29,7 @@ import {
|
||||
ExportSentinels,
|
||||
ExportWarframes,
|
||||
ExportWeapons,
|
||||
IDefaultUpgrade,
|
||||
IInboxMessage,
|
||||
IMissionReward,
|
||||
IPowersuit,
|
||||
@ -256,3 +257,15 @@ export const toStoreItem = (type: string): string => {
|
||||
export const fromStoreItem = (type: string): string => {
|
||||
return "/Lotus/" + type.substring("/Lotus/StoreItems/".length);
|
||||
};
|
||||
|
||||
export const getDefaultUpgrades = (parts: string[]): IDefaultUpgrade[] | undefined => {
|
||||
const allDefaultUpgrades: IDefaultUpgrade[] = [];
|
||||
for (const part of parts) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
||||
const defaultUpgrades = ExportWeapons[part]?.defaultUpgrades;
|
||||
if (defaultUpgrades) {
|
||||
allDefaultUpgrades.push(...defaultUpgrades);
|
||||
}
|
||||
}
|
||||
return allDefaultUpgrades.length == 0 ? undefined : allDefaultUpgrades;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user