feat(webui): adding modular K-Drives, Amps and Zaw (#1374)
Reviewed-on: OpenWF/SpaceNinjaServer#1374 Co-authored-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Co-committed-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
This commit is contained in:
parent
c376ff25f3
commit
4cb883dabf
21
src/controllers/custom/addModularEquipmentController.ts
Normal file
21
src/controllers/custom/addModularEquipmentController.ts
Normal file
@ -0,0 +1,21 @@
|
||||
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 category = modularWeaponTypes[request.ItemType];
|
||||
const inventoryBin = productCategoryToInventoryBin(category)!;
|
||||
const inventory = await getInventory(accountId, `${category} ${inventoryBin}`);
|
||||
addEquipment(inventory, category, request.ItemType, request.ModularParts);
|
||||
occupySlot(inventory, inventoryBin, true);
|
||||
await inventory.save();
|
||||
res.end();
|
||||
};
|
||||
|
||||
interface IAddModularEquipmentRequest {
|
||||
ItemType: string;
|
||||
ModularParts: string[];
|
||||
}
|
@ -25,6 +25,7 @@ interface ListedItem {
|
||||
fusionLimit?: number;
|
||||
exalted?: string[];
|
||||
badReason?: "starter" | "frivolous" | "notraw";
|
||||
partType?: string;
|
||||
}
|
||||
|
||||
const relicQualitySuffixes: Record<TRelicQuality, string> = {
|
||||
@ -50,6 +51,7 @@ const getItemListsController: RequestHandler = (req, response) => {
|
||||
res.MechSuits = [];
|
||||
res.miscitems = [];
|
||||
res.Syndicates = [];
|
||||
res.OperatorAmps = [];
|
||||
for (const [uniqueName, item] of Object.entries(ExportWarframes)) {
|
||||
res[item.productCategory].push({
|
||||
uniqueName,
|
||||
@ -79,7 +81,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({
|
||||
@ -94,7 +97,8 @@ const getItemListsController: RequestHandler = (req, response) => {
|
||||
item.productCategory == "Melee" ||
|
||||
item.productCategory == "SpaceGuns" ||
|
||||
item.productCategory == "SpaceMelee" ||
|
||||
item.productCategory == "SentinelWeapons"
|
||||
item.productCategory == "SentinelWeapons" ||
|
||||
item.productCategory == "OperatorAmps"
|
||||
) {
|
||||
res[item.productCategory].push({
|
||||
uniqueName,
|
||||
|
@ -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);
|
||||
|
@ -193,10 +193,15 @@
|
||||
<div class="card mb-3" style="height: 400px;">
|
||||
<h5 class="card-header" data-loc="inventory_melee"></h5>
|
||||
<div class="card-body overflow-auto">
|
||||
<form class="input-group mb-3" onsubmit="doAcquireEquipment('Melee');return false;">
|
||||
<form class="input-group mb-3" onsubmit="handleModularSelection('Melee');return false;">
|
||||
<input class="form-control" id="acquire-type-Melee" list="datalist-Melee" />
|
||||
<button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
|
||||
</form>
|
||||
<form class="input-group mb-3" id="modular-Melee" style="display: none;">
|
||||
<input class="form-control" id="acquire-type-Melee-BLADE" list="datalist-ModularParts-BLADE" />
|
||||
<input class="form-control" id="acquire-type-Melee-HILT" list="datalist-ModularParts-HILT" />
|
||||
<input class="form-control" id="acquire-type-Melee-HILT_WEIGHT" list="datalist-ModularParts-HILT_WEIGHT" />
|
||||
</form>
|
||||
<table class="table table-hover w-100">
|
||||
<tbody id="Melee-list"></tbody>
|
||||
</table>
|
||||
@ -299,6 +304,15 @@
|
||||
<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="handleModularSelection('OperatorAmps');return false;">
|
||||
<input class="form-control" id="acquire-type-OperatorAmps" list="datalist-OperatorAmps" />
|
||||
<button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
|
||||
</form>
|
||||
<form class="input-group mb-3" id="modular-OperatorAmps" style="display: none;">
|
||||
<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" />
|
||||
</form>
|
||||
<table class="table table-hover w-100">
|
||||
<tbody id="OperatorAmps-list"></tbody>
|
||||
</table>
|
||||
@ -309,6 +323,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 +625,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 +633,18 @@
|
||||
<option data-key="/Lotus/Upgrades/CosmeticEnhancers/Peculiars/CyoteMod" value="Traumatic Peculiar"></option>
|
||||
</datalist>
|
||||
<datalist id="datalist-archonCrystalUpgrades"></datalist>
|
||||
<datalist id="datalist-OperatorAmps"></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>
|
||||
<datalist id="datalist-ModularParts-BLADE"></datalist>
|
||||
<datalist id="datalist-ModularParts-HILT"></datalist>
|
||||
<datalist id="datalist-ModularParts-HILT_WEIGHT"></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>
|
||||
|
@ -185,6 +185,16 @@ function fetchItemList() {
|
||||
name: loc("code_traumaticPeculiar")
|
||||
});
|
||||
|
||||
// Add modular weapons
|
||||
data.OperatorAmps.push({
|
||||
uniqueName: "/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon",
|
||||
name: loc("code_amp")
|
||||
});
|
||||
data.Melee.push({
|
||||
uniqueName: "/Lotus/Weapons/Ostron/Melee/LotusModularWeapon",
|
||||
name: loc("code_zaw")
|
||||
});
|
||||
|
||||
const itemMap = {
|
||||
// Generics for rivens
|
||||
"/Lotus/Weapons/Tenno/Archwing/Primary/ArchGun": { name: loc("code_archgun") },
|
||||
@ -201,14 +211,9 @@ function fetchItemList() {
|
||||
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary": { name: loc("code_kitgun") },
|
||||
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryBeam": { name: loc("code_kitgun") },
|
||||
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryShotgun": { name: loc("code_kitgun") },
|
||||
"/Lotus/Weapons/Ostron/Melee/LotusModularWeapon": { name: loc("code_zaw") },
|
||||
"/Lotus/Weapons/Sentients/OperatorAmplifiers/SentTrainingAmplifier/OperatorTrainingAmpWeapon": {
|
||||
name: loc("code_moteAmp")
|
||||
},
|
||||
"/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon": { name: loc("code_amp") },
|
||||
"/Lotus/Weapons/Operator/Pistols/DrifterPistol/DrifterPistolPlayerWeapon": {
|
||||
name: loc("code_sirocco")
|
||||
},
|
||||
"/Lotus/Types/Vehicles/Hoverboard/HoverboardSuit": { name: loc("code_kDrive") }
|
||||
};
|
||||
for (const [type, items] of Object.entries(data)) {
|
||||
@ -233,6 +238,33 @@ 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",
|
||||
"LWPT_BLADE",
|
||||
"LWPT_HILT",
|
||||
"LWPT_HILT_WEIGHT"
|
||||
];
|
||||
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 +654,67 @@ function doAcquireEquipment(category) {
|
||||
});
|
||||
}
|
||||
|
||||
function doAcquireModularEquipment(category, 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":
|
||||
requiredParts = ["AMP_OCULUS", "AMP_CORE", "AMP_BRACE"];
|
||||
break;
|
||||
case "Melee":
|
||||
requiredParts = ["BLADE", "HILT", "HILT_WEIGHT"];
|
||||
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(() => {
|
||||
const mainInput = document.getElementById("acquire-type-" + category);
|
||||
if (mainInput) {
|
||||
mainInput.value = "";
|
||||
document.getElementById("modular-" + category).style.display = "none";
|
||||
}
|
||||
requiredParts.forEach(part => {
|
||||
document.getElementById("acquire-type-" + category + "-" + part).value = "";
|
||||
});
|
||||
updateInventory();
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
$("input[list]").on("input", function () {
|
||||
$(this).removeClass("is-invalid");
|
||||
});
|
||||
@ -1220,3 +1313,34 @@ function toast(text) {
|
||||
toast.appendChild(div);
|
||||
new bootstrap.Toast(document.querySelector(".toast-container").appendChild(toast)).show();
|
||||
}
|
||||
|
||||
function handleModularSelection(category) {
|
||||
const modularWeapons = [
|
||||
"/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon",
|
||||
"/Lotus/Weapons/Ostron/Melee/LotusModularWeapon"
|
||||
];
|
||||
const itemType = getKey(document.getElementById("acquire-type-" + category));
|
||||
|
||||
if (modularWeapons.includes(itemType)) {
|
||||
doAcquireModularEquipment(category, itemType);
|
||||
} else {
|
||||
doAcquireEquipment(category);
|
||||
}
|
||||
}
|
||||
{
|
||||
const modularWeapons = [
|
||||
"/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon",
|
||||
"/Lotus/Weapons/Ostron/Melee/LotusModularWeapon"
|
||||
];
|
||||
const supportedModularInventoryCategory = ["OperatorAmps", "Melee"];
|
||||
supportedModularInventoryCategory.forEach(inventoryCategory => {
|
||||
document.getElementById("acquire-type-" + inventoryCategory).addEventListener("input", function () {
|
||||
const modularFields = document.getElementById("modular-" + inventoryCategory);
|
||||
if (modularWeapons.includes(getKey(this))) {
|
||||
modularFields.style.display = "";
|
||||
} else {
|
||||
modularFields.style.display = "none";
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -15,7 +15,6 @@ dict = {
|
||||
code_zaw: `Zaw`,
|
||||
code_moteAmp: `Anfangsverstärker`,
|
||||
code_amp: `Verstärker`,
|
||||
code_sirocco: `Sirocco`,
|
||||
code_kDrive: `K-Drive`,
|
||||
code_legendaryCore: `Legendärer Kern`,
|
||||
code_traumaticPeculiar: `Kuriose Mod: Traumatisch`,
|
||||
|
@ -14,7 +14,6 @@ dict = {
|
||||
code_zaw: `Zaw`,
|
||||
code_moteAmp: `Mote Amp`,
|
||||
code_amp: `Amp`,
|
||||
code_sirocco: `Sirocco`,
|
||||
code_kDrive: `K-Drive`,
|
||||
code_legendaryCore: `Legendary Core`,
|
||||
code_traumaticPeculiar: `Traumatic Peculiar`,
|
||||
|
@ -15,7 +15,6 @@ dict = {
|
||||
code_zaw: `Zaw`,
|
||||
code_moteAmp: `Amplificateur Faible`,
|
||||
code_amp: `Amplificateur`,
|
||||
code_sirocco: `Sirocco`,
|
||||
code_kDrive: `K-Drive`,
|
||||
code_legendaryCore: `Coeur Légendaire`,
|
||||
code_traumaticPeculiar: `Traumatisme Atypique`,
|
||||
|
@ -15,7 +15,6 @@ dict = {
|
||||
code_zaw: `Зо`,
|
||||
code_moteAmp: `Пылинка`,
|
||||
code_amp: `Усилитель`,
|
||||
code_sirocco: `Сирокко`,
|
||||
code_kDrive: `К-Драйв`,
|
||||
code_legendaryCore: `Легендарное ядро`,
|
||||
code_traumaticPeculiar: `Травмирующая Странность`,
|
||||
|
@ -15,7 +15,6 @@ dict = {
|
||||
code_zaw: `自制近战`,
|
||||
code_moteAmp: `微尘增幅器`,
|
||||
code_amp: `增幅器`,
|
||||
code_sirocco: `赤风`,
|
||||
code_kDrive: `K式悬浮板`,
|
||||
code_legendaryCore: `传奇核心`,
|
||||
code_traumaticPeculiar: `创伤怪奇`,
|
||||
|
Loading…
x
Reference in New Issue
Block a user