返回提交历史
Modified
src/services/serversideVendorsService.ts
+19
-8
Deleted
static/fixed_responses/getVendorInfo/HubsPerrinSequenceWeaponVendorManifest.json
+0
-133
XFEstudio/SpaceNinjaServer
feat: tenet weapon vendor rotation (#1717)
Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1717 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
a98e18d5
代码差异
2 个文件
+19
-141
@@ -34,7 +34,6 @@ const rawVendorManifests: IRawVendorManifest[] = [
34
34
getVendorManifestJson("EntratiLabsEntratiLabVendorManifest"),
35
35
getVendorManifestJson("GuildAdvertisementVendorManifest"), // uses preprocessing
36
36
getVendorManifestJson("HubsIronwakeDondaVendorManifest"), // uses preprocessing
37
getVendorManifestJson("HubsPerrinSequenceWeaponVendorManifest"),
38
37
getVendorManifestJson("HubsRailjackCrewMemberVendorManifest"),
39
38
getVendorManifestJson("MaskSalesmanManifest"),
40
39
getVendorManifestJson("Nova1999ConquestShopManifest"),
@@ -51,7 +50,8 @@ const rawVendorManifests: IRawVendorManifest[] = [
51
50
];
52
51
53
52
interface IGeneratableVendorInfo extends Omit<IVendorInfo, "ItemManifest" | "Expiry"> {
54
cycleDuration?: number;
53
cycleStart: number;
54
cycleDuration: number;
55
55
}
56
56
57
57
const generatableVendors: IGeneratableVendorInfo[] = [
@@ -62,6 +62,16 @@ const generatableVendors: IGeneratableVendorInfo[] = [
62
62
RandomSeedType: "VRST_WEAPON",
63
63
RequiredGoalTag: "",
64
64
WeaponUpgradeValueAttenuationExponent: 2.25,
65
cycleStart: 1740960000_000,
66
cycleDuration: 4 * unixTimesInMs.day
67
},
68
{
69
_id: { $oid: "60ad3b6ec96976e97d227e19" },
70
TypeName: "/Lotus/Types/Game/VendorManifests/Hubs/PerrinSequenceWeaponVendorManifest",
71
PropertyTextHash: "34F8CF1DFF745F0D67433A5EF0A03E70",
72
RandomSeedType: "VRST_WEAPON",
73
WeaponUpgradeValueAttenuationExponent: 2.25,
74
cycleStart: 1744934400_000,
65
75
cycleDuration: 4 * unixTimesInMs.day
66
76
}
67
77
// {
@@ -124,7 +134,7 @@ const preprocessVendorManifest = (originalManifest: IRawVendorManifest): IVendor
124
134
const refreshExpiry = (expiry: IMongoDate): number => {
125
135
const period = parseInt(expiry.$date.$numberLong);
126
136
if (Date.now() >= period) {
127
const epoch = 1734307200 * 1000; // Monday (for weekly schedules)
137
const epoch = 1734307200_000; // Monday (for weekly schedules)
128
138
const iteration = Math.trunc((Date.now() - epoch) / period);
129
139
const start = epoch + iteration * period;
130
140
const end = start + period;
@@ -135,11 +145,11 @@ const refreshExpiry = (expiry: IMongoDate): number => {
135
145
};
136
146
137
147
const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorManifestPreprocessed => {
138
const EPOCH = 1740960000 * 1000; // Monday; aligns with coda weapons 8 day cycle.
148
const EPOCH = vendorInfo.cycleStart;
139
149
const manifest = ExportVendors[vendorInfo.TypeName];
140
150
let binThisCycle;
141
151
if (manifest.isOneBinPerCycle) {
142
const cycleDuration = vendorInfo.cycleDuration!; // manifest.items[0].durationHours! * 3600_000;
152
const cycleDuration = vendorInfo.cycleDuration; // manifest.items[0].durationHours! * 3600_000;
143
153
const cycleIndex = Math.trunc((Date.now() - EPOCH) / cycleDuration);
144
154
binThisCycle = cycleIndex % 2; // Note: May want to auto-compute the bin size, but this is only used for coda weapons right now.
145
155
}
@@ -150,7 +160,7 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
150
160
if (manifest.isOneBinPerCycle && rawItem.bin != binThisCycle) {
151
161
continue;
152
162
}
153
const cycleDuration = vendorInfo.cycleDuration!; // rawItem.durationHours! * 3600_000;
163
const cycleDuration = vendorInfo.cycleDuration; // rawItem.durationHours! * 3600_000;
154
164
const cycleIndex = Math.trunc((Date.now() - EPOCH) / cycleDuration);
155
165
const cycleStart = EPOCH + cycleIndex * cycleDuration;
156
166
const cycleEnd = cycleStart + cycleDuration;
@@ -181,10 +191,11 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
181
191
items.push(item);
182
192
}
183
193
}
184
delete vendorInfo.cycleDuration;
194
// eslint-disable-next-line @typescript-eslint/no-unused-vars
195
const { cycleStart, cycleDuration, ...clientVendorInfo } = vendorInfo;
185
196
return {
186
197
VendorInfo: {
187
...vendorInfo,
198
...clientVendorInfo,
188
199
ItemManifest: items,
189
200
Expiry: { $date: { $numberLong: soonestOfferExpiry.toString() } }
190
201
}
@@ -1,133 +0,0 @@
1
{
2
"VendorInfo": {
3
"_id": {
4
"$oid": "60ad3b6ec96976e97d227e19"
5
},
6
"TypeName": "/Lotus/Types/Game/VendorManifests/Hubs/PerrinSequenceWeaponVendorManifest",
7
"ItemManifest": [
8
{
9
"StoreItem": "/Lotus/StoreItems/Weapons/Corpus/BoardExec/Primary/CrpBEFerrox/CrpBEFerrox",
10
"ItemPrices": [
11
{
12
"ItemCount": 40,
13
"ItemType": "/Lotus/Types/Items/MiscItems/GranumBucks",
14
"ProductCategory": "MiscItems"
15
}
16
],
17
"Bin": "BIN_0",
18
"QuantityMultiplier": 1,
19
"Expiry": {
20
"$date": {
21
"$numberLong": "9999999000000"
22
}
23
},
24
"PurchaseQuantityLimit": 1,
25
"AllowMultipurchase": false,
26
"LocTagRandSeed": 4383829823946960400,
27
"Id": {
28
"$oid": "66fd60b20ba592c4c95e9488"
29
}
30
},
31
{
32
"StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Melee/CrpBriefcaseScythe/CrpBriefcaseScythe",
33
"ItemPrices": [
34
{
35
"ItemCount": 40,
36
"ItemType": "/Lotus/Types/Items/MiscItems/GranumBucks",
37
"ProductCategory": "MiscItems"
38
}
39
],
40
"Bin": "BIN_0",
41
"QuantityMultiplier": 1,
42
"Expiry": {
43
"$date": {
44
"$numberLong": "9999999000000"
45
}
46
},
47
"PurchaseQuantityLimit": 1,
48
"AllowMultipurchase": false,
49
"LocTagRandSeed": 7952272124248276000,
50
"Id": {
51
"$oid": "66fd60b20ba592c4c95e9489"
52
}
53
},
54
{
55
"StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Melee/CrpBriefcase2HKatana/CrpBriefcase2HKatana",
56
"ItemPrices": [
57
{
58
"ItemCount": 40,
59
"ItemType": "/Lotus/Types/Items/MiscItems/GranumBucks",
60
"ProductCategory": "MiscItems"
61
}
62
],
63
"Bin": "BIN_0",
64
"QuantityMultiplier": 1,
65
"Expiry": {
66
"$date": {
67
"$numberLong": "9999999000000"
68
}
69
},
70
"PurchaseQuantityLimit": 1,
71
"AllowMultipurchase": false,
72
"LocTagRandSeed": 465952672558014140,
73
"Id": {
74
"$oid": "66fd60b20ba592c4c95e948a"
75
}
76
},
77
{
78
"StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/CrpBigSlash/CrpBigSlash",
79
"ItemPrices": [
80
{
81
"ItemCount": 40,
82
"ItemType": "/Lotus/Types/Items/MiscItems/GranumBucks",
83
"ProductCategory": "MiscItems"
84
}
85
],
86
"Bin": "BIN_0",
87
"QuantityMultiplier": 1,
88
"Expiry": {
89
"$date": {
90
"$numberLong": "9999999000000"
91
}
92
},
93
"PurchaseQuantityLimit": 1,
94
"AllowMultipurchase": false,
95
"LocTagRandSeed": 8342430883077507000,
96
"Id": {
97
"$oid": "66fd60b20ba592c4c95e948b"
98
}
99
},
100
{
101
"StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Melee/ShieldAndSword/CrpHammerShield/CrpHammerShield",
102
"ItemPrices": [
103
{
104
"ItemCount": 40,
105
"ItemType": "/Lotus/Types/Items/MiscItems/GranumBucks",
106
"ProductCategory": "MiscItems"
107
}
108
],
109
"Bin": "BIN_0",
110
"QuantityMultiplier": 1,
111
"Expiry": {
112
"$date": {
113
"$numberLong": "9999999000000"
114
}
115
},
116
"PurchaseQuantityLimit": 1,
117
"AllowMultipurchase": false,
118
"LocTagRandSeed": 7441523153174502000,
119
"Id": {
120
"$oid": "66fd60b20ba592c4c95e948c"
121
}
122
}
123
],
124
"PropertyTextHash": "34F8CF1DFF745F0D67433A5EF0A03E70",
125
"RandomSeedType": "VRST_WEAPON",
126
"WeaponUpgradeValueAttenuationExponent": 2.25,
127
"Expiry": {
128
"$date": {
129
"$numberLong": "9999999000000"
130
}
131
}
132
}
133
}