feat(webui): adding modular K-Drives and Amps
This commit is contained in:
		
							parent
							
								
									9de0aee6f0
								
							
						
					
					
						commit
						9ea061fdb3
					
				
							
								
								
									
										20
									
								
								src/controllers/custom/addModularEquipmentController.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/controllers/custom/addModularEquipmentController.ts
									
									
									
									
									
										Normal 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[];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -25,6 +25,7 @@ interface ListedItem {
 | 
				
			|||||||
    fusionLimit?: number;
 | 
					    fusionLimit?: number;
 | 
				
			||||||
    exalted?: string[];
 | 
					    exalted?: string[];
 | 
				
			||||||
    badReason?: "starter" | "frivolous" | "notraw";
 | 
					    badReason?: "starter" | "frivolous" | "notraw";
 | 
				
			||||||
 | 
					    partType?: string;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const relicQualitySuffixes: Record<TRelicQuality, string> = {
 | 
					const relicQualitySuffixes: Record<TRelicQuality, string> = {
 | 
				
			||||||
@ -79,7 +80,8 @@ const getItemListsController: RequestHandler = (req, response) => {
 | 
				
			|||||||
        ) {
 | 
					        ) {
 | 
				
			||||||
            res.ModularParts.push({
 | 
					            res.ModularParts.push({
 | 
				
			||||||
                uniqueName,
 | 
					                uniqueName,
 | 
				
			||||||
                name: getString(item.name, lang)
 | 
					                name: getString(item.name, lang),
 | 
				
			||||||
 | 
					                partType: item.partType
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            if (uniqueName.split("/")[5] != "SentTrainingAmplifier") {
 | 
					            if (uniqueName.split("/")[5] != "SentTrainingAmplifier") {
 | 
				
			||||||
                res.miscitems.push({
 | 
					                res.miscitems.push({
 | 
				
			||||||
 | 
				
			|||||||
@ -13,8 +13,9 @@ import { unlockAllIntrinsicsController } from "@/src/controllers/custom/unlockAl
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import { createAccountController } from "@/src/controllers/custom/createAccountController";
 | 
					import { createAccountController } from "@/src/controllers/custom/createAccountController";
 | 
				
			||||||
import { createMessageController } from "@/src/controllers/custom/createMessageController";
 | 
					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 { addItemsController } from "@/src/controllers/custom/addItemsController";
 | 
				
			||||||
 | 
					import { addModularEquipmentController } from "@/src/controllers/custom/addModularEquipmentController";
 | 
				
			||||||
import { addXpController } from "@/src/controllers/custom/addXpController";
 | 
					import { addXpController } from "@/src/controllers/custom/addXpController";
 | 
				
			||||||
import { importController } from "@/src/controllers/custom/importController";
 | 
					import { importController } from "@/src/controllers/custom/importController";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -39,6 +40,7 @@ customRouter.post("/createAccount", createAccountController);
 | 
				
			|||||||
customRouter.post("/createMessage", createMessageController);
 | 
					customRouter.post("/createMessage", createMessageController);
 | 
				
			||||||
customRouter.post("/addCurrency", addCurrencyController);
 | 
					customRouter.post("/addCurrency", addCurrencyController);
 | 
				
			||||||
customRouter.post("/addItems", addItemsController);
 | 
					customRouter.post("/addItems", addItemsController);
 | 
				
			||||||
 | 
					customRouter.post("/addModularEquipment", addModularEquipmentController);
 | 
				
			||||||
customRouter.post("/addXp", addXpController);
 | 
					customRouter.post("/addXp", addXpController);
 | 
				
			||||||
customRouter.post("/import", importController);
 | 
					customRouter.post("/import", importController);
 | 
				
			||||||
customRouter.post("/manageQuests", manageQuestsController);
 | 
					customRouter.post("/manageQuests", manageQuestsController);
 | 
				
			||||||
 | 
				
			|||||||
@ -299,6 +299,12 @@
 | 
				
			|||||||
                        <div class="card mb-3" style="height: 400px;">
 | 
					                        <div class="card mb-3" style="height: 400px;">
 | 
				
			||||||
                            <h5 class="card-header" data-loc="inventory_operatorAmps"></h5>
 | 
					                            <h5 class="card-header" data-loc="inventory_operatorAmps"></h5>
 | 
				
			||||||
                            <div class="card-body overflow-auto">
 | 
					                            <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">
 | 
					                                <table class="table table-hover w-100">
 | 
				
			||||||
                                    <tbody id="OperatorAmps-list"></tbody>
 | 
					                                    <tbody id="OperatorAmps-list"></tbody>
 | 
				
			||||||
                                </table>
 | 
					                                </table>
 | 
				
			||||||
@ -309,6 +315,13 @@
 | 
				
			|||||||
                        <div class="card mb-3" style="height: 400px;">
 | 
					                        <div class="card mb-3" style="height: 400px;">
 | 
				
			||||||
                            <h5 class="card-header" data-loc="inventory_hoverboards"></h5>
 | 
					                            <h5 class="card-header" data-loc="inventory_hoverboards"></h5>
 | 
				
			||||||
                            <div class="card-body overflow-auto">
 | 
					                            <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">
 | 
					                                <table class="table table-hover w-100">
 | 
				
			||||||
                                    <tbody id="Hoverboards-list"></tbody>
 | 
					                                    <tbody id="Hoverboards-list"></tbody>
 | 
				
			||||||
                                </table>
 | 
					                                </table>
 | 
				
			||||||
@ -604,7 +617,6 @@
 | 
				
			|||||||
    <datalist id="datalist-SpaceMelee"></datalist>
 | 
					    <datalist id="datalist-SpaceMelee"></datalist>
 | 
				
			||||||
    <datalist id="datalist-SentinelWeapons"></datalist>
 | 
					    <datalist id="datalist-SentinelWeapons"></datalist>
 | 
				
			||||||
    <datalist id="datalist-Sentinels"></datalist>
 | 
					    <datalist id="datalist-Sentinels"></datalist>
 | 
				
			||||||
    <datalist id="datalist-ModularParts"></datalist>
 | 
					 | 
				
			||||||
    <datalist id="datalist-MechSuits"></datalist>
 | 
					    <datalist id="datalist-MechSuits"></datalist>
 | 
				
			||||||
    <datalist id="datalist-Syndicates"></datalist>
 | 
					    <datalist id="datalist-Syndicates"></datalist>
 | 
				
			||||||
    <datalist id="datalist-miscitems"></datalist>
 | 
					    <datalist id="datalist-miscitems"></datalist>
 | 
				
			||||||
@ -613,6 +625,14 @@
 | 
				
			|||||||
        <option data-key="/Lotus/Upgrades/CosmeticEnhancers/Peculiars/CyoteMod" value="Traumatic Peculiar"></option>
 | 
					        <option data-key="/Lotus/Upgrades/CosmeticEnhancers/Peculiars/CyoteMod" value="Traumatic Peculiar"></option>
 | 
				
			||||||
    </datalist>
 | 
					    </datalist>
 | 
				
			||||||
    <datalist id="datalist-archonCrystalUpgrades"></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/jquery-3.6.0.min.js"></script>
 | 
				
			||||||
    <script src="/webui/libs/whirlpool-js.min.js"></script>
 | 
					    <script src="/webui/libs/whirlpool-js.min.js"></script>
 | 
				
			||||||
    <script src="/webui/libs/single.js"></script>
 | 
					    <script src="/webui/libs/single.js"></script>
 | 
				
			||||||
 | 
				
			|||||||
@ -233,6 +233,30 @@ function fetchItemList() {
 | 
				
			|||||||
                        if (type == "Syndicates" && item.uniqueName.startsWith("RadioLegion")) {
 | 
					                        if (type == "Syndicates" && item.uniqueName.startsWith("RadioLegion")) {
 | 
				
			||||||
                            item.name += " (" + item.uniqueName + ")";
 | 
					                            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") {
 | 
					                        if (item.badReason != "notraw") {
 | 
				
			||||||
                            const option = document.createElement("option");
 | 
					                            const option = document.createElement("option");
 | 
				
			||||||
                            option.setAttribute("data-key", item.uniqueName);
 | 
					                            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 () {
 | 
					$("input[list]").on("input", function () {
 | 
				
			||||||
    $(this).removeClass("is-invalid");
 | 
					    $(this).removeClass("is-invalid");
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user