diff --git a/project/gulpfile.mjs b/project/gulpfile.mjs index 5adc7d3b..88a208a5 100644 --- a/project/gulpfile.mjs +++ b/project/gulpfile.mjs @@ -2,11 +2,11 @@ import crypto from "node:crypto"; import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; +import pkg from "@yao-pkg/pkg"; +import pkgfetch from "@yao-pkg/pkg-fetch"; import gulp from "gulp"; import { exec } from "gulp-execa"; import rename from "gulp-rename"; -import pkg from "@yao-pkg/pkg"; -import pkgfetch from "@yao-pkg/pkg-fetch"; import * as ResEdit from "resedit"; import manifest from "./package.json" assert { type: "json" }; diff --git a/project/src/controllers/RagfairController.ts b/project/src/controllers/RagfairController.ts index 32043530..4ca4ec02 100644 --- a/project/src/controllers/RagfairController.ts +++ b/project/src/controllers/RagfairController.ts @@ -207,7 +207,7 @@ export class RagfairController { offerPool = offers; } - else if ((!this.isLinkedSearch(searchRequest) && !this.isRequiredSearch(searchRequest))) + else if ((!(this.isLinkedSearch(searchRequest) || this.isRequiredSearch(searchRequest)))) { // Get all categories offerPool = this.ragfairOfferService.getOffers(); @@ -509,16 +509,14 @@ export class RagfairController { if (!offerRequest?.items || offerRequest.items.length === 0) { - errorMessage = this.localisationService.getText("ragfair-invalid_player_offer_request"); - this.logger.error(errorMessage); + this.logger.error(this.localisationService.getText("ragfair-invalid_player_offer_request")); return false; } if (!offerRequest.requirements) { - errorMessage = this.localisationService.getText("ragfair-unable_to_place_offer_with_no_requirements"); - this.logger.error(errorMessage); + this.logger.error(this.localisationService.getText("ragfair-unable_to_place_offer_with_no_requirements")); return false; } @@ -725,7 +723,11 @@ export class RagfairController { const count = playerOffers[playerOfferIndex].sellInOnePiece ? 1 - : playerOffers[playerOfferIndex].items.reduce((sum, item) => sum += item.upd.StackObjectsCount, 0); + : playerOffers[playerOfferIndex].items.reduce((sum, item) => + { + return sum + item.upd.StackObjectsCount; + }, 0); + const tax = this.ragfairTaxService.calculateTax( playerOffers[playerOfferIndex].items[0], this.profileHelper.getPmcProfile(sessionId), diff --git a/project/src/controllers/RepeatableQuestController.ts b/project/src/controllers/RepeatableQuestController.ts index 7943dc97..d2d98eb0 100644 --- a/project/src/controllers/RepeatableQuestController.ts +++ b/project/src/controllers/RepeatableQuestController.ts @@ -276,11 +276,11 @@ export class RepeatableQuestController { element._id = this.objectId.generate(); const conditions = element.conditions.AvailableForFinish; - for (const element of conditions) + for (const condition of conditions) { - if ("counter" in element._props) + if ("counter" in condition._props) { - element._props.counter.id = this.objectId.generate(); + condition._props.counter.id = this.objectId.generate(); } } } diff --git a/project/src/helpers/ProfileHelper.ts b/project/src/helpers/ProfileHelper.ts index 4a8ec068..dd2d0f19 100644 --- a/project/src/helpers/ProfileHelper.ts +++ b/project/src/helpers/ProfileHelper.ts @@ -202,7 +202,6 @@ export class ProfileHelper level = expTable.length - 1; } - // TODO: Replace with exp = expTable.slice(0, level).reduce((acc, curr) => acc + curr.exp, 0); for (let i = 0; i < level; i++) { exp += expTable[i].exp; @@ -413,7 +412,6 @@ export class ProfileHelper if (!profileSkills) { this.logger.warning(`Unable to add ${pointsToAdd} points to ${skill}, profile has no skills`); - return; } @@ -421,7 +419,6 @@ export class ProfileHelper if (!profileSkill) { this.logger.error(this.localisationService.getText("quest-no_skill_found", skill)); - return; } @@ -429,7 +426,7 @@ export class ProfileHelper { const globals = this.databaseServer.getTables().globals; const skillProgressRate = globals.config.SkillsSettings.SkillProgressRate; - pointsToAdd = skillProgressRate * pointsToAdd; + pointsToAdd *= skillProgressRate; } profileSkill.Progress += pointsToAdd; diff --git a/project/src/helpers/RagfairOfferHelper.ts b/project/src/helpers/RagfairOfferHelper.ts index 65126d73..33f72917 100644 --- a/project/src/helpers/RagfairOfferHelper.ts +++ b/project/src/helpers/RagfairOfferHelper.ts @@ -327,7 +327,7 @@ export class RagfairOfferHelper if (!offer.sellInOnePiece) { - totalItemsCount = offer.items.reduce((sum: number, item) => sum += item.upd.StackObjectsCount, 0); + totalItemsCount = offer.items.reduce((sum: number, item) => sum + item.upd.StackObjectsCount, 0); boughtAmount = offer.sellResult[0].amount; } @@ -729,6 +729,16 @@ export class RagfairOfferHelper return true; } + public isDisplayableOfferThatNeedsItem(searchRequest: ISearchRequestData, offer: IRagfairOffer): boolean + { + if (offer.requirements.some((requirement) => requirement._tpl === searchRequest.neededSearchId)) + { + return true; + } + + return false; + } + /** * Does the passed in item have a condition property * @param item Item to check diff --git a/project/src/services/RepairService.ts b/project/src/services/RepairService.ts index 53aad363..1795d732 100644 --- a/project/src/services/RepairService.ts +++ b/project/src/services/RepairService.ts @@ -573,24 +573,16 @@ export class RepairService /** * Ensure multiplier is between 1 and 0.01 - * @param receiveDurabilityMaxPercent Max durabiltiy percent + * @param receiveDurabilityMaxPercent Max durability percent * @param receiveDurabilityPercent current durability percent - * @returns durability multipler value + * @returns durability multiplier value */ protected getDurabilityMultiplier(receiveDurabilityMaxPercent: number, receiveDurabilityPercent: number): number { - receiveDurabilityMaxPercent = (receiveDurabilityMaxPercent > 0) ? receiveDurabilityMaxPercent : 0.01; - const num = receiveDurabilityPercent / receiveDurabilityMaxPercent; - if (num > 1) - { - return 1.0; - } - if (num < 0.01) - { - return 0.01; - } - - return num; + // Ensure the max percent is at least 0.01 + const validMaxPercent = Math.max(0.01, receiveDurabilityMaxPercent); + // Calculate the ratio and constrain it between 0.01 and 1 + return Math.min(1, Math.max(0.01, receiveDurabilityPercent / validMaxPercent)); } } diff --git a/project/src/utils/MathUtil.ts b/project/src/utils/MathUtil.ts index 1b80d111..448f07c1 100644 --- a/project/src/utils/MathUtil.ts +++ b/project/src/utils/MathUtil.ts @@ -22,9 +22,14 @@ export class MathUtil */ public arrayCumsum(values: number[]): number[] { - // curried function for cumulative sum: (cum, x) => cum += x - // and 0 being the initial value for the map - return values.map(((cum) => (x) => cum += x)(0)); + const cumsumArray = []; + let sum = 0; + for (let i = 0; i < values.length; i++) + { + sum += values[i]; + cumsumArray[i] = sum; + } + return cumsumArray; } /** diff --git a/project/src/utils/ObjectId.ts b/project/src/utils/ObjectId.ts index 4438e5e2..270479bf 100644 --- a/project/src/utils/ObjectId.ts +++ b/project/src/utils/ObjectId.ts @@ -17,7 +17,8 @@ export class ObjectId public incGlobalCounter(): number { - return (this.globalCounter = (this.globalCounter + 1) % 0xffffff); + this.globalCounter = (this.globalCounter + 1) % 0xffffff; + return this.globalCounter; } public toHexString(byteArray: string | any[] | Buffer): string diff --git a/project/src/utils/RandomUtil.ts b/project/src/utils/RandomUtil.ts index b39a4f93..2e1246c4 100644 --- a/project/src/utils/RandomUtil.ts +++ b/project/src/utils/RandomUtil.ts @@ -206,9 +206,9 @@ export class RandomUtil public getInt(min: number, max: number): number { - min = Math.ceil(min); - max = Math.floor(max); - return (max > min) ? Math.floor(Math.random() * (max - min + 1) + min) : min; + const minimum = Math.ceil(min); + const maximum = Math.floor(max); + return (maximum > minimum) ? Math.floor(Math.random() * (maximum - minimum + 1) + minimum) : minimum; } public getIntEx(max: number): number @@ -302,7 +302,7 @@ export class RandomUtil return this.getFloat(0.01, mean * 2); } - return this.getNormallyDistributedRandomNumber(mean, sigma, attempt++); + return this.getNormallyDistributedRandomNumber(mean, sigma, attempt + 1); } return valueDrawn; @@ -329,15 +329,16 @@ export class RandomUtil * Draw a random element of the provided list N times to return an array of N random elements * Drawing can be with or without replacement * @param {array} list The array we want to draw randomly from - * @param {integer} count The number of times we want to draw - * @param {boolean} replacement Draw with or without replacement from the input array(defult true) + * @param {integer} count The number of times we want to draw + * @param {boolean} replacement Draw with or without replacement from the input array(default true) * @return {array} Array consisting of N random elements */ - public drawRandomFromList(list: Array, count = 1, replacement = true): Array + public drawRandomFromList(originalList: Array, count = 1, replacement = true): Array { + let list = originalList; if (!replacement) { - list = this.jsonUtil.clone(list); + list = this.jsonUtil.clone(originalList); } const results = []; diff --git a/project/tests/controllers/InsuranceController.test.ts b/project/tests/controllers/InsuranceController.test.ts index c729b82f..ba0cbed5 100644 --- a/project/tests/controllers/InsuranceController.test.ts +++ b/project/tests/controllers/InsuranceController.test.ts @@ -397,7 +397,10 @@ describe("InsuranceController", () => // Add all items to the toDelete set. Not realistic, but it's fine for this test. const mockProcessRegularItems = vi.fn((insured, toDelete) => { - insured.items.forEach((item) => toDelete.add(item._id)); + for (const item of insured.items) + { + toDelete.add(item._id); + } }); vi.spyOn(insuranceController, "processRegularItems").mockImplementation(mockProcessRegularItems); @@ -462,12 +465,18 @@ describe("InsuranceController", () => // Add all items to the toDelete set. Not realistic, but it's fine for this test. const mockProcessRegularItems = vi.fn((insured, toDelete) => { - insured.items.forEach((item) => toDelete.add(item._id)); + for (const item of insured.items) + { + toDelete.add(item._id); + } }); vi.spyOn(insuranceController, "processRegularItems").mockImplementation(mockProcessRegularItems); const mockProcessAttachments = vi.fn((parentAttachmentsMap, itemsMap, traderId, toDelete) => { - insured.items.forEach((item) => toDelete.add(item._id)); + for (const item of insured.items) + { + toDelete.add(item._id); + } }); vi.spyOn(insuranceController, "processAttachments").mockImplementation(mockProcessAttachments); @@ -526,12 +535,18 @@ describe("InsuranceController", () => // Add all items to the toDelete set. Not realistic, but it's fine for this test. const mockProcessRegularItems = vi.fn((insured, toDelete) => { - insured.items.forEach((item) => toDelete.add(item._id)); + for (const item of insured.items) + { + toDelete.add(item._id); + } }); vi.spyOn(insuranceController, "processRegularItems").mockImplementation(mockProcessRegularItems); const mockProcessAttachments = vi.fn((parentAttachmentsMap, itemsMap, traderId, toDelete) => { - insured.items.forEach((item) => toDelete.add(item._id)); + for (const item of insured.items) + { + toDelete.add(item._id); + } }); vi.spyOn(insuranceController, "processAttachments").mockImplementation(mockProcessAttachments); @@ -572,11 +587,11 @@ describe("InsuranceController", () => "9f8d7880a6e0a47a211ec5d3", "db2ef9442178910eba985b51", ]; - validAttachmentTemplates.forEach((value) => + for (const value of validAttachmentTemplates) { // Verify that each template is present in the array of attachments. expect(gun.some((item) => item._id === value)).toBe(true); - }); + } }); it("should ignore gun accessories that cannot be modified in-raid", () => @@ -602,10 +617,11 @@ describe("InsuranceController", () => "402b4086535a50ef7d9cef88", "566335b3df586f34b47f5e35", ]; - invalidAttachmentTemplates.forEach((value) => + for (const value of invalidAttachmentTemplates) { + // Verify that each template is not present in the array of attachments. expect(gun.every((item) => item._id !== value)).toBe(true); - }); + } }); it("should correctly map helmet to all of its attachments", () => @@ -632,11 +648,11 @@ describe("InsuranceController", () => "ac134d7cf6c9d8e25edd0015", "22274b895ecc80d51c3cba1c", ]; - validAttachmentTemplates.forEach((value) => + for (const value of validAttachmentTemplates) { // Verify that each template is present in the array of attachments. expect(gun.some((item) => item._id === value)).toBe(true); - }); + } }); it("should correctly map gun to all of its attachments when gun is within a container", () => @@ -900,10 +916,10 @@ describe("InsuranceController", () => // Verify that the attachments with null maxPrice are at the bottom of the list const nullPriceAttachments = sortedAttachments.slice(-2); - nullPriceAttachments.forEach((attachment) => + for (const attachment of nullPriceAttachments) { expect(attachment.maxPrice).toBeNull(); - }); + } // Verify that the rest of the attachments are sorted by maxPrice in descending order for (let i = 1; i < sortedAttachments.length - 2; i++) @@ -1078,10 +1094,10 @@ describe("InsuranceController", () => insuranceController.removeItemsFromInsurance(insured, toDelete); // Ensure that the items in the toDelete set are not present in the insured items array. - toDelete.forEach((toDeleteId) => + for (const toDeleteId of toDelete) { expect(insured.items.some((item) => item._id === toDeleteId)).toBe(false); - }); + } }); it("should not remove any items if toDelete set is empty", () => @@ -1102,7 +1118,10 @@ describe("InsuranceController", () => const insured = insuranceFixture[0]; const originalCount = insured.items.length; const toDelete = new Set(); - insured.items.forEach((item) => toDelete.add(item._id)); + for (const item of insured.items) + { + toDelete.add(item._id); + } // All of the items should be added to the toDelete set. expect(originalCount).toBe(toDelete.size);