feat(webui): adding modular K-Drives and Amps
All checks were successful
Build / build (20) (pull_request) Successful in 39s
Build / build (18) (pull_request) Successful in 1m18s
Build / build (22) (pull_request) Successful in 1m19s

This commit is contained in:
AMelonInsideLemon 2025-03-29 19:38:25 +01:00
parent 9de0aee6f0
commit 9ea061fdb3
5 changed files with 126 additions and 3 deletions

View File

@ -0,0 +1,20 @@
import { getAccountIdForRequest } from "@/src/services/loginService";
import { getInventory, addEquipment, occupySlot, productCategoryToInventoryBin } from "@/src/services/inventoryService";
import { RequestHandler } from "express";
import { modularWeaponTypes } from "@/src/helpers/modularWeaponHelper";
export const addModularEquipmentController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req);
const request = req.body as IAddModularEquipmentRequest;
const inventory = await getInventory(accountId);
const category = modularWeaponTypes[request.ItemType];
addEquipment(inventory, category, request.ItemType, request.ModularParts);
occupySlot(inventory, productCategoryToInventoryBin(category)!, true);
await inventory.save();
res.end();
};
interface IAddModularEquipmentRequest {
ItemType: string;
ModularParts: string[];
}

View File

@ -25,6 +25,7 @@ interface ListedItem {
fusionLimit?: number;
exalted?: string[];
badReason?: "starter" | "frivolous" | "notraw";
partType?: string;
}
const relicQualitySuffixes: Record<TRelicQuality, string> = {
@ -79,7 +80,8 @@ const getItemListsController: RequestHandler = (req, response) => {
) {
res.ModularParts.push({
uniqueName,
name: getString(item.name, lang)
name: getString(item.name, lang),
partType: item.partType
});
if (uniqueName.split("/")[5] != "SentTrainingAmplifier") {
res.miscitems.push({

View File

@ -13,8 +13,9 @@ import { unlockAllIntrinsicsController } from "@/src/controllers/custom/unlockAl
import { createAccountController } from "@/src/controllers/custom/createAccountController";
import { createMessageController } from "@/src/controllers/custom/createMessageController";
import { addCurrencyController } from "../controllers/custom/addCurrencyController";
import { addCurrencyController } from "@/src/controllers/custom/addCurrencyController";
import { addItemsController } from "@/src/controllers/custom/addItemsController";
import { addModularEquipmentController } from "@/src/controllers/custom/addModularEquipmentController";
import { addXpController } from "@/src/controllers/custom/addXpController";
import { importController } from "@/src/controllers/custom/importController";
@ -39,6 +40,7 @@ customRouter.post("/createAccount", createAccountController);
customRouter.post("/createMessage", createMessageController);
customRouter.post("/addCurrency", addCurrencyController);
customRouter.post("/addItems", addItemsController);
customRouter.post("/addModularEquipment", addModularEquipmentController);
customRouter.post("/addXp", addXpController);
customRouter.post("/import", importController);
customRouter.post("/manageQuests", manageQuestsController);

View File

@ -299,6 +299,12 @@
<div class="card mb-3" style="height: 400px;">
<h5 class="card-header" data-loc="inventory_operatorAmps"></h5>
<div class="card-body overflow-auto">
<form class="input-group mb-3" onsubmit="doAcquireModularEquipment('OperatorAmps');return false;">
<input class="form-control" id="acquire-type-OperatorAmps-AMP_OCULUS" list="datalist-ModularParts-AMP_OCULUS" />
<input class="form-control" id="acquire-type-OperatorAmps-AMP_CORE" list="datalist-ModularParts-AMP_CORE" />
<input class="form-control" id="acquire-type-OperatorAmps-AMP_BRACE" list="datalist-ModularParts-AMP_BRACE" />
<button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
</form>
<table class="table table-hover w-100">
<tbody id="OperatorAmps-list"></tbody>
</table>
@ -309,6 +315,13 @@
<div class="card mb-3" style="height: 400px;">
<h5 class="card-header" data-loc="inventory_hoverboards"></h5>
<div class="card-body overflow-auto">
<form class="input-group mb-3" onsubmit="doAcquireModularEquipment('HoverBoards');return false;">
<input class="form-control" id="acquire-type-HoverBoards-HB_DECK" list="datalist-ModularParts-HB_DECK" />
<input class="form-control" id="acquire-type-HoverBoards-HB_ENGINE" list="datalist-ModularParts-HB_ENGINE" />
<input class="form-control" id="acquire-type-HoverBoards-HB_FRONT" list="datalist-ModularParts-HB_FRONT" />
<input class="form-control" id="acquire-type-HoverBoards-HB_JET" list="datalist-ModularParts-HB_JET" />
<button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
</form>
<table class="table table-hover w-100">
<tbody id="Hoverboards-list"></tbody>
</table>
@ -604,7 +617,6 @@
<datalist id="datalist-SpaceMelee"></datalist>
<datalist id="datalist-SentinelWeapons"></datalist>
<datalist id="datalist-Sentinels"></datalist>
<datalist id="datalist-ModularParts"></datalist>
<datalist id="datalist-MechSuits"></datalist>
<datalist id="datalist-Syndicates"></datalist>
<datalist id="datalist-miscitems"></datalist>
@ -613,6 +625,14 @@
<option data-key="/Lotus/Upgrades/CosmeticEnhancers/Peculiars/CyoteMod" value="Traumatic Peculiar"></option>
</datalist>
<datalist id="datalist-archonCrystalUpgrades"></datalist>
<datalist id="datalist-ModularParts"></datalist>
<datalist id="datalist-ModularParts-HB_DECK"></datalist>
<datalist id="datalist-ModularParts-HB_ENGINE"></datalist>
<datalist id="datalist-ModularParts-HB_FRONT"></datalist>
<datalist id="datalist-ModularParts-HB_JET"></datalist>
<datalist id="datalist-ModularParts-AMP_OCULUS"></datalist>
<datalist id="datalist-ModularParts-AMP_CORE"></datalist>
<datalist id="datalist-ModularParts-AMP_BRACE"></datalist>
<script src="/webui/libs/jquery-3.6.0.min.js"></script>
<script src="/webui/libs/whirlpool-js.min.js"></script>
<script src="/webui/libs/single.js"></script>

View File

@ -233,6 +233,30 @@ function fetchItemList() {
if (type == "Syndicates" && item.uniqueName.startsWith("RadioLegion")) {
item.name += " (" + item.uniqueName + ")";
}
if (type == "ModularParts") {
const supportedModularParts = [
"LWPT_HB_DECK",
"LWPT_HB_ENGINE",
"LWPT_HB_FRONT",
"LWPT_HB_JET",
"LWPT_AMP_OCULUS",
"LWPT_AMP_CORE",
"LWPT_AMP_BRACE"
];
if (supportedModularParts.includes(item.partType)) {
const option = document.createElement("option");
option.setAttribute("data-key", item.uniqueName);
option.value = item.name;
document
.getElementById("datalist-" + type + "-" + item.partType.slice(5))
.appendChild(option);
} else {
const option = document.createElement("option");
option.setAttribute("data-key", item.uniqueName);
option.value = item.name;
document.getElementById("datalist-" + type).appendChild(option);
}
}
if (item.badReason != "notraw") {
const option = document.createElement("option");
option.setAttribute("data-key", item.uniqueName);
@ -622,6 +646,61 @@ function doAcquireEquipment(category) {
});
}
function doAcquireModularEquipment(category) {
let ItemType;
let requiredParts;
let ModularParts = [];
switch (category) {
case "HoverBoards":
ItemType = "/Lotus/Types/Vehicles/Hoverboard/HoverboardSuit";
requiredParts = ["HB_DECK", "HB_ENGINE", "HB_FRONT", "HB_JET"];
break;
case "OperatorAmps":
ItemType = "/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon";
requiredParts = ["AMP_OCULUS", "AMP_CORE", "AMP_BRACE"];
break;
}
requiredParts.forEach(part => {
const partName = getKey(document.getElementById("acquire-type-" + category + "-" + part));
if (partName) {
ModularParts.push(partName);
}
});
if (ModularParts.length != requiredParts.length) {
let isFirstPart = true;
requiredParts.forEach(part => {
const partSelector = document.getElementById("acquire-type-" + category + "-" + part);
if (!getKey(partSelector)) {
if (isFirstPart) {
isFirstPart = false;
$("#acquire-type-" + category + "-" + part)
.addClass("is-invalid")
.focus();
} else {
$("#acquire-type-" + category + "-" + part).addClass("is-invalid");
}
}
});
} else {
revalidateAuthz(() => {
const req = $.post({
url: "/custom/addModularEquipment?" + window.authz,
contentType: "application/json",
data: JSON.stringify({
ItemType,
ModularParts
})
});
req.done(() => {
requiredParts.forEach(part => {
document.getElementById("acquire-type-" + category + "-" + part).value = "";
});
updateInventory();
});
});
}
}
$("input[list]").on("input", function () {
$(this).removeClass("is-invalid");
});