XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFESpaceNinjaServer

feat: purchase modular weapon from daily special (#1217)

Closes #685 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1217

0be54dd7
Sainan <sainan@calamity.inc>
提交于

代码差异

5 个文件 +161 -78
Modified src/controllers/api/modularWeaponCraftingController.ts +7 -24
@@ -1,7 +1,6 @@
1 1 import { RequestHandler } from "express";
2 2 import { getAccountIdForRequest } from "@/src/services/loginService";
3 3 import { getJSONfromString } from "@/src/helpers/stringHelpers";
4 import { TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes";
5 4 import {
6 5 getInventory,
7 6 updateCurrency,
@@ -11,26 +10,9 @@ import {
11 10 occupySlot,
12 11 productCategoryToInventoryBin
13 12 } from "@/src/services/inventoryService";
14 import { ExportWeapons } from "warframe-public-export-plus";
15 13 import { IInventoryChanges } from "@/src/types/purchaseTypes";
16
17 const modularWeaponTypes: Record<string, TEquipmentKey> = {
18 "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimary": "LongGuns",
19 "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryBeam": "LongGuns",
20 "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryLauncher": "LongGuns",
21 "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryShotgun": "LongGuns",
22 "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimarySniper": "LongGuns",
23 "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary": "Pistols",
24 "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryBeam": "Pistols",
25 "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryShotgun": "Pistols",
26 "/Lotus/Weapons/Ostron/Melee/LotusModularWeapon": "Melee",
27 "/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon": "OperatorAmps",
28 "/Lotus/Types/Vehicles/Hoverboard/HoverboardSuit": "Hoverboards",
29 "/Lotus/Types/Friendly/Pets/MoaPets/MoaPetPowerSuit": "MoaPets",
30 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetAPowerSuit": "MoaPets",
31 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetBPowerSuit": "MoaPets",
32 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetCPowerSuit": "MoaPets"
33 };
14 import { getDefaultUpgrades } from "@/src/services/itemDataService";
15 import { modularWeaponTypes } from "@/src/helpers/modularWeaponHelper";
34 16
35 17 interface IModularCraftRequest {
36 18 WeaponType: string;
@@ -46,14 +28,15 @@ export const modularWeaponCraftingController: RequestHandler = async (req, res)
46 28 const category = modularWeaponTypes[data.WeaponType];
47 29 const inventory = await getInventory(accountId);
48 30
49 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
50 const configs = applyDefaultUpgrades(inventory, ExportWeapons[data.Parts[0]]?.defaultUpgrades);
51
52 // Give weapon
31 const defaultUpgrades = getDefaultUpgrades(data.Parts);
32 const configs = applyDefaultUpgrades(inventory, defaultUpgrades);
53 33 const inventoryChanges: IInventoryChanges = {
54 34 ...addEquipment(inventory, category, data.WeaponType, data.Parts, {}, { Configs: configs }),
55 35 ...occupySlot(inventory, productCategoryToInventoryBin(category)!, false)
56 36 };
37 if (defaultUpgrades) {
38 inventoryChanges.RawUpgrades = defaultUpgrades.map(x => ({ ItemType: x.ItemType, ItemCount: 1 }));
39 }
57 40
58 41 // Remove credits & parts
59 42 const miscItemChanges = [];
Modified src/controllers/api/modularWeaponSaleController.ts +121 -54
@@ -3,9 +3,22 @@ import { ExportWeapons } from "warframe-public-export-plus";
3 3 import { IMongoDate } from "@/src/types/commonTypes";
4 4 import { toMongoDate } from "@/src/helpers/inventoryHelpers";
5 5 import { CRng } from "@/src/services/rngService";
6 import { ArtifactPolarity, EquipmentFeatures } from "@/src/types/inventoryTypes/commonInventoryTypes";
7 import { getJSONfromString } from "@/src/helpers/stringHelpers";
8 import {
9 addEquipment,
10 applyDefaultUpgrades,
11 getInventory,
12 occupySlot,
13 productCategoryToInventoryBin,
14 updateCurrency
15 } from "@/src/services/inventoryService";
16 import { getDefaultUpgrades } from "@/src/services/itemDataService";
17 import { getAccountIdForRequest } from "@/src/services/loginService";
18 import { modularWeaponTypes } from "@/src/helpers/modularWeaponHelper";
19 import { IInventoryChanges } from "@/src/types/purchaseTypes";
6 20
7 // op=SyncAll
8 export const modularWeaponSaleController: RequestHandler = (_req, res) => {
21 export const modularWeaponSaleController: RequestHandler = async (req, res) => {
9 22 const partTypeToParts: Record<string, string[]> = {};
10 23 for (const [uniqueName, data] of Object.entries(ExportWeapons)) {
11 24 if (data.partType) {
@@ -15,60 +28,105 @@ export const modularWeaponSaleController: RequestHandler = (_req, res) => {
15 28 }
16 29 }
17 30
18 const today: number = Math.trunc(Date.now() / 86400000);
19 const kitgunIsPrimary: boolean = (today & 1) != 0;
20 res.json({
21 SaleInfos: [
22 getModularWeaponSale(
23 partTypeToParts,
24 today,
25 "Ostron",
26 ["LWPT_HILT", "LWPT_BLADE", "LWPT_HILT_WEIGHT"],
27 () => "/Lotus/Weapons/Ostron/Melee/LotusModularWeapon"
28 ),
29 getModularWeaponSale(
30 partTypeToParts,
31 today,
32 "SolarisUnitedHoverboard",
33 ["LWPT_HB_DECK", "LWPT_HB_ENGINE", "LWPT_HB_FRONT", "LWPT_HB_JET"],
34 () => "/Lotus/Types/Vehicles/Hoverboard/HoverboardSuit"
35 ),
36 getModularWeaponSale(
37 partTypeToParts,
38 today,
39 "SolarisUnitedMoaPet",
40 ["LWPT_MOA_LEG", "LWPT_MOA_HEAD", "LWPT_MOA_ENGINE", "LWPT_MOA_PAYLOAD"],
41 () => "/Lotus/Types/Friendly/Pets/MoaPets/MoaPetPowerSuit"
31 if (req.query.op == "SyncAll") {
32 res.json({
33 SaleInfos: getSaleInfos(partTypeToParts, Math.trunc(Date.now() / 86400000))
34 });
35 } else if (req.query.op == "Purchase") {
36 const accountId = await getAccountIdForRequest(req);
37 const inventory = await getInventory(accountId);
38 const payload = getJSONfromString<IModularWeaponPurchaseRequest>(String(req.body));
39 const weaponInfo = getSaleInfos(partTypeToParts, payload.Revision).find(x => x.Name == payload.SaleName)!
40 .Weapons[payload.ItemIndex];
41 const category = modularWeaponTypes[weaponInfo.ItemType];
42 const defaultUpgrades = getDefaultUpgrades(weaponInfo.ModularParts);
43 const configs = applyDefaultUpgrades(inventory, defaultUpgrades);
44 const inventoryChanges: IInventoryChanges = {
45 ...addEquipment(
46 inventory,
47 category,
48 weaponInfo.ItemType,
49 weaponInfo.ModularParts,
50 {},
51 {
52 Features: EquipmentFeatures.DOUBLE_CAPACITY | EquipmentFeatures.GILDED,
53 ItemName: payload.ItemName,
54 Configs: configs,
55 Polarity: [
56 {
57 Slot: payload.PolarizeSlot,
58 Value: payload.PolarizeValue
59 }
60 ]
61 }
42 62 ),
43 getModularWeaponSale(
44 partTypeToParts,
45 today,
46 "SolarisUnitedKitGun",
47 [
48 kitgunIsPrimary ? "LWPT_GUN_PRIMARY_HANDLE" : "LWPT_GUN_SECONDARY_HANDLE",
49 "LWPT_GUN_BARREL",
50 "LWPT_GUN_CLIP"
51 ],
52 (parts: string[]) => {
53 const barrel = parts[1];
54 const gunType = ExportWeapons[barrel].gunType!;
55 if (kitgunIsPrimary) {
56 return {
57 GT_RIFLE: "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimary",
58 GT_SHOTGUN: "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryShotgun",
59 GT_BEAM: "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryBeam"
60 }[gunType];
61 } else {
62 return {
63 GT_RIFLE: "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary",
64 GT_SHOTGUN: "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryShotgun",
65 GT_BEAM: "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryBeam"
66 }[gunType];
67 }
63 ...occupySlot(inventory, productCategoryToInventoryBin(category)!, true),
64 ...updateCurrency(inventory, weaponInfo.PremiumPrice, true)
65 };
66 if (defaultUpgrades) {
67 inventoryChanges.RawUpgrades = defaultUpgrades.map(x => ({ ItemType: x.ItemType, ItemCount: 1 }));
68 }
69 await inventory.save();
70 res.json({
71 InventoryChanges: inventoryChanges
72 });
73 } else {
74 throw new Error(`unknown modularWeaponSale op: ${String(req.query.op)}`);
75 }
76 };
77
78 const getSaleInfos = (partTypeToParts: Record<string, string[]>, day: number): IModularWeaponSaleInfo[] => {
79 const kitgunIsPrimary: boolean = (day & 1) != 0;
80 return [
81 getModularWeaponSale(
82 partTypeToParts,
83 day,
84 "Ostron",
85 ["LWPT_HILT", "LWPT_BLADE", "LWPT_HILT_WEIGHT"],
86 () => "/Lotus/Weapons/Ostron/Melee/LotusModularWeapon"
87 ),
88 getModularWeaponSale(
89 partTypeToParts,
90 day,
91 "SolarisUnitedHoverboard",
92 ["LWPT_HB_DECK", "LWPT_HB_ENGINE", "LWPT_HB_FRONT", "LWPT_HB_JET"],
93 () => "/Lotus/Types/Vehicles/Hoverboard/HoverboardSuit"
94 ),
95 getModularWeaponSale(
96 partTypeToParts,
97 day,
98 "SolarisUnitedMoaPet",
99 ["LWPT_MOA_LEG", "LWPT_MOA_HEAD", "LWPT_MOA_ENGINE", "LWPT_MOA_PAYLOAD"],
100 () => "/Lotus/Types/Friendly/Pets/MoaPets/MoaPetPowerSuit"
101 ),
102 getModularWeaponSale(
103 partTypeToParts,
104 day,
105 "SolarisUnitedKitGun",
106 [
107 kitgunIsPrimary ? "LWPT_GUN_PRIMARY_HANDLE" : "LWPT_GUN_SECONDARY_HANDLE",
108 "LWPT_GUN_BARREL",
109 "LWPT_GUN_CLIP"
110 ],
111 (parts: string[]) => {
112 const barrel = parts[1];
113 const gunType = ExportWeapons[barrel].gunType!;
114 if (kitgunIsPrimary) {
115 return {
116 GT_RIFLE: "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimary",
117 GT_SHOTGUN: "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryShotgun",
118 GT_BEAM: "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryBeam"
119 }[gunType];
120 } else {
121 return {
122 GT_RIFLE: "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary",
123 GT_SHOTGUN: "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryShotgun",
124 GT_BEAM: "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryBeam"
125 }[gunType];
68 126 }
69 )
70 ]
71 });
127 }
128 )
129 ];
72 130 };
73 131
74 132 const priceFactor: Record<string, number> = {
@@ -121,3 +179,12 @@ interface IModularWeaponSaleItem {
121 179 PremiumPrice: number;
122 180 ModularParts: string[];
123 181 }
182
183 interface IModularWeaponPurchaseRequest {
184 SaleName: string;
185 ItemIndex: number;
186 Revision: number;
187 ItemName: string;
188 PolarizeSlot: number;
189 PolarizeValue: ArtifactPolarity;
190 }
Added src/helpers/modularWeaponHelper.ts +19 -0
@@ -0,0 +1,19 @@
1 import { TEquipmentKey } from "../types/inventoryTypes/inventoryTypes";
2
3 export const modularWeaponTypes: Record<string, TEquipmentKey> = {
4 "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimary": "LongGuns",
5 "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryBeam": "LongGuns",
6 "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryLauncher": "LongGuns",
7 "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryShotgun": "LongGuns",
8 "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimarySniper": "LongGuns",
9 "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary": "Pistols",
10 "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryBeam": "Pistols",
11 "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryShotgun": "Pistols",
12 "/Lotus/Weapons/Ostron/Melee/LotusModularWeapon": "Melee",
13 "/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon": "OperatorAmps",
14 "/Lotus/Types/Vehicles/Hoverboard/HoverboardSuit": "Hoverboards",
15 "/Lotus/Types/Friendly/Pets/MoaPets/MoaPetPowerSuit": "MoaPets",
16 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetAPowerSuit": "MoaPets",
17 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetBPowerSuit": "MoaPets",
18 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetCPowerSuit": "MoaPets"
19 };
Modified src/routes/api.ts +1 -0
@@ -201,6 +201,7 @@ apiRouter.post("/joinSession.php", joinSessionController);
201 201 apiRouter.post("/login.php", loginController);
202 202 apiRouter.post("/missionInventoryUpdate.php", missionInventoryUpdateController);
203 203 apiRouter.post("/modularWeaponCrafting.php", modularWeaponCraftingController);
204 apiRouter.post("/modularWeaponSale.php", modularWeaponSaleController);
204 205 apiRouter.post("/nameWeapon.php", nameWeaponController);
205 206 apiRouter.post("/placeDecoInComponent.php", placeDecoInComponentController);
206 207 apiRouter.post("/playerSkills.php", playerSkillsController);
Modified src/services/itemDataService.ts +13 -0
@@ -29,6 +29,7 @@ import {
29 29 ExportSentinels,
30 30 ExportWarframes,
31 31 ExportWeapons,
32 IDefaultUpgrade,
32 33 IInboxMessage,
33 34 IMissionReward,
34 35 IPowersuit,
@@ -256,3 +257,15 @@ export const toStoreItem = (type: string): string => {
256 257 export const fromStoreItem = (type: string): string => {
257 258 return "/Lotus/" + type.substring("/Lotus/StoreItems/".length);
258 259 };
260
261 export const getDefaultUpgrades = (parts: string[]): IDefaultUpgrade[] | undefined => {
262 const allDefaultUpgrades: IDefaultUpgrade[] = [];
263 for (const part of parts) {
264 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
265 const defaultUpgrades = ExportWeapons[part]?.defaultUpgrades;
266 if (defaultUpgrades) {
267 allDefaultUpgrades.push(...defaultUpgrades);
268 }
269 }
270 return allDefaultUpgrades.length == 0 ? undefined : allDefaultUpgrades;
271 };