diff --git a/src/controllers/custom/gildEquipmentController.ts b/src/controllers/custom/gildEquipmentController.ts
new file mode 100644
index 00000000..46716207
--- /dev/null
+++ b/src/controllers/custom/gildEquipmentController.ts
@@ -0,0 +1,23 @@
+import { getInventory } from "@/src/services/inventoryService";
+import { getAccountIdForRequest } from "@/src/services/loginService";
+import { EquipmentFeatures } from "@/src/types/inventoryTypes/commonInventoryTypes";
+import { TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes";
+import { RequestHandler } from "express";
+
+export const gildEquipmentController: RequestHandler = async (req, res) => {
+ const accountId = await getAccountIdForRequest(req);
+ const request = req.body as IGildEquipmentRequest;
+ const inventory = await getInventory(accountId, request.Category);
+ const weapon = inventory[request.Category].id(request.ItemId);
+ if (weapon) {
+ weapon.Features ??= 0;
+ weapon.Features |= EquipmentFeatures.GILDED;
+ await inventory.save();
+ }
+ res.end();
+};
+
+type IGildEquipmentRequest = {
+ ItemId: string;
+ Category: TEquipmentKey;
+};
diff --git a/src/routes/custom.ts b/src/routes/custom.ts
index 16359226..0834f90b 100644
--- a/src/routes/custom.ts
+++ b/src/routes/custom.ts
@@ -17,6 +17,7 @@ import { addCurrencyController } from "@/src/controllers/custom/addCurrencyContr
import { addItemsController } from "@/src/controllers/custom/addItemsController";
import { addModularEquipmentController } from "@/src/controllers/custom/addModularEquipmentController";
import { addXpController } from "@/src/controllers/custom/addXpController";
+import { gildEquipmentController } from "@/src/controllers/custom/gildEquipmentController";
import { importController } from "@/src/controllers/custom/importController";
import { getConfigDataController } from "@/src/controllers/custom/getConfigDataController";
@@ -42,6 +43,7 @@ customRouter.post("/addCurrency", addCurrencyController);
customRouter.post("/addItems", addItemsController);
customRouter.post("/addModularEquipment", addModularEquipmentController);
customRouter.post("/addXp", addXpController);
+customRouter.post("/gildEquipment", gildEquipmentController);
customRouter.post("/import", importController);
customRouter.post("/manageQuests", manageQuestsController);
diff --git a/static/webui/script.js b/static/webui/script.js
index 4e9119fc..f7abb431 100644
--- a/static/webui/script.js
+++ b/static/webui/script.js
@@ -287,6 +287,20 @@ function updateInventory() {
window.itemListPromise.then(itemMap => {
window.didInitialInventoryUpdate = true;
+ const modularWeapons = [
+ "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimary",
+ "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryBeam",
+ "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryLauncher",
+ "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryShotgun",
+ "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimarySniper",
+ "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary",
+ "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryBeam",
+ "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryShotgun",
+ "/Lotus/Weapons/Ostron/Melee/LotusModularWeapon",
+ "/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon",
+ "/Lotus/Types/Vehicles/Hoverboard/HoverboardSuit"
+ ];
+
// Populate inventory route
["RegularCredits", "PremiumCredits", "FusionPoints", "PrimeTokens"].forEach(currency => {
document.getElementById(currency + "-owned").textContent = loc("currency_owned")
@@ -373,6 +387,17 @@ function updateInventory() {
a.innerHTML = ``;
td.appendChild(a);
}
+ if (!(item.Features & 8) && modularWeapons.includes(item.ItemType)) {
+ const a = document.createElement("a");
+ a.href = "#";
+ a.onclick = function (event) {
+ event.preventDefault();
+ gildEquipment(category, item.ItemId.$oid);
+ };
+ a.title = loc("code_gild");
+ a.innerHTML = ``;
+ td.appendChild(a);
+ }
if (category == "Suits") {
const a = document.createElement("a");
a.href = "/webui/powersuit/" + item.ItemId.$oid;
@@ -899,6 +924,21 @@ function disposeOfItems(category, type, count) {
});
}
+function gildEquipment(category, oid) {
+ revalidateAuthz(() => {
+ $.post({
+ url: "/custom/gildEquipment?" + window.authz,
+ contentType: "application/json",
+ data: JSON.stringify({
+ ItemId: oid,
+ Category: category
+ })
+ }).done(function () {
+ updateInventory();
+ });
+ });
+}
+
function doAcquireMiscItems() {
const uniqueName = getKey(document.getElementById("miscitem-type"));
if (!uniqueName) {
diff --git a/static/webui/translations/de.js b/static/webui/translations/de.js
index 09040ddb..cac0623f 100644
--- a/static/webui/translations/de.js
+++ b/static/webui/translations/de.js
@@ -39,6 +39,7 @@ dict = {
code_focusUnlocked: `|COUNT| neue Fokus-Schulen freigeschaltet! Ein Inventar-Update wird benötigt, damit die Änderungen im Spiel sichtbar werden. Die Sternenkarte zu besuchen, sollte der einfachste Weg sein, dies auszulösen.`,
code_addModsConfirm: `Bist du sicher, dass du |COUNT| Mods zu deinem Account hinzufügen möchtest?`,
code_succImport: `Erfolgreich importiert.`,
+ code_gild: `[UNTRANSLATED] Gild`,
login_description: `Melde dich mit deinem OpenWF-Account an (denselben Angaben wie im Spiel, wenn du dich mit diesem Server verbindest).`,
login_emailLabel: `E-Mail-Adresse`,
login_passwordLabel: `Passwort`,
diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js
index 750468db..251c9ccc 100644
--- a/static/webui/translations/en.js
+++ b/static/webui/translations/en.js
@@ -38,6 +38,7 @@ dict = {
code_focusUnlocked: `Unlocked |COUNT| new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.`,
code_addModsConfirm: `Are you sure you want to add |COUNT| mods to your account?`,
code_succImport: `Successfully imported.`,
+ code_gild: `Gild`,
login_description: `Login using your OpenWF account credentials (same as in-game when connecting to this server).`,
login_emailLabel: `Email address`,
login_passwordLabel: `Password`,
diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js
index c1d8830d..b9bff424 100644
--- a/static/webui/translations/fr.js
+++ b/static/webui/translations/fr.js
@@ -39,6 +39,7 @@ dict = {
code_focusUnlocked: `|COUNT| écoles de Focus déverrouillées ! Synchronisation de l'inventaire nécessaire.`,
code_addModsConfirm: `Ajouter |COUNT| mods à l'inventaire ?`,
code_succImport: `Importé.`,
+ code_gild: `[UNTRANSLATED] Gild`,
login_description: `Connexion avec les informations de connexion OpenWF.`,
login_emailLabel: `Email`,
login_passwordLabel: `Mot de passe`,
diff --git a/static/webui/translations/ru.js b/static/webui/translations/ru.js
index 7fda4ed1..1efbc311 100644
--- a/static/webui/translations/ru.js
+++ b/static/webui/translations/ru.js
@@ -39,6 +39,7 @@ dict = {
code_focusUnlocked: `Разблокировано |COUNT| новых школ фокуса! Для отображения изменений в игре потребуется обновление инвентаря. Посещение навигации — самый простой способ этого добиться.`,
code_addModsConfirm: `Вы уверены, что хотите добавить |COUNT| модов на ваш аккаунт?`,
code_succImport: `Успешно импортировано.`,
+ code_gild: `Улучшить`,
login_description: `Войдите, используя учетные данные OpenWF (те же, что и в игре при подключении к этому серверу).`,
login_emailLabel: `Адрес электронной почты`,
login_passwordLabel: `Пароль`,
diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js
index de64de75..cf23e042 100644
--- a/static/webui/translations/zh.js
+++ b/static/webui/translations/zh.js
@@ -39,6 +39,7 @@ dict = {
code_focusUnlocked: `已解锁 |COUNT| 个新专精学派!需要游戏内仓库更新才能生效,您可以通过访问星图来触发仓库更新。`,
code_addModsConfirm: `确定要向账户添加 |COUNT| 张MOD吗?`,
code_succImport: `导入成功。`,
+ code_gild: `[UNTRANSLATED] Gild`,
login_description: `使用您的 OpenWF 账户凭证登录(与游戏内连接本服务器时使用的昵称相同)。`,
login_emailLabel: `电子邮箱`,
login_passwordLabel: `密码`,