Merge branch 'cheat-nemesis-henchmen-kills-multiplier' of https://onlyg.it/AlexisinGit/SpaceNinjaServerAlexFork into cheat-nemesis-henchmen-kills-multiplier
All checks were successful
Build / build (pull_request) Successful in 1m3s
All checks were successful
Build / build (pull_request) Successful in 1m3s
This commit is contained in:
commit
74127aece6
@ -1,16 +1,16 @@
|
||||
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||
import { getInventory } from "../../services/inventoryService.ts";
|
||||
import type { RequestHandler } from "express";
|
||||
import { hasAccessToDojo, getGuildForRequestEx, hasGuildPermission } from "../../services/guildService.ts";
|
||||
import { getGuildForRequestEx, hasGuildPermission } from "../../services/guildService.ts";
|
||||
import { GuildPermission } from "../../types/guildTypes.ts";
|
||||
import type { ITypeCount } from "../../types/commonTypes.ts";
|
||||
|
||||
export const addVaultDecoRecipeController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const requests = req.body as ITypeCount[];
|
||||
const inventory = await getInventory(accountId, "LevelKeys GuildId");
|
||||
const inventory = await getInventory(accountId, "GuildId");
|
||||
const guild = await getGuildForRequestEx(req, inventory);
|
||||
if (!hasAccessToDojo(inventory) || !(await hasGuildPermission(guild, accountId, GuildPermission.Architect))) {
|
||||
if (!(await hasGuildPermission(guild, accountId, GuildPermission.Architect))) {
|
||||
res.status(400).send("-1").end();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1,44 +1,19 @@
|
||||
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||
import { getInventory } from "../../services/inventoryService.ts";
|
||||
import type { RequestHandler } from "express";
|
||||
import { ExportBoosters } from "warframe-public-export-plus";
|
||||
import type { IBooster } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||
import { broadcastInventoryUpdate } from "../../services/wsService.ts";
|
||||
|
||||
const I32_MAX = 0x7fffffff;
|
||||
|
||||
export const setBoosterController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const requests = req.body as { ItemType: string; ExpiryDate: number }[];
|
||||
const requests = req.body as IBooster[];
|
||||
const inventory = await getInventory(accountId, "Boosters");
|
||||
const boosters = inventory.Boosters;
|
||||
if (
|
||||
requests.some(request => {
|
||||
if (typeof request.ItemType !== "string") return true;
|
||||
if (Object.entries(ExportBoosters).find(([_, item]) => item.typeName === request.ItemType) === undefined)
|
||||
return true;
|
||||
if (typeof request.ExpiryDate !== "number") return true;
|
||||
if (request.ExpiryDate < 0 || request.ExpiryDate > I32_MAX) return true;
|
||||
return false;
|
||||
})
|
||||
) {
|
||||
res.status(400).send("Invalid ItemType provided.");
|
||||
return;
|
||||
}
|
||||
const now = Math.trunc(Date.now() / 1000);
|
||||
for (const { ItemType, ExpiryDate } of requests) {
|
||||
if (ExpiryDate <= now) {
|
||||
// remove expired boosters
|
||||
const index = boosters.findIndex(item => item.ItemType === ItemType);
|
||||
if (index !== -1) {
|
||||
boosters.splice(index, 1);
|
||||
}
|
||||
for (const request of requests) {
|
||||
const index = inventory.Boosters.findIndex(item => item.ItemType === request.ItemType);
|
||||
if (index !== -1) {
|
||||
inventory.Boosters[index].ExpiryDate = request.ExpiryDate;
|
||||
} else {
|
||||
const boosterItem = boosters.find(item => item.ItemType === ItemType);
|
||||
if (boosterItem) {
|
||||
boosterItem.ExpiryDate = ExpiryDate;
|
||||
} else {
|
||||
boosters.push({ ItemType, ExpiryDate });
|
||||
}
|
||||
inventory.Boosters.push(request);
|
||||
}
|
||||
}
|
||||
await inventory.save();
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import { GuildMember } from "../../models/guildModel.ts";
|
||||
import { getGuildForRequestEx, hasAccessToDojo } from "../../services/guildService.ts";
|
||||
import { getGuildForRequestEx } from "../../services/guildService.ts";
|
||||
import { getInventory } from "../../services/inventoryService.ts";
|
||||
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||
import type { IGuildCheats } from "../../types/guildTypes.ts";
|
||||
@ -8,12 +8,12 @@ import type { RequestHandler } from "express";
|
||||
export const setGuildCheatController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const payload = req.body as ISetGuildCheatRequest;
|
||||
const inventory = await getInventory(accountId, `${payload.key} GuildId LevelKeys`);
|
||||
const inventory = await getInventory(accountId, `GuildId`);
|
||||
const guild = await getGuildForRequestEx(req, inventory);
|
||||
const member = await GuildMember.findOne({ accountId: accountId, guildId: guild._id });
|
||||
|
||||
if (member) {
|
||||
if (!hasAccessToDojo(inventory) || member.rank > 1) {
|
||||
if (member.rank > 1) {
|
||||
res.end();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2,7 +2,6 @@ import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||
import { getInventory } from "../../services/inventoryService.ts";
|
||||
import type { RequestHandler } from "express";
|
||||
import {
|
||||
hasAccessToDojo,
|
||||
getGuildForRequestEx,
|
||||
setGuildTechLogState,
|
||||
processFundedGuildTechProject,
|
||||
@ -19,9 +18,9 @@ import { GuildMember } from "../../models/guildModel.ts";
|
||||
export const addTechProjectController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const requests = req.body as ITechProjectRequest[];
|
||||
const inventory = await getInventory(accountId, "LevelKeys GuildId");
|
||||
const inventory = await getInventory(accountId, "GuildId");
|
||||
const guild = await getGuildForRequestEx(req, inventory);
|
||||
if (!hasAccessToDojo(inventory) || !(await hasGuildPermission(guild, accountId, GuildPermission.Tech))) {
|
||||
if (!(await hasGuildPermission(guild, accountId, GuildPermission.Tech))) {
|
||||
res.status(400).send("-1").end();
|
||||
return;
|
||||
}
|
||||
@ -54,9 +53,9 @@ export const addTechProjectController: RequestHandler = async (req, res) => {
|
||||
export const removeTechProjectController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const requests = req.body as ITechProjectRequest[];
|
||||
const inventory = await getInventory(accountId, "LevelKeys GuildId");
|
||||
const inventory = await getInventory(accountId, "GuildId");
|
||||
const guild = await getGuildForRequestEx(req, inventory);
|
||||
if (!hasAccessToDojo(inventory) || !(await hasGuildPermission(guild, accountId, GuildPermission.Tech))) {
|
||||
if (!(await hasGuildPermission(guild, accountId, GuildPermission.Tech))) {
|
||||
res.status(400).send("-1").end();
|
||||
return;
|
||||
}
|
||||
@ -74,13 +73,13 @@ export const removeTechProjectController: RequestHandler = async (req, res) => {
|
||||
export const fundTechProjectController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const requests = req.body as ITechProjectRequest[];
|
||||
const inventory = await getInventory(accountId, "LevelKeys GuildId");
|
||||
const inventory = await getInventory(accountId, "GuildId");
|
||||
const guild = await getGuildForRequestEx(req, inventory);
|
||||
const guildMember = (await GuildMember.findOne(
|
||||
{ accountId, guildId: guild._id },
|
||||
"RegularCreditsContributed MiscItemsContributed"
|
||||
))!;
|
||||
if (!hasAccessToDojo(inventory)) {
|
||||
if (!(await hasGuildPermission(guild, accountId, GuildPermission.Tech))) {
|
||||
res.status(400).send("-1").end();
|
||||
return;
|
||||
}
|
||||
@ -105,9 +104,9 @@ export const fundTechProjectController: RequestHandler = async (req, res) => {
|
||||
export const completeTechProjectsController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const requests = req.body as ITechProjectRequest[];
|
||||
const inventory = await getInventory(accountId, "LevelKeys GuildId");
|
||||
const inventory = await getInventory(accountId, "GuildId");
|
||||
const guild = await getGuildForRequestEx(req, inventory);
|
||||
if (!hasAccessToDojo(inventory)) {
|
||||
if (!(await hasGuildPermission(guild, accountId, GuildPermission.Tech))) {
|
||||
res.status(400).send("-1").end();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -476,9 +476,9 @@
|
||||
</div>
|
||||
<div class="col-lg-6">
|
||||
<div class="card" style="height: 400px;">
|
||||
<h5 class="card-header" data-loc="inventory_Boosters"></h5>
|
||||
<h5 class="card-header" data-loc="inventory_boosters"></h5>
|
||||
<div class="card-body d-flex flex-column">
|
||||
<form class="input-group mb-3" onsubmit="doAcquireBoosters();return false;">
|
||||
<form class="input-group mb-3" onsubmit="doAcquireBooster();return false;">
|
||||
<input class="form-control" id="acquire-type-Boosters" list="datalist-Boosters" />
|
||||
<button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
|
||||
</form>
|
||||
|
||||
@ -1007,6 +1007,67 @@ function updateInventory() {
|
||||
document.getElementById("EvolutionProgress-list").appendChild(tr);
|
||||
});
|
||||
|
||||
document.getElementById("Boosters-list").innerHTML = "";
|
||||
data.Boosters.forEach(item => {
|
||||
if (item.ExpiryDate < Math.floor(Date.now() / 1000)) {
|
||||
// Booster has expired, skip it
|
||||
return;
|
||||
}
|
||||
const tr = document.createElement("tr");
|
||||
{
|
||||
const td = document.createElement("td");
|
||||
td.textContent = itemMap[item.ItemType]?.name ?? item.ItemType;
|
||||
tr.appendChild(td);
|
||||
}
|
||||
{
|
||||
const td = document.createElement("td");
|
||||
td.classList = "text-end text-nowrap";
|
||||
{
|
||||
const form = document.createElement("form");
|
||||
form.style.display = "inline-block";
|
||||
form.onsubmit = function (event) {
|
||||
event.preventDefault();
|
||||
const maxDate = new Date(input.max);
|
||||
const selectedDate = new Date(input.value);
|
||||
if (selectedDate > maxDate) {
|
||||
input.value = maxDate.toISOString().slice(0, 16);
|
||||
}
|
||||
doChangeBoosterExpiry(item.ItemType, input);
|
||||
};
|
||||
|
||||
const input = document.createElement("input");
|
||||
input.type = "datetime-local";
|
||||
input.classList = "form-control form-control-sm";
|
||||
input.value = formatDatetime("%Y-%m-%d %H:%M:%s", item.ExpiryDate * 1000);
|
||||
input.max = "2038-01-19T03:14";
|
||||
input.onblur = function () {
|
||||
const maxDate = new Date(input.max);
|
||||
const selectedDate = new Date(input.value);
|
||||
if (selectedDate > maxDate) {
|
||||
input.value = maxDate.toISOString().slice(0, 16);
|
||||
}
|
||||
doChangeBoosterExpiry(item.ItemType, input);
|
||||
};
|
||||
|
||||
form.appendChild(input);
|
||||
td.appendChild(form);
|
||||
}
|
||||
{
|
||||
const a = document.createElement("a");
|
||||
a.href = "#";
|
||||
a.onclick = function (event) {
|
||||
event.preventDefault();
|
||||
setBooster(item.ItemType, 0);
|
||||
};
|
||||
a.title = loc("code_remove");
|
||||
a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg>`;
|
||||
td.appendChild(a);
|
||||
}
|
||||
tr.appendChild(td);
|
||||
}
|
||||
document.getElementById("Boosters-list").appendChild(tr);
|
||||
});
|
||||
|
||||
document.getElementById("FlavourItems-list").innerHTML = "";
|
||||
data.FlavourItems.forEach(item => {
|
||||
const datalist = document.getElementById("datalist-FlavourItems");
|
||||
@ -1619,63 +1680,6 @@ function updateInventory() {
|
||||
}
|
||||
document.getElementById("changeSyndicate").value = data.SupportedSyndicate ?? "";
|
||||
|
||||
document.getElementById("Boosters-list").innerHTML = "";
|
||||
const now = Math.floor(Date.now() / 1000);
|
||||
data.Boosters.forEach(({ ItemType, ExpiryDate }) => {
|
||||
if (ExpiryDate < now) {
|
||||
// Booster has expired, skip it
|
||||
return;
|
||||
}
|
||||
const tr = document.createElement("tr");
|
||||
{
|
||||
const td = document.createElement("td");
|
||||
td.textContent = itemMap[ItemType]?.name ?? ItemType;
|
||||
tr.appendChild(td);
|
||||
}
|
||||
{
|
||||
const td = document.createElement("td");
|
||||
td.classList = "text-end text-nowrap";
|
||||
const timeString = formatDatetime("%Y-%m-%d %H:%M:%s", ExpiryDate * 1000);
|
||||
const inlineForm = document.createElement("form");
|
||||
const input = document.createElement("input");
|
||||
|
||||
inlineForm.style.display = "inline-block";
|
||||
inlineForm.onsubmit = function (event) {
|
||||
event.preventDefault();
|
||||
doChangeBoosterExpiry(ItemType, input);
|
||||
};
|
||||
input.type = "datetime-local";
|
||||
input.classList.add("form-control");
|
||||
input.classList.add("form-control-sm");
|
||||
input.value = timeString;
|
||||
let changed = false;
|
||||
input.onchange = function () {
|
||||
changed = true;
|
||||
};
|
||||
input.onblur = function () {
|
||||
if (changed) {
|
||||
doChangeBoosterExpiry(ItemType, input);
|
||||
}
|
||||
};
|
||||
inlineForm.appendChild(input);
|
||||
|
||||
td.appendChild(inlineForm);
|
||||
|
||||
const removeButton = document.createElement("a");
|
||||
removeButton.title = loc("code_remove");
|
||||
removeButton.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg>`;
|
||||
removeButton.href = "#";
|
||||
removeButton.onclick = function (event) {
|
||||
event.preventDefault();
|
||||
setBooster(ItemType, 0);
|
||||
};
|
||||
td.appendChild(removeButton);
|
||||
|
||||
tr.appendChild(td);
|
||||
}
|
||||
document.getElementById("Boosters-list").appendChild(tr);
|
||||
});
|
||||
|
||||
if (single.getCurrentPath().startsWith("/webui/guildView")) {
|
||||
const guildReq = $.get("/custom/getGuild?guildId=" + window.guildId);
|
||||
guildReq.done(guildData => {
|
||||
@ -1996,32 +2000,6 @@ function updateInventory() {
|
||||
});
|
||||
}
|
||||
|
||||
function addVaultDecoRecipe() {
|
||||
const uniqueName = getKey(document.getElementById("acquire-type-VaultDecoRecipes"));
|
||||
if (!guildId) {
|
||||
return;
|
||||
}
|
||||
if (!uniqueName) {
|
||||
$("acquire-type-VaultDecoRecipes").addClass("is-invalid").focus();
|
||||
return;
|
||||
}
|
||||
revalidateAuthz().then(() => {
|
||||
const req = $.post({
|
||||
url: "/custom/addVaultDecoRecipe?" + window.authz + "&guildId=" + window.guildId,
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify([
|
||||
{
|
||||
ItemType: uniqueName,
|
||||
ItemCount: 1
|
||||
}
|
||||
])
|
||||
});
|
||||
req.done(() => {
|
||||
updateInventory();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function changeGuildRank(guildId, targetId, rankChange) {
|
||||
revalidateAuthz().then(() => {
|
||||
const req = $.get(
|
||||
@ -3572,7 +3550,7 @@ function handleModularSelection(category) {
|
||||
});
|
||||
}
|
||||
|
||||
function setBooster(ItemType, ExpiryDate, callback) {
|
||||
function setBooster(ItemType, ExpiryDate) {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/custom/setBooster?" + window.authz,
|
||||
@ -3585,33 +3563,27 @@ function setBooster(ItemType, ExpiryDate, callback) {
|
||||
])
|
||||
}).done(function () {
|
||||
updateInventory();
|
||||
if (callback) callback();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function doAcquireBoosters() {
|
||||
function doAcquireBooster() {
|
||||
const uniqueName = getKey(document.getElementById("acquire-type-Boosters"));
|
||||
if (!uniqueName) {
|
||||
$("#acquire-type-Boosters").addClass("is-invalid").focus();
|
||||
return;
|
||||
}
|
||||
const ExpiryDate = Date.now() / 1000 + 3 * 24 * 60 * 60; // default 3 days
|
||||
setBooster(uniqueName, ExpiryDate, () => {
|
||||
$("#acquire-type-Boosters").val("");
|
||||
});
|
||||
setBooster(uniqueName, Math.floor(Date.now() / 1000 + 3 * 24 * 60 * 60));
|
||||
document.getElementById("acquire-type-Boosters").value = "";
|
||||
}
|
||||
|
||||
function doChangeBoosterExpiry(ItemType, ExpiryDateInput) {
|
||||
console.log("Changing booster expiry for", ItemType, "to", ExpiryDateInput.value);
|
||||
// cast local datetime string to unix timestamp
|
||||
const ExpiryDate = Math.trunc(new Date(ExpiryDateInput.value).getTime() / 1000);
|
||||
const ExpiryDate = Math.floor(new Date(ExpiryDateInput.value).getTime() / 1000);
|
||||
if (isNaN(ExpiryDate)) {
|
||||
ExpiryDateInput.addClass("is-invalid").focus();
|
||||
return false;
|
||||
return;
|
||||
}
|
||||
setBooster(ItemType, ExpiryDate);
|
||||
return true;
|
||||
}
|
||||
|
||||
function formatDatetime(fmt, date) {
|
||||
|
||||
@ -109,7 +109,7 @@ dict = {
|
||||
inventory_moaPets: `Moas`,
|
||||
inventory_kubrowPets: `Bestien`,
|
||||
inventory_evolutionProgress: `Incarnon-Entwicklungsfortschritte`,
|
||||
inventory_Boosters: `Booster`,
|
||||
inventory_boosters: `Booster`,
|
||||
inventory_flavourItems: `<abbr title="Animationssets, Glyphen, Farbpaletten usw.">Sammlerstücke</abbr>`,
|
||||
inventory_shipDecorations: `Schiffsdekorationen`,
|
||||
inventory_bulkAddSuits: `Fehlende Warframes hinzufügen`,
|
||||
|
||||
@ -108,7 +108,7 @@ dict = {
|
||||
inventory_moaPets: `Moas`,
|
||||
inventory_kubrowPets: `Beasts`,
|
||||
inventory_evolutionProgress: `Incarnon Evolution Progress`,
|
||||
inventory_Boosters: `Boosters`,
|
||||
inventory_boosters: `Boosters`,
|
||||
inventory_flavourItems: `<abbr title="Animation Sets, Glyphs, Palettes, etc.">Flavour Items</abbr>`,
|
||||
inventory_shipDecorations: `Ship Decorations`,
|
||||
inventory_bulkAddSuits: `Add Missing Warframes`,
|
||||
|
||||
@ -109,7 +109,7 @@ dict = {
|
||||
inventory_moaPets: `Moas`,
|
||||
inventory_kubrowPets: `Bestias`,
|
||||
inventory_evolutionProgress: `Progreso de evolución Incarnon`,
|
||||
inventory_Boosters: `Potenciadores`,
|
||||
inventory_boosters: `Potenciadores`,
|
||||
inventory_flavourItems: `<abbr title="Conjuntos de animaciones, glifos, paletas, etc.">Ítems estéticos</abbr>`,
|
||||
inventory_shipDecorations: `Decoraciones de nave`,
|
||||
inventory_bulkAddSuits: `Agregar Warframes faltantes`,
|
||||
|
||||
@ -109,7 +109,7 @@ dict = {
|
||||
inventory_moaPets: `Moas`,
|
||||
inventory_kubrowPets: `Bêtes`,
|
||||
inventory_evolutionProgress: `Progrès de l'évolution Incarnon`,
|
||||
inventory_Boosters: `Boosters`,
|
||||
inventory_boosters: `Boosters`,
|
||||
inventory_flavourItems: `[UNTRANSLATED] <abbr title="Animation Sets, Glyphs, Palettes, etc.">Flavour Items</abbr>`,
|
||||
inventory_shipDecorations: `Décorations du vaisseau`,
|
||||
inventory_bulkAddSuits: `Ajouter les Warframes manquantes`,
|
||||
|
||||
@ -109,7 +109,7 @@ dict = {
|
||||
inventory_moaPets: `МОА`,
|
||||
inventory_kubrowPets: `Звери`,
|
||||
inventory_evolutionProgress: `Прогресс эволюции Инкарнонов`,
|
||||
inventory_Boosters: `Бустеры`,
|
||||
inventory_boosters: `Бустеры`,
|
||||
inventory_flavourItems: `<abbr title="Наборы анимаций, глифы, палитры и т. д.">Уникальные предметы</abbr>`,
|
||||
inventory_shipDecorations: `Украшения корабля`,
|
||||
inventory_bulkAddSuits: `Добавить отсутствующие Варфреймы`,
|
||||
|
||||
@ -109,7 +109,7 @@ dict = {
|
||||
inventory_moaPets: `МОА`,
|
||||
inventory_kubrowPets: `Тварини`,
|
||||
inventory_evolutionProgress: `Прогрес еволюції Інкарнонів`,
|
||||
inventory_Boosters: `Посилення`,
|
||||
inventory_boosters: `Посилення`,
|
||||
inventory_flavourItems: `<abbr title="Набори анімацій, гліфи, палітри і т. д.">Унікальні предмети</abbr>`,
|
||||
inventory_shipDecorations: `Прикраси судна`,
|
||||
inventory_bulkAddSuits: `Додати відсутні Ворфрейми`,
|
||||
|
||||
@ -109,7 +109,7 @@ dict = {
|
||||
inventory_moaPets: `恐鸟`,
|
||||
inventory_kubrowPets: `动物同伴`,
|
||||
inventory_evolutionProgress: `灵化之源进度`,
|
||||
inventory_Boosters: `加成器`,
|
||||
inventory_boosters: `加成器`,
|
||||
inventory_flavourItems: `<abbr title="动作表情、浮印、调色板等">装饰物品</abbr>`,
|
||||
inventory_shipDecorations: `飞船装饰`,
|
||||
inventory_bulkAddSuits: `添加缺失战甲`,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user