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: 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
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

2 个文件 +19 -141
Modified src/services/serversideVendorsService.ts +19 -8
@@ -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 }
Deleted static/fixed_responses/getVendorInfo/HubsPerrinSequenceWeaponVendorManifest.json +0 -133
@@ -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 }