返回提交历史
Modified
src/controllers/api/getVendorInfoController.ts
+8
-132
Modified
src/services/purchaseService.ts
+15
-5
Added
src/services/serversideVendorsService.ts
+87
-0
XFEstudio/SpaceNinjaServer
feat: apply QuantityMultiplier for server-side vendor offers (#605)
d1d221bb
代码差异
3 个文件
+110
-137
@@ -1,138 +1,14 @@
1
1
import { RequestHandler } from "express";
2
import ArchimedeanVendorManifest from "@/static/fixed_responses/getVendorInfo/ArchimedeanVendorManifest.json";
3
import DeimosEntratiFragmentVendorProductsManifest from "@/static/fixed_responses/getVendorInfo/DeimosEntratiFragmentVendorProductsManifest.json";
4
import DeimosFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosFishmongerVendorManifest.json";
5
import DeimosHivemindCommisionsManifestFishmonger from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestFishmonger.json";
6
import DeimosHivemindCommisionsManifestPetVendor from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestPetVendor.json";
7
import DeimosHivemindCommisionsManifestProspector from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestProspector.json";
8
import DeimosHivemindCommisionsManifestTokenVendor from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestTokenVendor.json";
9
import DeimosHivemindCommisionsManifestWeaponsmith from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestWeaponsmith.json";
10
import DeimosHivemindTokenVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosHivemindTokenVendorManifest.json";
11
import DeimosPetVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosPetVendorManifest.json";
12
import DeimosProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosProspectorVendorManifest.json";
13
import DuviriAcrithisVendorManifest from "@/static/fixed_responses/getVendorInfo/DuviriAcrithisVendorManifest.json";
14
import EntratiLabsEntratiLabsCommisionsManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabsCommisionsManifest.json";
15
import EntratiLabsEntratiLabVendorManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabVendorManifest.json";
16
import HubsIronwakeDondaVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsIronwakeDondaVendorManifest.json";
17
import HubsRailjackCrewMemberVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsRailjackCrewMemberVendorManifest.json";
18
import HubsPerrinSequenceWeaponVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsPerrinSequenceWeaponVendorManifest.json";
19
import MaskSalesmanManifest from "@/static/fixed_responses/getVendorInfo/MaskSalesmanManifest.json";
20
import OstronFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronFishmongerVendorManifest.json";
21
import OstronProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronProspectorVendorManifest.json";
22
import OstronPetVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronPetVendorManifest.json";
23
import SolarisFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisFishmongerVendorManifest.json";
24
import SolarisProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisProspectorVendorManifest.json";
25
import SolarisDebtTokenVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorManifest.json";
26
import SolarisDebtTokenVendorRepossessionsManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorRepossessionsManifest.json";
27
import ZarimanCommisionsManifestArchimedean from "@/static/fixed_responses/getVendorInfo/ZarimanCommisionsManifestArchimedean.json";
2
import { getVendorManifestByTypeName } from "@/src/services/serversideVendorsService";
28
3
29
4
export const getVendorInfoController: RequestHandler = (req, res) => {
30
switch (req.query.vendor as string) {
31
case "/Lotus/Types/Game/VendorManifests/Ostron/FishmongerVendorManifest":
32
res.json(OstronFishmongerVendorManifest);
33
break;
34
35
case "/Lotus/Types/Game/VendorManifests/Ostron/ProspectorVendorManifest":
36
res.json(OstronProspectorVendorManifest);
37
break;
38
39
case "/Lotus/Types/Game/VendorManifests/Ostron/PetVendorManifest":
40
res.json(OstronPetVendorManifest);
41
break;
42
43
case "/Lotus/Types/Game/VendorManifests/Ostron/MaskSalesmanManifest":
44
res.json(MaskSalesmanManifest);
45
break;
46
47
case "/Lotus/Types/Game/VendorManifests/Solaris/FishmongerVendorManifest":
48
res.json(SolarisFishmongerVendorManifest);
49
break;
50
51
case "/Lotus/Types/Game/VendorManifests/Solaris/ProspectorVendorManifest":
52
res.json(SolarisProspectorVendorManifest);
53
break;
54
55
case "/Lotus/Types/Game/VendorManifests/Solaris/DebtTokenVendorManifest":
56
res.json(SolarisDebtTokenVendorManifest);
57
break;
58
59
case "/Lotus/Types/Game/VendorManifests/Solaris/DebtTokenVendorRepossessionsManifest":
60
res.json(SolarisDebtTokenVendorRepossessionsManifest);
61
break;
62
63
case "/Lotus/Types/Game/VendorManifests/Hubs/PerrinSequenceWeaponVendorManifest":
64
res.json(HubsPerrinSequenceWeaponVendorManifest);
65
break;
66
67
case "/Lotus/Types/Game/VendorManifests/Hubs/RailjackCrewMemberVendorManifest":
68
res.json(HubsRailjackCrewMemberVendorManifest);
69
break;
70
71
case "/Lotus/Types/Game/VendorManifests/Deimos/HivemindCommisionsManifestWeaponsmith":
72
res.json(DeimosHivemindCommisionsManifestWeaponsmith);
73
break;
74
75
case "/Lotus/Types/Game/VendorManifests/Deimos/HivemindCommisionsManifestFishmonger":
76
res.json(DeimosHivemindCommisionsManifestFishmonger);
77
break;
78
79
case "/Lotus/Types/Game/VendorManifests/Deimos/FishmongerVendorManifest":
80
res.json(DeimosFishmongerVendorManifest);
81
break;
82
83
case "/Lotus/Types/Game/VendorManifests/Deimos/HivemindCommisionsManifestProspector":
84
res.json(DeimosHivemindCommisionsManifestProspector);
85
break;
86
87
case "/Lotus/Types/Game/VendorManifests/Deimos/ProspectorVendorManifest":
88
res.json(DeimosProspectorVendorManifest);
89
break;
90
91
case "/Lotus/Types/Game/VendorManifests/Deimos/HivemindCommisionsManifestPetVendor":
92
res.json(DeimosHivemindCommisionsManifestPetVendor);
93
break;
94
95
case "/Lotus/Types/Game/VendorManifests/Deimos/PetVendorManifest":
96
res.json(DeimosPetVendorManifest);
97
break;
98
99
case "/Lotus/Types/Game/VendorManifests/Deimos/HivemindCommisionsManifestTokenVendor":
100
res.json(DeimosHivemindCommisionsManifestTokenVendor);
101
break;
102
103
case "/Lotus/Types/Game/VendorManifests/Deimos/EntratiFragmentVendorProductsManifest":
104
res.json(DeimosEntratiFragmentVendorProductsManifest);
105
break;
106
107
case "/Lotus/Types/Game/VendorManifests/Deimos/HivemindTokenVendorManifest":
108
res.json(DeimosHivemindTokenVendorManifest);
109
break;
110
111
case "/Lotus/Types/Game/VendorManifests/Hubs/IronwakeDondaVendorManifest":
112
res.json(HubsIronwakeDondaVendorManifest);
113
break;
114
115
case "/Lotus/Types/Game/VendorManifests/Zariman/ArchimedeanVendorManifest":
116
res.json(ArchimedeanVendorManifest);
117
break;
118
119
case "/Lotus/Types/Game/VendorManifests/Duviri/AcrithisVendorManifest":
120
res.json(DuviriAcrithisVendorManifest);
121
break;
122
123
case "/Lotus/Types/Game/VendorManifests/Zariman/ZarimanCommisionsManifestArchimedean":
124
res.json(ZarimanCommisionsManifestArchimedean);
125
break;
126
127
case "/Lotus/Types/Game/VendorManifests/EntratiLabs/EntratiLabVendorManifest":
128
res.json(EntratiLabsEntratiLabVendorManifest);
129
break;
130
131
case "/Lotus/Types/Game/VendorManifests/EntratiLabs/EntratiLabsCommisionsManifest":
132
res.json(EntratiLabsEntratiLabsCommisionsManifest);
133
break;
134
135
default:
5
if (typeof req.query.vendor == "string") {
6
const manifest = getVendorManifestByTypeName(req.query.vendor);
7
if (!manifest) {
136
8
throw new Error(`Unknown vendor: ${req.query.vendor}`);
9
}
10
res.json(manifest);
11
} else {
12
res.status(400).end();
137
13
}
138
14
};
@@ -9,6 +9,7 @@ import {
9
9
updateCurrency,
10
10
updateSlots
11
11
} from "@/src/services/inventoryService";
12
import { getVendorManifestByOid } from "@/src/services/serversideVendorsService";
12
13
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
13
14
import { IPurchaseRequest, SlotPurchase, IInventoryChanges } from "@/src/types/purchaseTypes";
14
15
import { logger } from "@/src/utils/logger";
@@ -32,6 +33,18 @@ export const getStoreItemTypesCategory = (typesItem: string) => {
32
33
export const handlePurchase = async (purchaseRequest: IPurchaseRequest, accountId: string) => {
33
34
logger.debug("purchase request", purchaseRequest);
34
35
36
if (purchaseRequest.PurchaseParams.Source == 7) {
37
const manifest = getVendorManifestByOid(purchaseRequest.PurchaseParams.SourceId!);
38
if (manifest) {
39
const offer = manifest.VendorInfo.ItemManifest.find(
40
x => x.StoreItem == purchaseRequest.PurchaseParams.StoreItem
41
);
42
if (offer) {
43
purchaseRequest.PurchaseParams.Quantity *= offer.QuantityMultiplier;
44
}
45
}
46
}
47
35
48
const purchaseResponse = await handleStoreItemAcquisition(
36
49
purchaseRequest.PurchaseParams.StoreItem,
37
50
accountId,
@@ -53,11 +66,8 @@ export const handlePurchase = async (purchaseRequest: IPurchaseRequest, accountI
53
66
54
67
switch (purchaseRequest.PurchaseParams.Source) {
55
68
case 7:
56
if (!purchaseRequest.PurchaseParams.SourceId) {
57
throw new Error("invalid request source");
58
}
59
if (ExportVendors[purchaseRequest.PurchaseParams.SourceId]) {
60
const vendor = ExportVendors[purchaseRequest.PurchaseParams.SourceId];
69
if (purchaseRequest.PurchaseParams.SourceId! in ExportVendors) {
70
const vendor = ExportVendors[purchaseRequest.PurchaseParams.SourceId!];
61
71
const offer = vendor.items.find(x => x.storeItem == purchaseRequest.PurchaseParams.StoreItem);
62
72
if (offer) {
63
73
const inventory = await getInventory(accountId);
@@ -0,0 +1,87 @@
1
import { IOid } from "@/src/types/commonTypes";
2
3
import ArchimedeanVendorManifest from "@/static/fixed_responses/getVendorInfo/ArchimedeanVendorManifest.json";
4
import DeimosEntratiFragmentVendorProductsManifest from "@/static/fixed_responses/getVendorInfo/DeimosEntratiFragmentVendorProductsManifest.json";
5
import DeimosFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosFishmongerVendorManifest.json";
6
import DeimosHivemindCommisionsManifestFishmonger from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestFishmonger.json";
7
import DeimosHivemindCommisionsManifestPetVendor from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestPetVendor.json";
8
import DeimosHivemindCommisionsManifestProspector from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestProspector.json";
9
import DeimosHivemindCommisionsManifestTokenVendor from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestTokenVendor.json";
10
import DeimosHivemindCommisionsManifestWeaponsmith from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestWeaponsmith.json";
11
import DeimosHivemindTokenVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosHivemindTokenVendorManifest.json";
12
import DeimosPetVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosPetVendorManifest.json";
13
import DeimosProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosProspectorVendorManifest.json";
14
import DuviriAcrithisVendorManifest from "@/static/fixed_responses/getVendorInfo/DuviriAcrithisVendorManifest.json";
15
import EntratiLabsEntratiLabsCommisionsManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabsCommisionsManifest.json";
16
import EntratiLabsEntratiLabVendorManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabVendorManifest.json";
17
import HubsIronwakeDondaVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsIronwakeDondaVendorManifest.json";
18
import HubsRailjackCrewMemberVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsRailjackCrewMemberVendorManifest.json";
19
import HubsPerrinSequenceWeaponVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsPerrinSequenceWeaponVendorManifest.json";
20
import MaskSalesmanManifest from "@/static/fixed_responses/getVendorInfo/MaskSalesmanManifest.json";
21
import OstronFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronFishmongerVendorManifest.json";
22
import OstronProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronProspectorVendorManifest.json";
23
import OstronPetVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronPetVendorManifest.json";
24
import SolarisFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisFishmongerVendorManifest.json";
25
import SolarisProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisProspectorVendorManifest.json";
26
import SolarisDebtTokenVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorManifest.json";
27
import SolarisDebtTokenVendorRepossessionsManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorRepossessionsManifest.json";
28
import ZarimanCommisionsManifestArchimedean from "@/static/fixed_responses/getVendorInfo/ZarimanCommisionsManifestArchimedean.json";
29
30
interface IVendorManifest {
31
VendorInfo: {
32
_id: IOid;
33
TypeName: string;
34
ItemManifest: {
35
StoreItem: string;
36
QuantityMultiplier: number;
37
// has a few more fields but we don't care about those right now
38
}[];
39
};
40
}
41
42
const vendorManifests: IVendorManifest[] = [
43
ArchimedeanVendorManifest,
44
DeimosEntratiFragmentVendorProductsManifest,
45
DeimosFishmongerVendorManifest,
46
DeimosHivemindCommisionsManifestFishmonger,
47
DeimosHivemindCommisionsManifestPetVendor,
48
DeimosHivemindCommisionsManifestProspector,
49
DeimosHivemindCommisionsManifestTokenVendor,
50
DeimosHivemindCommisionsManifestWeaponsmith,
51
DeimosHivemindTokenVendorManifest,
52
DeimosPetVendorManifest,
53
DeimosProspectorVendorManifest,
54
DuviriAcrithisVendorManifest,
55
EntratiLabsEntratiLabsCommisionsManifest,
56
EntratiLabsEntratiLabVendorManifest,
57
HubsIronwakeDondaVendorManifest,
58
HubsRailjackCrewMemberVendorManifest,
59
HubsPerrinSequenceWeaponVendorManifest,
60
MaskSalesmanManifest,
61
OstronFishmongerVendorManifest,
62
OstronProspectorVendorManifest,
63
OstronPetVendorManifest,
64
SolarisFishmongerVendorManifest,
65
SolarisProspectorVendorManifest,
66
SolarisDebtTokenVendorManifest,
67
SolarisDebtTokenVendorRepossessionsManifest,
68
ZarimanCommisionsManifestArchimedean
69
];
70
71
export const getVendorManifestByTypeName = (typeName: string): IVendorManifest | undefined => {
72
for (const vendorManifest of vendorManifests) {
73
if (vendorManifest.VendorInfo.TypeName == typeName) {
74
return vendorManifest;
75
}
76
}
77
return undefined;
78
};
79
80
export const getVendorManifestByOid = (oid: string): IVendorManifest | undefined => {
81
for (const vendorManifest of vendorManifests) {
82
if (vendorManifest.VendorInfo._id.$oid == oid) {
83
return vendorManifest;
84
}
85
}
86
return undefined;
87
};