Reenable post-scav swapping with server support; add /uifixes/assortUnlocks
This commit is contained in:
@@ -38,6 +38,8 @@ import ignore from "ignore";
|
||||
import archiver from "archiver";
|
||||
import winston from "winston";
|
||||
|
||||
const sptPath = "/SPT/3.8.1-debug";
|
||||
|
||||
// Get the command line arguments to determine whether to use verbose logging.
|
||||
const args = process.argv.slice(2);
|
||||
const verbose = args.includes("--verbose") || args.includes("-v");
|
||||
@@ -113,6 +115,12 @@ async function main() {
|
||||
await copyFiles(currentDir, projectDir, buildIgnorePatterns);
|
||||
logger.log("success", "Files successfully copied to temporary directory.");
|
||||
|
||||
// Copy output to SPT installation for testing
|
||||
logger.log("info", "Copying output to SPT installation");
|
||||
const sptModPath = path.join(sptPath, "/user/mods/", projectShortName);
|
||||
await fs.copy(projectDir, sptModPath);
|
||||
logger.log("success", `Files successfully copied to ${sptModPath}`);
|
||||
|
||||
// Create a zip archive of the project files.
|
||||
logger.log("info", "Beginning folder compression...");
|
||||
const zipFilePath = path.join(path.dirname(projectDir), `${projectName}.zip`);
|
||||
@@ -134,7 +142,7 @@ async function main() {
|
||||
logger.log("success", "------------------------------------");
|
||||
logger.log("success", "Build script completed successfully!");
|
||||
logger.log("success", "Your mod package has been created in the 'dist' directory:");
|
||||
logger.log("success", `/${path.relative(process.cwd(), path.join(distDir, `${projectName}.zip`))}`);
|
||||
logger.log("success", `${path.relative(process.cwd(), path.join(distDir, `${projectName}.zip`))}`);
|
||||
logger.log("success", "------------------------------------");
|
||||
if (!verbose) {
|
||||
logger.log("success", "To see a detailed build log, use `npm run buildinfo`.");
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "tyfon-uifixes",
|
||||
"version": "1.0.0",
|
||||
"name": "uifixes",
|
||||
"version": "1.6.0",
|
||||
"main": "src/mod.js",
|
||||
"license": "MIT",
|
||||
"author": "Tyfon",
|
||||
|
@@ -1,34 +1,87 @@
|
||||
import { DependencyContainer } from "tsyringe";
|
||||
|
||||
import { IPreAkiLoadMod } from "@spt-aki/models/external/IPreAkiLoadMod";
|
||||
import { InventoryController } from "@spt-aki/controllers/InventoryController";
|
||||
import { ProfileHelper } from "@spt-aki/helpers/ProfileHelper";
|
||||
import type { IPreAkiLoadMod } from "@spt-aki/models/external/IPreAkiLoadMod";
|
||||
import type { InventoryController } from "@spt-aki/controllers/InventoryController";
|
||||
import type { ProfileHelper } from "@spt-aki/helpers/ProfileHelper";
|
||||
import type { StaticRouterModService } from "@spt-aki/services/mod/staticRouter/StaticRouterModService";
|
||||
import type { DatabaseServer } from "@spt-aki/servers/DatabaseServer";
|
||||
import type { ILogger } from "@spt-aki/models/spt/utils/ILogger";
|
||||
|
||||
class UIFixes implements IPreAkiLoadMod {
|
||||
private container: DependencyContainer;
|
||||
private profileHelper: ProfileHelper;
|
||||
private databaseServer: DatabaseServer;
|
||||
private logger: ILogger;
|
||||
|
||||
preAkiLoad(container: DependencyContainer): void {
|
||||
this.container = container;
|
||||
this.profileHelper = container.resolve<ProfileHelper>("ProfileHelper");
|
||||
public preAkiLoad(container: DependencyContainer): void {
|
||||
this.databaseServer = container.resolve<DatabaseServer>("DatabaseServer");
|
||||
this.logger = container.resolve<ILogger>("WinstonLogger");
|
||||
|
||||
const profileHelper = container.resolve<ProfileHelper>("ProfileHelper");
|
||||
const staticRouterModService = container.resolve<StaticRouterModService>("StaticRouterModService");
|
||||
|
||||
// Handle scav profile for post-raid scav transfer swaps (fixed in 3.9.0)
|
||||
container.afterResolution(
|
||||
"InventoryController",
|
||||
(_, result: InventoryController) => {
|
||||
const original = result.swapItem;
|
||||
(_, inventoryController: InventoryController) => {
|
||||
const original = inventoryController.swapItem;
|
||||
|
||||
result.swapItem = (pmcData, request, sessionID) => {
|
||||
inventoryController.swapItem = (pmcData, request, sessionID) => {
|
||||
let playerData = pmcData;
|
||||
if (request.fromOwner?.type === "Profile" && request.fromOwner.id !== playerData._id) {
|
||||
playerData = this.profileHelper.getScavProfile(sessionID);
|
||||
playerData = profileHelper.getScavProfile(sessionID);
|
||||
}
|
||||
|
||||
return original(playerData, request, sessionID);
|
||||
return original.call(inventoryController, playerData, request, sessionID);
|
||||
};
|
||||
},
|
||||
{ frequency: "Always" }
|
||||
);
|
||||
|
||||
staticRouterModService.registerStaticRouter(
|
||||
"UIFixesRoutes",
|
||||
[
|
||||
{
|
||||
url: "/uifixes/assortUnlocks",
|
||||
action: (url, info, sessionId, output) => {
|
||||
return JSON.stringify(this.loadAssortmentUnlocks());
|
||||
}
|
||||
}
|
||||
],
|
||||
"custom-static-ui-fixes"
|
||||
);
|
||||
}
|
||||
|
||||
private loadAssortmentUnlocks() {
|
||||
const traders = this.databaseServer.getTables().traders;
|
||||
const quests = this.databaseServer.getTables().templates.quests;
|
||||
|
||||
const result: Record<string, string> = {};
|
||||
|
||||
for (const traderId in traders) {
|
||||
const trader = traders[traderId];
|
||||
if (trader.questassort) {
|
||||
for (const questStatus in trader.questassort) {
|
||||
// Explicitly check that quest status is an expected value - some mods accidently import in such a way that adds a "default" value
|
||||
if (!["started", "success", "fail"].includes(questStatus)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (const assortId in trader.questassort[questStatus]) {
|
||||
const questId = trader.questassort[questStatus][assortId];
|
||||
|
||||
if (!quests[questId]) {
|
||||
this.logger.error(
|
||||
`Trader ${traderId} questassort references unknown quest ${JSON.stringify(questId)}!`
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
result[assortId] = quests[questId].name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user