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

chore: retroactively populate vendor to hide that it was just generated (#2168)

For example, debt-bonds at ticker always expire in at least 2 hours so visiting him, you'd never see an offer with an expiry less than that. The solution here is simply generating offers for the last few hours. Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2168 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>

b98a88b7
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

1 个文件 +27 -4
Modified src/services/serversideVendorsService.ts +27 -4
@@ -216,6 +216,22 @@ const toRange = (value: IRange | number): IRange => {
216 216 return value;
217 217 };
218 218
219 const getCycleDurationRange = (manifest: IVendor): IRange | undefined => {
220 const res: IRange = { minValue: Number.MAX_SAFE_INTEGER, maxValue: 0 };
221 for (const offer of manifest.items) {
222 if (offer.durationHours) {
223 const range = toRange(offer.durationHours);
224 if (res.minValue > range.minValue) {
225 res.minValue = range.minValue;
226 }
227 if (res.maxValue < range.maxValue) {
228 res.maxValue = range.maxValue;
229 }
230 }
231 }
232 return res.maxValue != 0 ? res : undefined;
233 };
234
219 235 const vendorManifestCache: Record<string, IVendorManifest> = {};
220 236
221 237 const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorManifest => {
@@ -232,10 +248,16 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
232 248 }
233 249 const cacheEntry = vendorManifestCache[vendorInfo.TypeName];
234 250 const info = cacheEntry.VendorInfo;
235 if (Date.now() >= parseInt(info.Expiry.$date.$numberLong)) {
251 const manifest = ExportVendors[vendorInfo.TypeName];
252 const cycleDurationRange = getCycleDurationRange(manifest);
253 let now = Date.now();
254 if (cycleDurationRange && cycleDurationRange.minValue != cycleDurationRange.maxValue) {
255 now -= (cycleDurationRange.maxValue - 1) * unixTimesInMs.hour;
256 }
257 while (Date.now() >= parseInt(info.Expiry.$date.$numberLong)) {
236 258 // Remove expired offers
237 259 for (let i = 0; i != info.ItemManifest.length; ) {
238 if (Date.now() >= parseInt(info.ItemManifest[i].Expiry.$date.$numberLong)) {
260 if (now >= parseInt(info.ItemManifest[i].Expiry.$date.$numberLong)) {
239 261 info.ItemManifest.splice(i, 1);
240 262 } else {
241 263 ++i;
@@ -246,9 +268,8 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
246 268 const vendorSeed = parseInt(vendorInfo._id.$oid.substring(16), 16);
247 269 const cycleOffset = vendorInfo.cycleOffset ?? 1734307200_000;
248 270 const cycleDuration = vendorInfo.cycleDuration;
249 const cycleIndex = Math.trunc((Date.now() - cycleOffset) / cycleDuration);
271 const cycleIndex = Math.trunc((now - cycleOffset) / cycleDuration);
250 272 const rng = new SRng(mixSeeds(vendorSeed, cycleIndex));
251 const manifest = ExportVendors[vendorInfo.TypeName];
252 273 const offersToAdd: IVendorOffer[] = [];
253 274 if (!manifest.isOneBinPerCycle) {
254 275 const remainingItemCapacity: Record<string, number> = {};
@@ -371,6 +392,8 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
371 392 }
372 393 }
373 394 info.Expiry.$date.$numberLong = soonestOfferExpiry.toString();
395
396 now += unixTimesInMs.hour;
374 397 }
375 398 return cacheEntry;
376 399 };