XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

SpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 1 Star 0
返回提交历史

XFEstudio/SpaceNinjaServer

feat(webui): MoaPets support (#1402)

Translations were taken from the game Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1402 Reviewed-by: Sainan <sainan@calamity.inc> Co-authored-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Co-committed-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>

d033c2bc
AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
提交于

代码差异

9 个文件 +201 -12
Modified src/controllers/custom/addModularEquipmentController.ts +62 -3
@@ -1,15 +1,26 @@
1 1 import { getAccountIdForRequest } from "@/src/services/loginService";
2 import { getInventory, addEquipment, occupySlot, productCategoryToInventoryBin } from "@/src/services/inventoryService";
2 import {
3 getInventory,
4 addEquipment,
5 occupySlot,
6 productCategoryToInventoryBin,
7 applyDefaultUpgrades
8 } from "@/src/services/inventoryService";
3 9 import { modularWeaponTypes } from "@/src/helpers/modularWeaponHelper";
10 import { getDefaultUpgrades } from "@/src/services/itemDataService";
11 import { IEquipmentDatabase } from "@/src/types/inventoryTypes/commonInventoryTypes";
4 12 import { ExportWeapons } from "warframe-public-export-plus";
5 13 import { RequestHandler } from "express";
6 14
7 15 export const addModularEquipmentController: RequestHandler = async (req, res) => {
16 const requiredFields = new Set();
8 17 const accountId = await getAccountIdForRequest(req);
9 18 const request = req.body as IAddModularEquipmentRequest;
10 19 const category = modularWeaponTypes[request.ItemType];
11 20 const inventoryBin = productCategoryToInventoryBin(category)!;
12 const inventory = await getInventory(accountId, `${category} ${inventoryBin}`);
21 requiredFields.add(category);
22 requiredFields.add(inventoryBin);
23
13 24 request.ModularParts.forEach(part => {
14 25 if (ExportWeapons[part].gunType) {
15 26 if (category == "LongGuns") {
@@ -25,9 +36,57 @@ export const addModularEquipmentController: RequestHandler = async (req, res) =>
25 36 GT_BEAM: "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryBeam"
26 37 }[ExportWeapons[part].gunType];
27 38 }
39 } else if (request.ItemType == "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetPowerSuit") {
40 if (part.includes("ZanukaPetPartHead")) {
41 request.ItemType = {
42 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadA":
43 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetAPowerSuit",
44 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadB":
45 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetBPowerSuit",
46 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadC":
47 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetCPowerSuit"
48 }[part]!;
49 }
28 50 }
29 51 });
30 addEquipment(inventory, category, request.ItemType, request.ModularParts);
52 const defaultUpgrades = getDefaultUpgrades(request.ModularParts);
53 if (defaultUpgrades) {
54 requiredFields.add("RawUpgrades");
55 }
56 const defaultWeaponsMap: Record<string, string[]> = {
57 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetAPowerSuit": [
58 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetMeleeWeaponIP"
59 ],
60 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetBPowerSuit": [
61 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetMeleeWeaponIS"
62 ],
63 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetCPowerSuit": [
64 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetMeleeWeaponPS"
65 ]
66 };
67 const defaultWeapons = defaultWeaponsMap[request.ItemType];
68 if (defaultWeapons) {
69 for (const defaultWeapon of defaultWeapons) {
70 const category = ExportWeapons[defaultWeapon].productCategory;
71 requiredFields.add(category);
72 requiredFields.add(productCategoryToInventoryBin(category));
73 }
74 }
75
76 const inventory = await getInventory(accountId, Array.from(requiredFields).join(" "));
77 if (defaultWeapons) {
78 for (const defaultWeapon of defaultWeapons) {
79 const category = ExportWeapons[defaultWeapon].productCategory;
80 addEquipment(inventory, category, defaultWeapon);
81 occupySlot(inventory, productCategoryToInventoryBin(category)!, true);
82 }
83 }
84
85 const defaultOverwrites: Partial<IEquipmentDatabase> = {
86 Configs: applyDefaultUpgrades(inventory, defaultUpgrades)
87 };
88
89 addEquipment(inventory, category, request.ItemType, request.ModularParts, undefined, defaultOverwrites);
31 90 occupySlot(inventory, inventoryBin, true);
32 91 await inventory.save();
33 92 res.end();
Modified src/helpers/modularWeaponHelper.ts +1 -0
@@ -13,6 +13,7 @@ export const modularWeaponTypes: Record<string, TEquipmentKey> = {
13 13 "/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon": "OperatorAmps",
14 14 "/Lotus/Types/Vehicles/Hoverboard/HoverboardSuit": "Hoverboards",
15 15 "/Lotus/Types/Friendly/Pets/MoaPets/MoaPetPowerSuit": "MoaPets",
16 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetPowerSuit": "MoaPets",
16 17 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetAPowerSuit": "MoaPets",
17 18 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetBPowerSuit": "MoaPets",
18 19 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetCPowerSuit": "MoaPets",
Modified static/webui/index.html +37 -0
@@ -294,6 +294,34 @@
294 294 </div>
295 295 </div>
296 296 </div>
297 <div class="col-lg-6">
298 <div class="card mb-3" style="height: 400px;">
299 <h5 class="card-header" data-loc="inventory_moaPets"></h5>
300 <div class="card-body overflow-auto">
301 <form class="input-group mb-3" onsubmit="handleModularSelection('MoaPets');return false;">
302 <input class="form-control" id="acquire-type-MoaPets" list="datalist-MoaPets" />
303 <button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
304 </form>
305 <form class="input-group mb-3" id="modular-MoaPets" style="display: none;">
306 <input class="form-control" id="acquire-type-MoaPets-MOA_ENGINE" list="datalist-ModularParts-MOA_ENGINE" />
307 <input class="form-control" id="acquire-type-MoaPets-MOA_PAYLOAD" list="datalist-ModularParts-MOA_PAYLOAD" />
308 <input class="form-control" id="acquire-type-MoaPets-MOA_HEAD" list="datalist-ModularParts-MOA_HEAD" />
309 <input class="form-control" id="acquire-type-MoaPets-MOA_LEG" list="datalist-ModularParts-MOA_LEG" />
310 </form>
311 <form class="input-group mb-3" id="modular-MoaPets-Zanuka" style="display: none;">
312 <input class="form-control" id="acquire-type-MoaPets-ZANUKA_HEAD" list="datalist-ModularParts-ZANUKA_HEAD" />
313 <input class="form-control" id="acquire-type-MoaPets-ZANUKA_BODY" list="datalist-ModularParts-ZANUKA_BODY" />
314 <input class="form-control" id="acquire-type-MoaPets-ZANUKA_LEG" list="datalist-ModularParts-ZANUKA_LEG" />
315 <input class="form-control" id="acquire-type-MoaPets-ZANUKA_TAIL" list="datalist-ModularParts-ZANUKA_TAIL" />
316 </form>
317 <table class="table table-hover w-100">
318 <tbody id="MoaPets-list"></tbody>
319 </table>
320 </div>
321 </div>
322 </div>
323 </div>
324 <div class="row g-3">
297 325 <div class="col-lg-6">
298 326 <div class="card mb-3" style="height: 400px;">
299 327 <h5 class="card-header" data-loc="inventory_sentinelWeapons"></h5>
@@ -637,6 +665,7 @@
637 665 <datalist id="datalist-Sentinels"></datalist>
638 666 <datalist id="datalist-MechSuits"></datalist>
639 667 <datalist id="datalist-Syndicates"></datalist>
668 <datalist id="datalist-MoaPets"></datalist>
640 669 <datalist id="datalist-miscitems"></datalist>
641 670 <datalist id="datalist-mods">
642 671 <option data-key="/Lotus/Upgrades/Mods/Fusers/LegendaryModFuser" value="Legendary Core"></option>
@@ -659,6 +688,14 @@
659 688 <datalist id="datalist-ModularParts-GUN_SECONDARY_HANDLE"></datalist>
660 689 <datalist id="datalist-ModularParts-GUN_BARREL"></datalist>
661 690 <datalist id="datalist-ModularParts-GUN_CLIP"></datalist>
691 <datalist id="datalist-ModularParts-MOA_ENGINE"></datalist>
692 <datalist id="datalist-ModularParts-MOA_PAYLOAD"></datalist>
693 <datalist id="datalist-ModularParts-MOA_HEAD"></datalist>
694 <datalist id="datalist-ModularParts-MOA_LEG"></datalist>
695 <datalist id="datalist-ModularParts-ZANUKA_BODY"></datalist>
696 <datalist id="datalist-ModularParts-ZANUKA_HEAD"></datalist>
697 <datalist id="datalist-ModularParts-ZANUKA_LEG"></datalist>
698 <datalist id="datalist-ModularParts-ZANUKA_TAIL"></datalist>
662 699 <script src="/webui/libs/jquery-3.6.0.min.js"></script>
663 700 <script src="/webui/libs/whirlpool-js.min.js"></script>
664 701 <script src="/webui/libs/single.js"></script>
Modified static/webui/script.js +71 -9
@@ -202,6 +202,15 @@ function fetchItemList() {
202 202 uniqueName: "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary",
203 203 name: loc("code_kitgun")
204 204 });
205 data.MoaPets ??= [];
206 data.MoaPets.push({
207 uniqueName: "/Lotus/Types/Friendly/Pets/MoaPets/MoaPetPowerSuit",
208 name: loc("code_moa")
209 });
210 data.MoaPets.push({
211 uniqueName: "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetPowerSuit",
212 name: loc("code_zanuka")
213 });
205 214
206 215 const itemMap = {
207 216 // Generics for rivens
@@ -220,7 +229,16 @@ function fetchItemList() {
220 229 "/Lotus/Weapons/Sentients/OperatorAmplifiers/SentTrainingAmplifier/OperatorTrainingAmpWeapon": {
221 230 name: loc("code_moteAmp")
222 231 },
223 "/Lotus/Types/Vehicles/Hoverboard/HoverboardSuit": { name: loc("code_kDrive") }
232 "/Lotus/Types/Vehicles/Hoverboard/HoverboardSuit": { name: loc("code_kDrive") },
233 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetAPowerSuit": {
234 name: loc("code_zanukaA")
235 },
236 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetBPowerSuit": {
237 name: loc("code_zanukaB")
238 },
239 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetCPowerSuit": {
240 name: loc("code_zanukaC")
241 }
224 242 };
225 243 for (const [type, items] of Object.entries(data)) {
226 244 if (type == "archonCrystalUpgrades") {
@@ -259,7 +277,15 @@ function fetchItemList() {
259 277 "LWPT_GUN_PRIMARY_HANDLE",
260 278 "LWPT_GUN_SECONDARY_HANDLE",
261 279 "LWPT_GUN_BARREL",
262 "LWPT_GUN_CLIP"
280 "LWPT_GUN_CLIP",
281 "LWPT_MOA_ENGINE",
282 "LWPT_MOA_PAYLOAD",
283 "LWPT_MOA_HEAD",
284 "LWPT_MOA_LEG",
285 "LWPT_ZANUKA_BODY",
286 "LWPT_ZANUKA_HEAD",
287 "LWPT_ZANUKA_LEG",
288 "LWPT_ZANUKA_TAIL"
263 289 ];
264 290 if (supportedModularParts.includes(item.partType)) {
265 291 const option = document.createElement("option");
@@ -269,6 +295,7 @@ function fetchItemList() {
269 295 .getElementById("datalist-" + type + "-" + item.partType.slice(5))
270 296 .appendChild(option);
271 297 } else {
298 console.log(item.partType);
272 299 const option = document.createElement("option");
273 300 option.setAttribute("data-key", item.uniqueName);
274 301 option.value = item.name;
@@ -308,7 +335,11 @@ function updateInventory() {
308 335 "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryShotgun",
309 336 "/Lotus/Weapons/Ostron/Melee/LotusModularWeapon",
310 337 "/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon",
311 "/Lotus/Types/Vehicles/Hoverboard/HoverboardSuit"
338 "/Lotus/Types/Vehicles/Hoverboard/HoverboardSuit",
339 "/Lotus/Types/Friendly/Pets/MoaPets/MoaPetPowerSuit",
340 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetAPowerSuit",
341 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetBPowerSuit",
342 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetCPowerSuit"
312 343 ];
313 344
314 345 // Populate inventory route
@@ -330,7 +361,8 @@ function updateInventory() {
330 361 "SentinelWeapons",
331 362 "Hoverboards",
332 363 "OperatorAmps",
333 "MechSuits"
364 "MechSuits",
365 "MoaPets"
334 366 ].forEach(category => {
335 367 document.getElementById(category + "-list").innerHTML = "";
336 368 data[category].forEach(item => {
@@ -709,6 +741,13 @@ function doAcquireModularEquipment(category, ItemType) {
709 741 case "Pistols":
710 742 requiredParts = ["GUN_BARREL", "GUN_SECONDARY_HANDLE", "GUN_CLIP"];
711 743 break;
744 case "MoaPets":
745 if (ItemType == "/Lotus/Types/Friendly/Pets/MoaPets/MoaPetPowerSuit") {
746 requiredParts = ["MOA_ENGINE", "MOA_PAYLOAD", "MOA_HEAD", "MOA_LEG"];
747 } else {
748 requiredParts = ["ZANUKA_BODY", "ZANUKA_HEAD", "ZANUKA_LEG", "ZANUKA_TAIL"];
749 }
750 break;
712 751 }
713 752 requiredParts.forEach(part => {
714 753 const partName = getKey(document.getElementById("acquire-type-" + category + "-" + part));
@@ -1375,7 +1414,9 @@ function handleModularSelection(category) {
1375 1414 "/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon",
1376 1415 "/Lotus/Weapons/Ostron/Melee/LotusModularWeapon",
1377 1416 "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimary",
1378 "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary"
1417 "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary",
1418 "/Lotus/Types/Friendly/Pets/MoaPets/MoaPetPowerSuit",
1419 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetPowerSuit"
1379 1420 ];
1380 1421 const itemType = getKey(document.getElementById("acquire-type-" + category));
1381 1422
@@ -1390,16 +1431,37 @@ function handleModularSelection(category) {
1390 1431 "/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon",
1391 1432 "/Lotus/Weapons/Ostron/Melee/LotusModularWeapon",
1392 1433 "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimary",
1393 "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary"
1434 "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary",
1435 "/Lotus/Types/Friendly/Pets/MoaPets/MoaPetPowerSuit",
1436 "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetPowerSuit"
1394 1437 ];
1395 const supportedModularInventoryCategory = ["OperatorAmps", "Melee", "LongGuns", "Pistols"];
1438 const supportedModularInventoryCategory = ["OperatorAmps", "Melee", "LongGuns", "Pistols", "MoaPets"];
1396 1439 supportedModularInventoryCategory.forEach(inventoryCategory => {
1397 1440 document.getElementById("acquire-type-" + inventoryCategory).addEventListener("input", function () {
1398 1441 const modularFields = document.getElementById("modular-" + inventoryCategory);
1399 if (modularWeapons.includes(getKey(this))) {
1400 modularFields.style.display = "";
1442 const modularFieldsZanuka =
1443 inventoryCategory === "MoaPets"
1444 ? document.getElementById("modular-" + inventoryCategory + "-Zanuka")
1445 : null;
1446 const key = getKey(this);
1447
1448 if (modularWeapons.includes(key)) {
1449 if (key === "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetPowerSuit" && modularFieldsZanuka) {
1450 modularFields.style.display = "none";
1451 modularFieldsZanuka.style.display = "";
1452 } else if (key === "/Lotus/Types/Friendly/Pets/MoaPets/MoaPetPowerSuit") {
1453 modularFields.style.display = "";
1454 if (modularFieldsZanuka) {
1455 modularFieldsZanuka.style.display = "none";
1456 }
1457 } else {
1458 modularFields.style.display = "";
1459 }
1401 1460 } else {
1402 1461 modularFields.style.display = "none";
1462 if (modularFieldsZanuka) {
1463 modularFieldsZanuka.style.display = "none";
1464 }
1403 1465 }
1404 1466 });
1405 1467 });
Modified static/webui/translations/de.js +6 -0
@@ -40,6 +40,11 @@ dict = {
40 40 code_addModsConfirm: `Bist du sicher, dass du |COUNT| Mods zu deinem Account hinzufügen möchtest?`,
41 41 code_succImport: `Erfolgreich importiert.`,
42 42 code_gild: `Veredeln`,
43 code_moa: `Moa`,
44 code_zanuka: `Jagdhund`,
45 code_zanukaA: `Jagdhund: Dorma`,
46 code_zanukaB: `Jagdhund: Bhaira`,
47 code_zanukaC: `Jagdhund: Hec`,
43 48 login_description: `Melde dich mit deinem OpenWF-Account an (denselben Angaben wie im Spiel, wenn du dich mit diesem Server verbindest).`,
44 49 login_emailLabel: `E-Mail-Adresse`,
45 50 login_passwordLabel: `Passwort`,
@@ -65,6 +70,7 @@ dict = {
65 70 inventory_sentinelWeapons: `Wächter-Waffen`,
66 71 inventory_operatorAmps: `Verstärker`,
67 72 inventory_hoverboards: `K-Drives`,
73 inventory_moaPets: `Moa`,
68 74 inventory_bulkAddSuits: `Fehlende Warframes hinzufügen`,
69 75 inventory_bulkAddWeapons: `Fehlende Waffen hinzufügen`,
70 76 inventory_bulkAddSpaceSuits: `Fehlende Archwings hinzufügen`,
Modified static/webui/translations/en.js +6 -0
@@ -39,6 +39,11 @@ dict = {
39 39 code_addModsConfirm: `Are you sure you want to add |COUNT| mods to your account?`,
40 40 code_succImport: `Successfully imported.`,
41 41 code_gild: `Gild`,
42 code_moa: `Moa`,
43 code_zanuka: `Hound`,
44 code_zanukaA: `Dorma Hound`,
45 code_zanukaB: `Bhaira Hound`,
46 code_zanukaC: `Hec Hound`,
42 47 login_description: `Login using your OpenWF account credentials (same as in-game when connecting to this server).`,
43 48 login_emailLabel: `Email address`,
44 49 login_passwordLabel: `Password`,
@@ -64,6 +69,7 @@ dict = {
64 69 inventory_sentinelWeapons: `Sentinel Weapons`,
65 70 inventory_operatorAmps: `Amps`,
66 71 inventory_hoverboards: `K-Drives`,
72 inventory_moaPets: `Moa`,
67 73 inventory_bulkAddSuits: `Add Missing Warframes`,
68 74 inventory_bulkAddWeapons: `Add Missing Weapons`,
69 75 inventory_bulkAddSpaceSuits: `Add Missing Archwings`,
Modified static/webui/translations/fr.js +6 -0
@@ -40,6 +40,11 @@ dict = {
40 40 code_addModsConfirm: `Ajouter |COUNT| mods à l'inventaire ?`,
41 41 code_succImport: `Importé.`,
42 42 code_gild: `[UNTRANSLATED] Gild`,
43 code_moa: `Moa`,
44 code_zanuka: `Molosse`,
45 code_zanukaA: `Molosse Dorma`,
46 code_zanukaB: `Molosse Bhaira`,
47 code_zanukaC: `Molosse Hec`,
43 48 login_description: `Connexion avec les informations de connexion OpenWF.`,
44 49 login_emailLabel: `Email`,
45 50 login_passwordLabel: `Mot de passe`,
@@ -65,6 +70,7 @@ dict = {
65 70 inventory_sentinelWeapons: `Armes de sentinelles`,
66 71 inventory_operatorAmps: `Amplificateurs`,
67 72 inventory_hoverboards: `K-Drives`,
73 inventory_moaPets: `Moa`,
68 74 inventory_bulkAddSuits: `Ajouter les Warframes manquantes`,
69 75 inventory_bulkAddWeapons: `Ajouter les armes manquantes`,
70 76 inventory_bulkAddSpaceSuits: `Ajouter les Archwings manquants`,
Modified static/webui/translations/ru.js +6 -0
@@ -40,6 +40,11 @@ dict = {
40 40 code_addModsConfirm: `Вы уверены, что хотите добавить |COUNT| модов на ваш аккаунт?`,
41 41 code_succImport: `Успешно импортировано.`,
42 42 code_gild: `Улучшить`,
43 code_moa: `МОА`,
44 code_zanuka: `Гончая`,
45 code_zanukaA: `Гончая: Дорма`,
46 code_zanukaB: `Гончая: Бхайра`,
47 code_zanukaC: `Гончая: Хек`,
43 48 login_description: `Войдите, используя учетные данные OpenWF (те же, что и в игре при подключении к этому серверу).`,
44 49 login_emailLabel: `Адрес электронной почты`,
45 50 login_passwordLabel: `Пароль`,
@@ -65,6 +70,7 @@ dict = {
65 70 inventory_sentinelWeapons: `Оружие стражей`,
66 71 inventory_operatorAmps: `Усилители`,
67 72 inventory_hoverboards: `К-Драйвы`,
73 inventory_moaPets: `МОА`,
68 74 inventory_bulkAddSuits: `Добавить отсутствующие варфреймы`,
69 75 inventory_bulkAddWeapons: `Добавить отсутствующее оружие`,
70 76 inventory_bulkAddSpaceSuits: `Добавить отсутствующие арчвинги`,
Modified static/webui/translations/zh.js +6 -0
@@ -40,6 +40,11 @@ dict = {
40 40 code_addModsConfirm: `确定要向账户添加 |COUNT| 张MOD吗?`,
41 41 code_succImport: `导入成功。`,
42 42 code_gild: `[UNTRANSLATED] Gild`,
43 code_moa: `恐鸟`,
44 code_zanuka: `猎犬`,
45 code_zanukaA: `铎玛猎犬`,
46 code_zanukaB: `拜拉猎犬`,
47 code_zanukaC: `骸克猎犬`,
43 48 login_description: `使用您的 OpenWF 账户凭证登录(与游戏内连接本服务器时使用的昵称相同)。`,
44 49 login_emailLabel: `电子邮箱`,
45 50 login_passwordLabel: `密码`,
@@ -65,6 +70,7 @@ dict = {
65 70 inventory_sentinelWeapons: `守护武器`,
66 71 inventory_operatorAmps: `增幅器`,
67 72 inventory_hoverboards: `K式悬浮板`,
73 inventory_moaPets: `恐鸟`,
68 74 inventory_bulkAddSuits: `添加缺失战甲`,
69 75 inventory_bulkAddWeapons: `添加缺失武器`,
70 76 inventory_bulkAddSpaceSuits: `添加缺失Archwing`,