forked from OpenWF/SpaceNinjaServer
		
	feat(webui): Vault MiscItems and ShipDecorations (#2889)
Closes #2874 Closes #2875 Reviewed-on: OpenWF/SpaceNinjaServer#2889 Reviewed-by: Sainan <63328889+sainan@users.noreply.github.com> 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
							
								
									9e66d22256
								
							
						
					
					
						commit
						c1c14b2068
					
				@ -1,36 +0,0 @@
 | 
				
			|||||||
import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
					 | 
				
			||||||
import { getInventory } from "../../services/inventoryService.ts";
 | 
					 | 
				
			||||||
import type { RequestHandler } from "express";
 | 
					 | 
				
			||||||
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, "GuildId");
 | 
					 | 
				
			||||||
    const guild = await getGuildForRequestEx(req, inventory);
 | 
					 | 
				
			||||||
    if (!(await hasGuildPermission(guild, accountId, GuildPermission.Architect))) {
 | 
					 | 
				
			||||||
        res.status(400).send("-1").end();
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    guild.VaultDecoRecipes ??= [];
 | 
					 | 
				
			||||||
    for (const request of requests) {
 | 
					 | 
				
			||||||
        const index = guild.VaultDecoRecipes.findIndex(x => x.ItemType === request.ItemType);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (index == -1) {
 | 
					 | 
				
			||||||
            guild.VaultDecoRecipes.push({
 | 
					 | 
				
			||||||
                ItemType: request.ItemType,
 | 
					 | 
				
			||||||
                ItemCount: request.ItemCount
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            guild.VaultDecoRecipes[index].ItemCount += request.ItemCount;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (guild.VaultDecoRecipes[index].ItemCount < 1) {
 | 
					 | 
				
			||||||
                guild.VaultDecoRecipes.splice(index, 1);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    await guild.save();
 | 
					 | 
				
			||||||
    res.end();
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
							
								
								
									
										43
									
								
								src/controllers/custom/addVaultTypeCountController.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/controllers/custom/addVaultTypeCountController.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,43 @@
 | 
				
			|||||||
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					import { getGuildForRequestEx, hasGuildPermission } from "../../services/guildService.ts";
 | 
				
			||||||
 | 
					import { GuildPermission } from "../../types/guildTypes.ts";
 | 
				
			||||||
 | 
					import type { ITypeCount } from "../../types/commonTypes.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const addVaultTypeCountController: RequestHandler = async (req, res) => {
 | 
				
			||||||
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
					    const { vaultType, items } = req.body as {
 | 
				
			||||||
 | 
					        vaultType: keyof typeof vaultConfig;
 | 
				
			||||||
 | 
					        items: ITypeCount[];
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    const inventory = await getInventory(accountId, "GuildId");
 | 
				
			||||||
 | 
					    const guild = await getGuildForRequestEx(req, inventory);
 | 
				
			||||||
 | 
					    if (!(await hasGuildPermission(guild, accountId, vaultConfig[vaultType]))) {
 | 
				
			||||||
 | 
					        res.status(400).send("-1").end();
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    guild[vaultType] ??= [];
 | 
				
			||||||
 | 
					    for (const item of items) {
 | 
				
			||||||
 | 
					        const index = guild[vaultType].findIndex(x => x.ItemType === item.ItemType);
 | 
				
			||||||
 | 
					        if (index === -1) {
 | 
				
			||||||
 | 
					            guild[vaultType].push({
 | 
				
			||||||
 | 
					                ItemType: item.ItemType,
 | 
				
			||||||
 | 
					                ItemCount: item.ItemCount
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            guild[vaultType][index].ItemCount += item.ItemCount;
 | 
				
			||||||
 | 
					            if (guild[vaultType][index].ItemCount < 1) {
 | 
				
			||||||
 | 
					                guild[vaultType].splice(index, 1);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await guild.save();
 | 
				
			||||||
 | 
					    res.end();
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					const vaultConfig = {
 | 
				
			||||||
 | 
					    VaultShipDecorations: GuildPermission.Treasurer,
 | 
				
			||||||
 | 
					    VaultMiscItems: GuildPermission.Treasurer,
 | 
				
			||||||
 | 
					    VaultDecoRecipes: GuildPermission.Architect
 | 
				
			||||||
 | 
					} as const;
 | 
				
			||||||
@ -38,6 +38,7 @@ interface ListedItem {
 | 
				
			|||||||
    parazon?: boolean;
 | 
					    parazon?: boolean;
 | 
				
			||||||
    alwaysAvailable?: boolean;
 | 
					    alwaysAvailable?: boolean;
 | 
				
			||||||
    maxLevelCap?: number;
 | 
					    maxLevelCap?: number;
 | 
				
			||||||
 | 
					    eligibleForVault?: boolean;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface ItemLists {
 | 
					interface ItemLists {
 | 
				
			||||||
@ -141,6 +142,12 @@ const getItemListsController: RequestHandler = (req, response) => {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        ]*/
 | 
					        ]*/
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    const eligibleForVault = new Set<string>([
 | 
				
			||||||
 | 
					        ...Object.values(ExportDojoRecipes.research).flatMap(r => r.ingredients.map(i => i.ItemType)),
 | 
				
			||||||
 | 
					        ...Object.values(ExportDojoRecipes.fabrications).flatMap(f => f.ingredients.map(i => i.ItemType)),
 | 
				
			||||||
 | 
					        ...Object.values(ExportDojoRecipes.rooms).flatMap(r => r.ingredients.map(i => i.ItemType)),
 | 
				
			||||||
 | 
					        ...Object.values(ExportDojoRecipes.decos).flatMap(d => d.ingredients.map(i => i.ItemType))
 | 
				
			||||||
 | 
					    ]);
 | 
				
			||||||
    for (const [uniqueName, item] of Object.entries(ExportWarframes)) {
 | 
					    for (const [uniqueName, item] of Object.entries(ExportWarframes)) {
 | 
				
			||||||
        res[item.productCategory].push({
 | 
					        res[item.productCategory].push({
 | 
				
			||||||
            uniqueName,
 | 
					            uniqueName,
 | 
				
			||||||
@ -246,7 +253,8 @@ const getItemListsController: RequestHandler = (req, response) => {
 | 
				
			|||||||
            res.miscitems.push({
 | 
					            res.miscitems.push({
 | 
				
			||||||
                uniqueName: uniqueName,
 | 
					                uniqueName: uniqueName,
 | 
				
			||||||
                name: name,
 | 
					                name: name,
 | 
				
			||||||
                subtype: "Resource"
 | 
					                subtype: "Resource",
 | 
				
			||||||
 | 
					                ...(eligibleForVault.has(uniqueName) && { eligibleForVault: true })
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -34,7 +34,7 @@ import {
 | 
				
			|||||||
    fundTechProjectController,
 | 
					    fundTechProjectController,
 | 
				
			||||||
    removeTechProjectController
 | 
					    removeTechProjectController
 | 
				
			||||||
} from "../controllers/custom/techProjectController.ts";
 | 
					} from "../controllers/custom/techProjectController.ts";
 | 
				
			||||||
import { addVaultDecoRecipeController } from "../controllers/custom/addVaultDecoRecipeController.ts";
 | 
					import { addVaultTypeCountController } from "../controllers/custom/addVaultTypeCountController.ts";
 | 
				
			||||||
import { addXpController } from "../controllers/custom/addXpController.ts";
 | 
					import { addXpController } from "../controllers/custom/addXpController.ts";
 | 
				
			||||||
import { importController } from "../controllers/custom/importController.ts";
 | 
					import { importController } from "../controllers/custom/importController.ts";
 | 
				
			||||||
import { manageQuestsController } from "../controllers/custom/manageQuestsController.ts";
 | 
					import { manageQuestsController } from "../controllers/custom/manageQuestsController.ts";
 | 
				
			||||||
@ -81,7 +81,7 @@ customRouter.post("/addCurrency", addCurrencyController);
 | 
				
			|||||||
customRouter.post("/addItems", addItemsController);
 | 
					customRouter.post("/addItems", addItemsController);
 | 
				
			||||||
customRouter.post("/addTechProject", addTechProjectController);
 | 
					customRouter.post("/addTechProject", addTechProjectController);
 | 
				
			||||||
customRouter.post("/removeTechProject", removeTechProjectController);
 | 
					customRouter.post("/removeTechProject", removeTechProjectController);
 | 
				
			||||||
customRouter.post("/addVaultDecoRecipe", addVaultDecoRecipeController);
 | 
					customRouter.post("/addVaultTypeCount", addVaultTypeCountController);
 | 
				
			||||||
customRouter.post("/fundTechProject", fundTechProjectController);
 | 
					customRouter.post("/fundTechProject", fundTechProjectController);
 | 
				
			||||||
customRouter.post("/completeTechProject", completeTechProjectsController);
 | 
					customRouter.post("/completeTechProject", completeTechProjectsController);
 | 
				
			||||||
customRouter.post("/addXp", addXpController);
 | 
					customRouter.post("/addXp", addXpController);
 | 
				
			||||||
 | 
				
			|||||||
@ -624,7 +624,7 @@
 | 
				
			|||||||
                        <div class="card" style="height: 400px;">
 | 
					                        <div class="card" style="height: 400px;">
 | 
				
			||||||
                            <h5 class="card-header" data-loc="guildView_vaultDecoRecipes"></h5>
 | 
					                            <h5 class="card-header" data-loc="guildView_vaultDecoRecipes"></h5>
 | 
				
			||||||
                            <div class="card-body d-flex flex-column">
 | 
					                            <div class="card-body d-flex flex-column">
 | 
				
			||||||
                                <form id="vaultDecoRecipes-form" class="input-group mb-3 d-none" onsubmit="addVaultDecoRecipe();return false;">
 | 
					                                <form id="vaultDecoRecipes-form" class="input-group mb-3 d-none" onsubmit="addVaultItem('VaultDecoRecipes');return false;">
 | 
				
			||||||
                                    <input class="form-control" id="acquire-type-VaultDecoRecipes" list="datalist-VaultDecoRecipes" />
 | 
					                                    <input class="form-control" id="acquire-type-VaultDecoRecipes" list="datalist-VaultDecoRecipes" />
 | 
				
			||||||
                                    <button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
 | 
					                                    <button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
 | 
				
			||||||
                                </form>
 | 
					                                </form>
 | 
				
			||||||
@ -637,6 +637,42 @@
 | 
				
			|||||||
                        </div>
 | 
					                        </div>
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
 | 
					                <div class="row g-3 mb-3">
 | 
				
			||||||
 | 
					                    <div class="col-lg-6">
 | 
				
			||||||
 | 
					                        <div class="card" style="height: 400px;">
 | 
				
			||||||
 | 
					                            <h5 class="card-header" data-loc="guildView_vaultMiscItems"></h5>
 | 
				
			||||||
 | 
					                            <div class="card-body d-flex flex-column">
 | 
				
			||||||
 | 
					                                <form id="vaultMiscItems-form" class="input-group mb-3 d-none" onsubmit="addVaultItem('VaultMiscItems');return false;">
 | 
				
			||||||
 | 
					                                    <input class="form-control" id="VaultMiscItems-count" type="number" value="1" />
 | 
				
			||||||
 | 
					                                    <input class="form-control w-50" id="acquire-type-VaultMiscItems" list="datalist-VaultMiscItems" />
 | 
				
			||||||
 | 
					                                    <button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
 | 
				
			||||||
 | 
					                                </form>
 | 
				
			||||||
 | 
					                                <div class="overflow-auto">
 | 
				
			||||||
 | 
					                                    <table class="table table-hover w-100">
 | 
				
			||||||
 | 
					                                        <tbody id="VaultMiscItems-list"></tbody>
 | 
				
			||||||
 | 
					                                    </table>
 | 
				
			||||||
 | 
					                                </div>
 | 
				
			||||||
 | 
					                            </div>
 | 
				
			||||||
 | 
					                        </div>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                    <div class="col-lg-6">
 | 
				
			||||||
 | 
					                        <div class="card" style="height: 400px;">
 | 
				
			||||||
 | 
					                            <h5 class="card-header" data-loc="guildView_vaultShipDecorations"></h5>
 | 
				
			||||||
 | 
					                            <div class="card-body d-flex flex-column">
 | 
				
			||||||
 | 
					                                <form id="vaultShipDecorations-form" class="input-group mb-3 d-none" onsubmit="addVaultItem('VaultShipDecorations');return false;">
 | 
				
			||||||
 | 
					                                    <input class="form-control" id="VaultShipDecorations-count" type="number" value="1" />
 | 
				
			||||||
 | 
					                                    <input class="form-control w-50" id="acquire-type-VaultShipDecorations" list="datalist-ShipDecorations" />
 | 
				
			||||||
 | 
					                                    <button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
 | 
				
			||||||
 | 
					                                </form>
 | 
				
			||||||
 | 
					                                <div class="overflow-auto">
 | 
				
			||||||
 | 
					                                    <table class="table table-hover w-100">
 | 
				
			||||||
 | 
					                                        <tbody id="VaultShipDecorations-list"></tbody>
 | 
				
			||||||
 | 
					                                    </table>
 | 
				
			||||||
 | 
					                                </div>
 | 
				
			||||||
 | 
					                            </div>
 | 
				
			||||||
 | 
					                        </div>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
                <div class="row g-3 mb-3">
 | 
					                <div class="row g-3 mb-3">
 | 
				
			||||||
                    <div class="col-lg-6">
 | 
					                    <div class="col-lg-6">
 | 
				
			||||||
                        <div class="card" style="height: 400px;">
 | 
					                        <div class="card" style="height: 400px;">
 | 
				
			||||||
@ -666,7 +702,8 @@
 | 
				
			|||||||
                            <div class="card-body" id="guild-actions">
 | 
					                            <div class="card-body" id="guild-actions">
 | 
				
			||||||
                                <div class="mb-2 d-flex flex-wrap gap-2">
 | 
					                                <div class="mb-2 d-flex flex-wrap gap-2">
 | 
				
			||||||
                                    <button class="btn btn-primary" onclick="debounce(addMissingTechProjects);" data-loc="guildView_bulkAddTechProjects"></button>
 | 
					                                    <button class="btn btn-primary" onclick="debounce(addMissingTechProjects);" data-loc="guildView_bulkAddTechProjects"></button>
 | 
				
			||||||
                                    <button class="btn btn-primary" onclick="debounce(addMissingVaultDecoRecipes);" data-loc="guildView_bulkAddVaultDecoRecipes"></button>
 | 
					                                    <button class="btn btn-primary" onclick="debounce(addMissingVaultItems, ['VaultDecoRecipes']);" data-loc="guildView_bulkAddVaultDecoRecipes"></button>
 | 
				
			||||||
 | 
					                                    <button class="btn btn-primary" onclick="debounce(addMissingVaultItems, ['VaultShipDecorations']);" data-loc="guildView_bulkAddVaultShipDecorations"></button>
 | 
				
			||||||
                                </div>
 | 
					                                </div>
 | 
				
			||||||
                                <div class="mb-2 d-flex flex-wrap gap-2">
 | 
					                                <div class="mb-2 d-flex flex-wrap gap-2">
 | 
				
			||||||
                                    <button class="btn btn-success" onclick="debounce(fundAllTechProjects);" data-loc="guildView_bulkFundTechProjects"></button>
 | 
					                                    <button class="btn btn-success" onclick="debounce(fundAllTechProjects);" data-loc="guildView_bulkFundTechProjects"></button>
 | 
				
			||||||
@ -1552,6 +1589,7 @@
 | 
				
			|||||||
    <datalist id="datalist-FlavourItems"></datalist>
 | 
					    <datalist id="datalist-FlavourItems"></datalist>
 | 
				
			||||||
    <datalist id="datalist-ShipDecorations"></datalist>
 | 
					    <datalist id="datalist-ShipDecorations"></datalist>
 | 
				
			||||||
    <datalist id="datalist-WeaponSkins"></datalist>
 | 
					    <datalist id="datalist-WeaponSkins"></datalist>
 | 
				
			||||||
 | 
					    <datalist id="datalist-VaultMiscItems"></datalist>
 | 
				
			||||||
    <datalist id="datalist-circuitGameModes">
 | 
					    <datalist id="datalist-circuitGameModes">
 | 
				
			||||||
        <option>Survival</option>
 | 
					        <option>Survival</option>
 | 
				
			||||||
        <option>VoidFlood</option>
 | 
					        <option>VoidFlood</option>
 | 
				
			||||||
 | 
				
			|||||||
@ -711,6 +711,10 @@ function fetchItemList() {
 | 
				
			|||||||
                                    option.value += " (" + item.subtype + ")";
 | 
					                                    option.value += " (" + item.subtype + ")";
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                                document.getElementById("datalist-" + type).appendChild(option);
 | 
					                                document.getElementById("datalist-" + type).appendChild(option);
 | 
				
			||||||
 | 
					                                if (item.eligibleForVault) {
 | 
				
			||||||
 | 
					                                    const vaultOption = option.cloneNode(true);
 | 
				
			||||||
 | 
					                                    document.getElementById("datalist-VaultMiscItems").appendChild(vaultOption);
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
                            } else {
 | 
					                            } else {
 | 
				
			||||||
                                //console.log(`Not adding ${item.uniqueName} to datalist for ${type} due to duplicate display name: ${item.name}`);
 | 
					                                //console.log(`Not adding ${item.uniqueName} to datalist for ${type} due to duplicate display name: ${item.name}`);
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
@ -1802,6 +1806,8 @@ function updateInventory() {
 | 
				
			|||||||
                                document.getElementById("VaultRegularCredits-owned").classList.remove("mb-0");
 | 
					                                document.getElementById("VaultRegularCredits-owned").classList.remove("mb-0");
 | 
				
			||||||
                                document.getElementById("vaultPremiumCredits-form").classList.remove("d-none");
 | 
					                                document.getElementById("vaultPremiumCredits-form").classList.remove("d-none");
 | 
				
			||||||
                                document.getElementById("VaultPremiumCredits-owned").classList.remove("mb-0");
 | 
					                                document.getElementById("VaultPremiumCredits-owned").classList.remove("mb-0");
 | 
				
			||||||
 | 
					                                document.getElementById("vaultMiscItems-form").classList.remove("d-none");
 | 
				
			||||||
 | 
					                                document.getElementById("vaultShipDecorations-form").classList.remove("d-none");
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            if (userGuildMember.Rank <= 1) {
 | 
					                            if (userGuildMember.Rank <= 1) {
 | 
				
			||||||
                                document.querySelectorAll("#guild-actions button").forEach(btn => {
 | 
					                                document.querySelectorAll("#guild-actions button").forEach(btn => {
 | 
				
			||||||
@ -1892,42 +1898,55 @@ function updateInventory() {
 | 
				
			|||||||
                            document.getElementById("TechProjects-list").appendChild(tr);
 | 
					                            document.getElementById("TechProjects-list").appendChild(tr);
 | 
				
			||||||
                        });
 | 
					                        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        document.getElementById("VaultDecoRecipes-list").innerHTML = "";
 | 
					                        ["VaultDecoRecipes", "VaultMiscItems", "VaultShipDecorations"].forEach(vaultKey => {
 | 
				
			||||||
                        guildData.VaultDecoRecipes ??= [];
 | 
					                            document.getElementById(vaultKey + "-list").innerHTML = "";
 | 
				
			||||||
                        guildData.VaultDecoRecipes.forEach(item => {
 | 
					                            (guildData[vaultKey] ??= []).forEach(item => {
 | 
				
			||||||
 | 
					                                if (vaultKey == "VaultDecoRecipes") {
 | 
				
			||||||
                                    const datalist = document.getElementById("datalist-VaultDecoRecipes");
 | 
					                                    const datalist = document.getElementById("datalist-VaultDecoRecipes");
 | 
				
			||||||
                            const optionToRemove = datalist.querySelector(`option[data-key="${item.ItemType}"]`);
 | 
					                                    const optionToRemove = datalist.querySelector(
 | 
				
			||||||
 | 
					                                        `option[data-key="${item.ItemType}"]`
 | 
				
			||||||
 | 
					                                    );
 | 
				
			||||||
                                    if (optionToRemove) {
 | 
					                                    if (optionToRemove) {
 | 
				
			||||||
                                        datalist.removeChild(optionToRemove);
 | 
					                                        datalist.removeChild(optionToRemove);
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                const tr = document.createElement("tr");
 | 
					                                const tr = document.createElement("tr");
 | 
				
			||||||
                                tr.setAttribute("data-item-type", item.ItemType);
 | 
					                                tr.setAttribute("data-item-type", item.ItemType);
 | 
				
			||||||
                                {
 | 
					                                {
 | 
				
			||||||
                                    const td = document.createElement("td");
 | 
					                                    const td = document.createElement("td");
 | 
				
			||||||
                                    td.textContent = itemMap[item.ItemType]?.name ?? item.ItemType;
 | 
					                                    td.textContent = itemMap[item.ItemType]?.name ?? item.ItemType;
 | 
				
			||||||
 | 
					                                    if (item.ItemCount > 1) {
 | 
				
			||||||
 | 
					                                        td.innerHTML += ` <span title='${loc("code_count")}'>🗍 ${parseInt(item.ItemCount)}</span>`;
 | 
				
			||||||
 | 
					                                    }
 | 
				
			||||||
                                    tr.appendChild(td);
 | 
					                                    tr.appendChild(td);
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                                {
 | 
					                                {
 | 
				
			||||||
                                    const td = document.createElement("td");
 | 
					                                    const td = document.createElement("td");
 | 
				
			||||||
                                    td.classList = "text-end text-nowrap";
 | 
					                                    td.classList = "text-end text-nowrap";
 | 
				
			||||||
 | 
					                                    const canRemove =
 | 
				
			||||||
                                if (userGuildMember && userGuildMember.Rank <= 1) {
 | 
					                                        vaultKey === "VaultDecoRecipes"
 | 
				
			||||||
 | 
					                                            ? userGuildMember && userGuildMember.Rank <= 1
 | 
				
			||||||
 | 
					                                            : userGuildPermissions && userGuildPermissions & 64;
 | 
				
			||||||
 | 
					                                    if (canRemove) {
 | 
				
			||||||
                                        const a = document.createElement("a");
 | 
					                                        const a = document.createElement("a");
 | 
				
			||||||
                                        a.href = "#";
 | 
					                                        a.href = "#";
 | 
				
			||||||
                                    a.onclick = function (event) {
 | 
					 | 
				
			||||||
                                        event.preventDefault();
 | 
					 | 
				
			||||||
                                        reAddToItemList(itemMap, "VaultDecoRecipes", item.ItemType);
 | 
					 | 
				
			||||||
                                        removeVaultDecoRecipe(item.ItemType);
 | 
					 | 
				
			||||||
                                    };
 | 
					 | 
				
			||||||
                                        a.title = loc("code_remove");
 | 
					                                        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>`;
 | 
					                                        a.onclick = e => {
 | 
				
			||||||
 | 
					                                            e.preventDefault();
 | 
				
			||||||
 | 
					                                            if (vaultKey == "VaultDecoRecipes") {
 | 
				
			||||||
 | 
					                                                reAddToItemList(itemMap, vaultKey, item.ItemType);
 | 
				
			||||||
 | 
					                                            }
 | 
				
			||||||
 | 
					                                            removeVaultItem(vaultKey, item.ItemType, item.ItemCount * -1);
 | 
				
			||||||
 | 
					                                        };
 | 
				
			||||||
 | 
					                                        a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><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);
 | 
					                                        td.appendChild(a);
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
                                    tr.appendChild(td);
 | 
					                                    tr.appendChild(td);
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            document.getElementById("VaultDecoRecipes-list").appendChild(tr);
 | 
					                                document.getElementById(vaultKey + "-list").appendChild(tr);
 | 
				
			||||||
 | 
					                            });
 | 
				
			||||||
                        });
 | 
					                        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        document.getElementById("Members-list").innerHTML = "";
 | 
					                        document.getElementById("Members-list").innerHTML = "";
 | 
				
			||||||
@ -2346,41 +2365,52 @@ function addMissingEquipment(categories) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function addVaultDecoRecipe() {
 | 
					function addVaultItem(vaultType) {
 | 
				
			||||||
    const uniqueName = getKey(document.getElementById("acquire-type-VaultDecoRecipes"));
 | 
					    const ItemType = getKey(document.getElementById(`acquire-type-${vaultType}`));
 | 
				
			||||||
    if (!uniqueName) {
 | 
					    if (!ItemType) {
 | 
				
			||||||
        $("#acquire-type-VaultDecoRecipes").addClass("is-invalid").focus();
 | 
					        $(`#acquire-type-${vaultType}`).addClass("is-invalid").focus();
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    const ItemCount = ["VaultMiscItems", "VaultShipDecorations"].includes(vaultType)
 | 
				
			||||||
 | 
					        ? parseInt($(`#${vaultType}-count`).val())
 | 
				
			||||||
 | 
					        : 1;
 | 
				
			||||||
 | 
					    if (ItemCount != 0) {
 | 
				
			||||||
        revalidateAuthz().then(() => {
 | 
					        revalidateAuthz().then(() => {
 | 
				
			||||||
            const req = $.post({
 | 
					            const req = $.post({
 | 
				
			||||||
            url: "/custom/addVaultDecoRecipe?" + window.authz + "&guildId=" + window.guildId,
 | 
					                url: "/custom/addVaultTypeCount?" + window.authz + "&guildId=" + window.guildId,
 | 
				
			||||||
                contentType: "application/json",
 | 
					                contentType: "application/json",
 | 
				
			||||||
            data: JSON.stringify([
 | 
					                data: JSON.stringify({
 | 
				
			||||||
 | 
					                    vaultType,
 | 
				
			||||||
 | 
					                    items: [
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                    ItemType: uniqueName,
 | 
					                            ItemType,
 | 
				
			||||||
                    ItemCount: 1
 | 
					                            ItemCount
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
            ])
 | 
					                    ]
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            req.done(() => {
 | 
					            req.done(() => {
 | 
				
			||||||
            document.getElementById("acquire-type-VaultDecoRecipes").value = "";
 | 
					                document.getElementById(`acquire-type-${vaultType}`).value = "";
 | 
				
			||||||
                updateInventory();
 | 
					                updateInventory();
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function removeVaultDecoRecipe(uniqueName) {
 | 
					function removeVaultItem(vaultType, ItemType, ItemCount) {
 | 
				
			||||||
    revalidateAuthz().then(() => {
 | 
					    revalidateAuthz().then(() => {
 | 
				
			||||||
        const req = $.post({
 | 
					        const req = $.post({
 | 
				
			||||||
            url: "/custom/addVaultDecoRecipe?" + window.authz + "&guildId=" + window.guildId,
 | 
					            url: "/custom/addVaultTypeCount?" + window.authz + "&guildId=" + window.guildId,
 | 
				
			||||||
            contentType: "application/json",
 | 
					            contentType: "application/json",
 | 
				
			||||||
            data: JSON.stringify([
 | 
					            data: JSON.stringify({
 | 
				
			||||||
 | 
					                vaultType,
 | 
				
			||||||
 | 
					                items: [
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                    ItemType: uniqueName,
 | 
					                        ItemType,
 | 
				
			||||||
                    ItemCount: -1
 | 
					                        ItemCount
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
            ])
 | 
					                ]
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        req.done(() => {
 | 
					        req.done(() => {
 | 
				
			||||||
            updateInventory();
 | 
					            updateInventory();
 | 
				
			||||||
@ -2462,13 +2492,16 @@ function fundGuildTechProject(uniqueName) {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function dispatchAddVaultDecoRecipesBatch(requests) {
 | 
					function dispatchAddVaultItemsBatch(requests, vaultType) {
 | 
				
			||||||
    return new Promise(resolve => {
 | 
					    return new Promise(resolve => {
 | 
				
			||||||
        revalidateAuthz().then(() => {
 | 
					        revalidateAuthz().then(() => {
 | 
				
			||||||
            const req = $.post({
 | 
					            const req = $.post({
 | 
				
			||||||
                url: "/custom/addVaultDecoRecipe?" + window.authz + "&guildId=" + window.guildId,
 | 
					                url: "/custom/addVaultItems?" + window.authz + "&guildId=" + window.guildId,
 | 
				
			||||||
                contentType: "application/json",
 | 
					                contentType: "application/json",
 | 
				
			||||||
                data: JSON.stringify(requests)
 | 
					                data: JSON.stringify({
 | 
				
			||||||
 | 
					                    vaultType,
 | 
				
			||||||
 | 
					                    items: requests
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            req.done(() => {
 | 
					            req.done(() => {
 | 
				
			||||||
                updateInventory();
 | 
					                updateInventory();
 | 
				
			||||||
@ -2478,20 +2511,23 @@ function dispatchAddVaultDecoRecipesBatch(requests) {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function addMissingVaultDecoRecipes() {
 | 
					function addMissingVaultItems(vaultType) {
 | 
				
			||||||
    const requests = [];
 | 
					    const requests = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    document.querySelectorAll("#datalist-VaultDecoRecipes" + " option").forEach(elm => {
 | 
					    document.querySelectorAll(`#datalist-${vaultType} option`).forEach(elm => {
 | 
				
			||||||
        if (!document.querySelector("#VaultDecoRecipes-list [data-item-type='" + elm.getAttribute("data-key") + "']")) {
 | 
					        const datalist = vaultType === "VaultShipDecorations" ? "ShipDecorations" : vaultType;
 | 
				
			||||||
            requests.push({ ItemType: elm.getAttribute("data-key"), ItemCount: 1 });
 | 
					        if (!document.querySelector(`#${datalist}-list [data-item-type='${elm.getAttribute("data-key")}']`)) {
 | 
				
			||||||
 | 
					            let ItemCount = 1;
 | 
				
			||||||
 | 
					            if (category == "VaultShipDecorations") ItemCount = 999999;
 | 
				
			||||||
 | 
					            requests.push({ ItemType: elm.getAttribute("data-key"), ItemCount });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (
 | 
					    if (
 | 
				
			||||||
        requests.length != 0 &&
 | 
					        requests.length != 0 &&
 | 
				
			||||||
        window.confirm(loc("code_addDecoRecipesConfirm").split("|COUNT|").join(requests.length))
 | 
					        window.confirm(loc("code_addVaultItemsConfirm").split("|COUNT|").join(requests.length))
 | 
				
			||||||
    ) {
 | 
					    ) {
 | 
				
			||||||
        return dispatchAddVaultDecoRecipesBatch(requests);
 | 
					        return dispatchAddVaultItemsBatch(requests, vaultType);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -3445,6 +3481,12 @@ single.getRoute("#guild-route").on("beforeload", function () {
 | 
				
			|||||||
    document.getElementById("VaultDecoRecipes-list").innerHTML = "";
 | 
					    document.getElementById("VaultDecoRecipes-list").innerHTML = "";
 | 
				
			||||||
    document.getElementById("vaultDecoRecipes-form").classList.add("d-none");
 | 
					    document.getElementById("vaultDecoRecipes-form").classList.add("d-none");
 | 
				
			||||||
    document.getElementById("acquire-type-VaultDecoRecipes").value = "";
 | 
					    document.getElementById("acquire-type-VaultDecoRecipes").value = "";
 | 
				
			||||||
 | 
					    document.getElementById("VaultMiscItems-list").innerHTML = "";
 | 
				
			||||||
 | 
					    document.getElementById("vaultMiscItems-form").classList.add("d-none");
 | 
				
			||||||
 | 
					    document.getElementById("acquire-type-VaultMiscItems").value = "";
 | 
				
			||||||
 | 
					    document.getElementById("VaultShipDecorations-list").innerHTML = "";
 | 
				
			||||||
 | 
					    document.getElementById("vaultShipDecorations-form").classList.add("d-none");
 | 
				
			||||||
 | 
					    document.getElementById("acquire-type-VaultShipDecorations").value = "";
 | 
				
			||||||
    document.getElementById("Alliance-list").innerHTML = "";
 | 
					    document.getElementById("Alliance-list").innerHTML = "";
 | 
				
			||||||
    document.getElementById("guildView-alliance").textContent = "";
 | 
					    document.getElementById("guildView-alliance").textContent = "";
 | 
				
			||||||
    document.getElementById("Members-list").innerHTML = "";
 | 
					    document.getElementById("Members-list").innerHTML = "";
 | 
				
			||||||
 | 
				
			|||||||
@ -33,7 +33,7 @@ dict = {
 | 
				
			|||||||
    code_remove: `Entfernen`,
 | 
					    code_remove: `Entfernen`,
 | 
				
			||||||
    code_addItemsConfirm: `Bist du sicher, dass du |COUNT| Gegenstände zu deinem Account hinzufügen möchtest?`,
 | 
					    code_addItemsConfirm: `Bist du sicher, dass du |COUNT| Gegenstände zu deinem Account hinzufügen möchtest?`,
 | 
				
			||||||
    code_addTechProjectsConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| research to your clan?`,
 | 
					    code_addTechProjectsConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| research to your clan?`,
 | 
				
			||||||
    code_addDecoRecipesConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| deco recipes to your clan?`,
 | 
					    code_addVaultItemsConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| items to your clan vault?`,
 | 
				
			||||||
    code_succRankUp: `Erfolgreich aufgestiegen.`,
 | 
					    code_succRankUp: `Erfolgreich aufgestiegen.`,
 | 
				
			||||||
    code_noEquipmentToRankUp: `Keine Ausstattung zum Rangaufstieg verfügbar.`,
 | 
					    code_noEquipmentToRankUp: `Keine Ausstattung zum Rangaufstieg verfügbar.`,
 | 
				
			||||||
    code_succAdded: `Erfolgreich hinzugefügt.`,
 | 
					    code_succAdded: `Erfolgreich hinzugefügt.`,
 | 
				
			||||||
@ -419,6 +419,8 @@ dict = {
 | 
				
			|||||||
    guildView_cheats: `[UNTRANSLATED] Clan Cheats`,
 | 
					    guildView_cheats: `[UNTRANSLATED] Clan Cheats`,
 | 
				
			||||||
    guildView_techProjects: `Forschung`,
 | 
					    guildView_techProjects: `Forschung`,
 | 
				
			||||||
    guildView_vaultDecoRecipes: `[UNTRANSLATED] Dojo Deco Recipes`,
 | 
					    guildView_vaultDecoRecipes: `[UNTRANSLATED] Dojo Deco Recipes`,
 | 
				
			||||||
 | 
					    guildView_vaultMiscItems: `[UNTRANSLATED] Resources in Vault`,
 | 
				
			||||||
 | 
					    guildView_vaultShipDecorations: `[UNTRANSLATED] Decorations in Vault`,
 | 
				
			||||||
    guildView_alliance: `Allianz`,
 | 
					    guildView_alliance: `Allianz`,
 | 
				
			||||||
    guildView_members: `Mitglieder`,
 | 
					    guildView_members: `Mitglieder`,
 | 
				
			||||||
    guildView_pending: `Ausstehend`,
 | 
					    guildView_pending: `Ausstehend`,
 | 
				
			||||||
@ -441,6 +443,7 @@ dict = {
 | 
				
			|||||||
    guildView_currency_owned: `[UNTRANSLATED] |COUNT| in Vault.`,
 | 
					    guildView_currency_owned: `[UNTRANSLATED] |COUNT| in Vault.`,
 | 
				
			||||||
    guildView_bulkAddTechProjects: `[UNTRANSLATED] Add Missing Research`,
 | 
					    guildView_bulkAddTechProjects: `[UNTRANSLATED] Add Missing Research`,
 | 
				
			||||||
    guildView_bulkAddVaultDecoRecipes: `[UNTRANSLATED] Add Missing Dojo Deco Recipes`,
 | 
					    guildView_bulkAddVaultDecoRecipes: `[UNTRANSLATED] Add Missing Dojo Deco Recipes`,
 | 
				
			||||||
 | 
					    guildView_bulkAddVaultShipDecorations: `[UNTRANSLATED] Add Missing Decorations in Vault`,
 | 
				
			||||||
    guildView_bulkFundTechProjects: `[UNTRANSLATED] Fund All Research`,
 | 
					    guildView_bulkFundTechProjects: `[UNTRANSLATED] Fund All Research`,
 | 
				
			||||||
    guildView_bulkCompleteTechProjects: `[UNTRANSLATED] Complete All Research`,
 | 
					    guildView_bulkCompleteTechProjects: `[UNTRANSLATED] Complete All Research`,
 | 
				
			||||||
    guildView_promote: `Befördern`,
 | 
					    guildView_promote: `Befördern`,
 | 
				
			||||||
 | 
				
			|||||||
@ -32,7 +32,7 @@ dict = {
 | 
				
			|||||||
    code_remove: `Remove`,
 | 
					    code_remove: `Remove`,
 | 
				
			||||||
    code_addItemsConfirm: `Are you sure you want to add |COUNT| items to your account?`,
 | 
					    code_addItemsConfirm: `Are you sure you want to add |COUNT| items to your account?`,
 | 
				
			||||||
    code_addTechProjectsConfirm: `Are you sure you want to add |COUNT| research to your clan?`,
 | 
					    code_addTechProjectsConfirm: `Are you sure you want to add |COUNT| research to your clan?`,
 | 
				
			||||||
    code_addDecoRecipesConfirm: `Are you sure you want to add |COUNT| deco recipes to your clan?`,
 | 
					    code_addVaultItemsConfirm: `Are you sure you want to add |COUNT| items to your clan vault?`,
 | 
				
			||||||
    code_succRankUp: `Successfully ranked up.`,
 | 
					    code_succRankUp: `Successfully ranked up.`,
 | 
				
			||||||
    code_noEquipmentToRankUp: `No equipment to rank up.`,
 | 
					    code_noEquipmentToRankUp: `No equipment to rank up.`,
 | 
				
			||||||
    code_succAdded: `Successfully added.`,
 | 
					    code_succAdded: `Successfully added.`,
 | 
				
			||||||
@ -418,6 +418,8 @@ dict = {
 | 
				
			|||||||
    guildView_cheats: `Clan Cheats`,
 | 
					    guildView_cheats: `Clan Cheats`,
 | 
				
			||||||
    guildView_techProjects: `Research`,
 | 
					    guildView_techProjects: `Research`,
 | 
				
			||||||
    guildView_vaultDecoRecipes: `Dojo Deco Recipes`,
 | 
					    guildView_vaultDecoRecipes: `Dojo Deco Recipes`,
 | 
				
			||||||
 | 
					    guildView_vaultMiscItems: `Resources in Vault`,
 | 
				
			||||||
 | 
					    guildView_vaultShipDecorations: `Decorations in Vault`,
 | 
				
			||||||
    guildView_alliance: `Alliance`,
 | 
					    guildView_alliance: `Alliance`,
 | 
				
			||||||
    guildView_members: `Members`,
 | 
					    guildView_members: `Members`,
 | 
				
			||||||
    guildView_pending: `Pending`,
 | 
					    guildView_pending: `Pending`,
 | 
				
			||||||
@ -440,6 +442,7 @@ dict = {
 | 
				
			|||||||
    guildView_currency_owned: `|COUNT| in Vault.`,
 | 
					    guildView_currency_owned: `|COUNT| in Vault.`,
 | 
				
			||||||
    guildView_bulkAddTechProjects: `Add Missing Research`,
 | 
					    guildView_bulkAddTechProjects: `Add Missing Research`,
 | 
				
			||||||
    guildView_bulkAddVaultDecoRecipes: `Add Missing Dojo Deco Recipes`,
 | 
					    guildView_bulkAddVaultDecoRecipes: `Add Missing Dojo Deco Recipes`,
 | 
				
			||||||
 | 
					    guildView_bulkAddVaultShipDecorations: `Add Missing Decorations in Vault`,
 | 
				
			||||||
    guildView_bulkFundTechProjects: `Fund All Research`,
 | 
					    guildView_bulkFundTechProjects: `Fund All Research`,
 | 
				
			||||||
    guildView_bulkCompleteTechProjects: `Complete All Research`,
 | 
					    guildView_bulkCompleteTechProjects: `Complete All Research`,
 | 
				
			||||||
    guildView_promote: `Promote`,
 | 
					    guildView_promote: `Promote`,
 | 
				
			||||||
 | 
				
			|||||||
@ -33,7 +33,7 @@ dict = {
 | 
				
			|||||||
    code_remove: `Quitar`,
 | 
					    code_remove: `Quitar`,
 | 
				
			||||||
    code_addItemsConfirm: `¿Estás seguro de que deseas agregar |COUNT| objetos a tu cuenta?`,
 | 
					    code_addItemsConfirm: `¿Estás seguro de que deseas agregar |COUNT| objetos a tu cuenta?`,
 | 
				
			||||||
    code_addTechProjectsConfirm: `¿Estás seguro de que quieres añadir |COUNT| proyectos de investigación a tu clan?`,
 | 
					    code_addTechProjectsConfirm: `¿Estás seguro de que quieres añadir |COUNT| proyectos de investigación a tu clan?`,
 | 
				
			||||||
    code_addDecoRecipesConfirm: `¿Estás seguro de que quieres añadir |COUNT| planos de decoración a tu clan?`,
 | 
					    code_addVaultItemsConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| items to your clan vault?`,
 | 
				
			||||||
    code_succRankUp: `Ascenso exitoso.`,
 | 
					    code_succRankUp: `Ascenso exitoso.`,
 | 
				
			||||||
    code_noEquipmentToRankUp: `No hay equipo para ascender.`,
 | 
					    code_noEquipmentToRankUp: `No hay equipo para ascender.`,
 | 
				
			||||||
    code_succAdded: `Agregado exitosamente.`,
 | 
					    code_succAdded: `Agregado exitosamente.`,
 | 
				
			||||||
@ -419,6 +419,8 @@ dict = {
 | 
				
			|||||||
    guildView_cheats: `Trucos de Clan`,
 | 
					    guildView_cheats: `Trucos de Clan`,
 | 
				
			||||||
    guildView_techProjects: `Investigación`,
 | 
					    guildView_techProjects: `Investigación`,
 | 
				
			||||||
    guildView_vaultDecoRecipes: `Planos de Decoración de Dojo`,
 | 
					    guildView_vaultDecoRecipes: `Planos de Decoración de Dojo`,
 | 
				
			||||||
 | 
					    guildView_vaultMiscItems: `[UNTRANSLATED] Resources in Vault`,
 | 
				
			||||||
 | 
					    guildView_vaultShipDecorations: `[UNTRANSLATED] Decorations in Vault`,
 | 
				
			||||||
    guildView_alliance: `Alianza`,
 | 
					    guildView_alliance: `Alianza`,
 | 
				
			||||||
    guildView_members: `Miembros`,
 | 
					    guildView_members: `Miembros`,
 | 
				
			||||||
    guildView_pending: `Pendiente`,
 | 
					    guildView_pending: `Pendiente`,
 | 
				
			||||||
@ -441,6 +443,7 @@ dict = {
 | 
				
			|||||||
    guildView_currency_owned: `|COUNT| en la Bóveda.`,
 | 
					    guildView_currency_owned: `|COUNT| en la Bóveda.`,
 | 
				
			||||||
    guildView_bulkAddTechProjects: `Añadir proyectos de Investigación Faltantes`,
 | 
					    guildView_bulkAddTechProjects: `Añadir proyectos de Investigación Faltantes`,
 | 
				
			||||||
    guildView_bulkAddVaultDecoRecipes: `Añadir planos de Decoración de Dojo Faltantes`,
 | 
					    guildView_bulkAddVaultDecoRecipes: `Añadir planos de Decoración de Dojo Faltantes`,
 | 
				
			||||||
 | 
					    guildView_bulkAddVaultShipDecorations: `[UNTRANSLATED] Add Missing Decorations in Vault`,
 | 
				
			||||||
    guildView_bulkFundTechProjects: `Financiar toda la Investigación`,
 | 
					    guildView_bulkFundTechProjects: `Financiar toda la Investigación`,
 | 
				
			||||||
    guildView_bulkCompleteTechProjects: `Completar toda la Investigación`,
 | 
					    guildView_bulkCompleteTechProjects: `Completar toda la Investigación`,
 | 
				
			||||||
    guildView_promote: `Promover`,
 | 
					    guildView_promote: `Promover`,
 | 
				
			||||||
 | 
				
			|||||||
@ -33,7 +33,7 @@ dict = {
 | 
				
			|||||||
    code_remove: `Retirer`,
 | 
					    code_remove: `Retirer`,
 | 
				
			||||||
    code_addItemsConfirm: `Ajouter |COUNT| items à l'inventaire ?`,
 | 
					    code_addItemsConfirm: `Ajouter |COUNT| items à l'inventaire ?`,
 | 
				
			||||||
    code_addTechProjectsConfirm: `Ajouter |COUNT| recherches au clan ?`,
 | 
					    code_addTechProjectsConfirm: `Ajouter |COUNT| recherches au clan ?`,
 | 
				
			||||||
    code_addDecoRecipesConfirm: `Ajouter |COUNT| décorations au clan ?`,
 | 
					    code_addVaultItemsConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| items to your clan vault?`,
 | 
				
			||||||
    code_succRankUp: `Montée de niveau effectuée.`,
 | 
					    code_succRankUp: `Montée de niveau effectuée.`,
 | 
				
			||||||
    code_noEquipmentToRankUp: `Aucun équipement à monter de niveau.`,
 | 
					    code_noEquipmentToRankUp: `Aucun équipement à monter de niveau.`,
 | 
				
			||||||
    code_succAdded: `Ajouté.`,
 | 
					    code_succAdded: `Ajouté.`,
 | 
				
			||||||
@ -419,6 +419,8 @@ dict = {
 | 
				
			|||||||
    guildView_cheats: `[UNTRANSLATED] Clan Cheats`,
 | 
					    guildView_cheats: `[UNTRANSLATED] Clan Cheats`,
 | 
				
			||||||
    guildView_techProjects: `Recherche`,
 | 
					    guildView_techProjects: `Recherche`,
 | 
				
			||||||
    guildView_vaultDecoRecipes: `Schémas de décorations de dojo`,
 | 
					    guildView_vaultDecoRecipes: `Schémas de décorations de dojo`,
 | 
				
			||||||
 | 
					    guildView_vaultMiscItems: `[UNTRANSLATED] Resources in Vault`,
 | 
				
			||||||
 | 
					    guildView_vaultShipDecorations: `[UNTRANSLATED] Decorations in Vault`,
 | 
				
			||||||
    guildView_alliance: `Alliance`,
 | 
					    guildView_alliance: `Alliance`,
 | 
				
			||||||
    guildView_members: `Members`,
 | 
					    guildView_members: `Members`,
 | 
				
			||||||
    guildView_pending: `En Attente`,
 | 
					    guildView_pending: `En Attente`,
 | 
				
			||||||
@ -441,6 +443,7 @@ dict = {
 | 
				
			|||||||
    guildView_currency_owned: `|COUNT| dans le coffre.`,
 | 
					    guildView_currency_owned: `|COUNT| dans le coffre.`,
 | 
				
			||||||
    guildView_bulkAddTechProjects: `Ajouter les recherches manquantes`,
 | 
					    guildView_bulkAddTechProjects: `Ajouter les recherches manquantes`,
 | 
				
			||||||
    guildView_bulkAddVaultDecoRecipes: `Ajouter les schémas de décorations de dojo manquantes`,
 | 
					    guildView_bulkAddVaultDecoRecipes: `Ajouter les schémas de décorations de dojo manquantes`,
 | 
				
			||||||
 | 
					    guildView_bulkAddVaultShipDecorations: `[UNTRANSLATED] Add Missing Decorations in Vault`,
 | 
				
			||||||
    guildView_bulkFundTechProjects: `Financer toutes les recherches`,
 | 
					    guildView_bulkFundTechProjects: `Financer toutes les recherches`,
 | 
				
			||||||
    guildView_bulkCompleteTechProjects: `Compléter toutes les recherches`,
 | 
					    guildView_bulkCompleteTechProjects: `Compléter toutes les recherches`,
 | 
				
			||||||
    guildView_promote: `Promouvoir`,
 | 
					    guildView_promote: `Promouvoir`,
 | 
				
			||||||
 | 
				
			|||||||
@ -33,7 +33,7 @@ dict = {
 | 
				
			|||||||
    code_remove: `Удалить`,
 | 
					    code_remove: `Удалить`,
 | 
				
			||||||
    code_addItemsConfirm: `Вы уверены, что хотите добавить |COUNT| предметов на ваш аккаунт?`,
 | 
					    code_addItemsConfirm: `Вы уверены, что хотите добавить |COUNT| предметов на ваш аккаунт?`,
 | 
				
			||||||
    code_addTechProjectsConfirm: `Вы уверены, что хотите добавить |COUNT| исследований в свой клан?`,
 | 
					    code_addTechProjectsConfirm: `Вы уверены, что хотите добавить |COUNT| исследований в свой клан?`,
 | 
				
			||||||
    code_addDecoRecipesConfirm: `Вы уверены, что хотите добавить |COUNT| рецептов декораций в свой клан?`,
 | 
					    code_addVaultItemsConfirm: `Вы уверены, что хотите добавить |COUNT| предметов в хранилище своего клана?`,
 | 
				
			||||||
    code_succRankUp: `Ранг успешно повышен.`,
 | 
					    code_succRankUp: `Ранг успешно повышен.`,
 | 
				
			||||||
    code_noEquipmentToRankUp: `Нет снаряжения для повышения ранга.`,
 | 
					    code_noEquipmentToRankUp: `Нет снаряжения для повышения ранга.`,
 | 
				
			||||||
    code_succAdded: `Успешно добавлено.`,
 | 
					    code_succAdded: `Успешно добавлено.`,
 | 
				
			||||||
@ -419,6 +419,8 @@ dict = {
 | 
				
			|||||||
    guildView_cheats: `Читы Клана`,
 | 
					    guildView_cheats: `Читы Клана`,
 | 
				
			||||||
    guildView_techProjects: `Исследовения`,
 | 
					    guildView_techProjects: `Исследовения`,
 | 
				
			||||||
    guildView_vaultDecoRecipes: `Рецепты декораций Додзё`,
 | 
					    guildView_vaultDecoRecipes: `Рецепты декораций Додзё`,
 | 
				
			||||||
 | 
					    guildView_vaultMiscItems: `Ресурсы в Хранилище`,
 | 
				
			||||||
 | 
					    guildView_vaultShipDecorations: `Укращения в Хранилище`,
 | 
				
			||||||
    guildView_alliance: `Альянс`,
 | 
					    guildView_alliance: `Альянс`,
 | 
				
			||||||
    guildView_members: `Товарищи`,
 | 
					    guildView_members: `Товарищи`,
 | 
				
			||||||
    guildView_pending: `Ожидание`,
 | 
					    guildView_pending: `Ожидание`,
 | 
				
			||||||
@ -441,6 +443,7 @@ dict = {
 | 
				
			|||||||
    guildView_currency_owned: `В хранилище |COUNT|.`,
 | 
					    guildView_currency_owned: `В хранилище |COUNT|.`,
 | 
				
			||||||
    guildView_bulkAddTechProjects: `Добавить отсутствующие исследования`,
 | 
					    guildView_bulkAddTechProjects: `Добавить отсутствующие исследования`,
 | 
				
			||||||
    guildView_bulkAddVaultDecoRecipes: `Добавить отсутствующие рецепты декораций Дoдзё`,
 | 
					    guildView_bulkAddVaultDecoRecipes: `Добавить отсутствующие рецепты декораций Дoдзё`,
 | 
				
			||||||
 | 
					    guildView_bulkAddVaultShipDecorations: `Добавить отсутствующие укращения в Хранилище`,
 | 
				
			||||||
    guildView_bulkFundTechProjects: `Профинансировать все исследования`,
 | 
					    guildView_bulkFundTechProjects: `Профинансировать все исследования`,
 | 
				
			||||||
    guildView_bulkCompleteTechProjects: `Завершить все исследования`,
 | 
					    guildView_bulkCompleteTechProjects: `Завершить все исследования`,
 | 
				
			||||||
    guildView_promote: `Повысить`,
 | 
					    guildView_promote: `Повысить`,
 | 
				
			||||||
 | 
				
			|||||||
@ -33,7 +33,7 @@ dict = {
 | 
				
			|||||||
    code_remove: `Видалити`,
 | 
					    code_remove: `Видалити`,
 | 
				
			||||||
    code_addItemsConfirm: `Ви впевнені, що хочете додати |COUNT| предметів на ваш обліковий запис?`,
 | 
					    code_addItemsConfirm: `Ви впевнені, що хочете додати |COUNT| предметів на ваш обліковий запис?`,
 | 
				
			||||||
    code_addTechProjectsConfirm: `Ви впевнені, що хочете додати |COUNT| досліджень до свого клану?`,
 | 
					    code_addTechProjectsConfirm: `Ви впевнені, що хочете додати |COUNT| досліджень до свого клану?`,
 | 
				
			||||||
    code_addDecoRecipesConfirm: `Ви впевнені, що хочете додати |COUNT| рецептів оздоблень до свого клану?`,
 | 
					    code_addVaultItemsConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| items to your clan vault?`,
 | 
				
			||||||
    code_succRankUp: `Рівень успішно підвищено`,
 | 
					    code_succRankUp: `Рівень успішно підвищено`,
 | 
				
			||||||
    code_noEquipmentToRankUp: `Немає спорядження для підвищення рівня.`,
 | 
					    code_noEquipmentToRankUp: `Немає спорядження для підвищення рівня.`,
 | 
				
			||||||
    code_succAdded: `Успішно додано.`,
 | 
					    code_succAdded: `Успішно додано.`,
 | 
				
			||||||
@ -419,6 +419,8 @@ dict = {
 | 
				
			|||||||
    guildView_cheats: `Кланові чити`,
 | 
					    guildView_cheats: `Кланові чити`,
 | 
				
			||||||
    guildView_techProjects: `Дослідження`,
 | 
					    guildView_techProjects: `Дослідження`,
 | 
				
			||||||
    guildView_vaultDecoRecipes: `Рецепти оздоблень Доджьо`,
 | 
					    guildView_vaultDecoRecipes: `Рецепти оздоблень Доджьо`,
 | 
				
			||||||
 | 
					    guildView_vaultMiscItems: `[UNTRANSLATED] Resources in Vault`,
 | 
				
			||||||
 | 
					    guildView_vaultShipDecorations: `[UNTRANSLATED] Decorations in Vault`,
 | 
				
			||||||
    guildView_alliance: `Альянс`,
 | 
					    guildView_alliance: `Альянс`,
 | 
				
			||||||
    guildView_members: `Учасники`,
 | 
					    guildView_members: `Учасники`,
 | 
				
			||||||
    guildView_pending: `Очікування`,
 | 
					    guildView_pending: `Очікування`,
 | 
				
			||||||
@ -441,6 +443,7 @@ dict = {
 | 
				
			|||||||
    guildView_currency_owned: `В сховищі |COUNT|.`,
 | 
					    guildView_currency_owned: `В сховищі |COUNT|.`,
 | 
				
			||||||
    guildView_bulkAddTechProjects: `Додати відсутні дослідження`,
 | 
					    guildView_bulkAddTechProjects: `Додати відсутні дослідження`,
 | 
				
			||||||
    guildView_bulkAddVaultDecoRecipes: `Додати відсутні рецепти оздоблень Доджьо`,
 | 
					    guildView_bulkAddVaultDecoRecipes: `Додати відсутні рецепти оздоблень Доджьо`,
 | 
				
			||||||
 | 
					    guildView_bulkAddVaultShipDecorations: `[UNTRANSLATED] Add Missing Decorations in Vault`,
 | 
				
			||||||
    guildView_bulkFundTechProjects: `Фінансувати всі дослідження`,
 | 
					    guildView_bulkFundTechProjects: `Фінансувати всі дослідження`,
 | 
				
			||||||
    guildView_bulkCompleteTechProjects: `Завершити всі дослідження`,
 | 
					    guildView_bulkCompleteTechProjects: `Завершити всі дослідження`,
 | 
				
			||||||
    guildView_promote: `Підвищити звання`,
 | 
					    guildView_promote: `Підвищити звання`,
 | 
				
			||||||
 | 
				
			|||||||
@ -33,7 +33,7 @@ dict = {
 | 
				
			|||||||
    code_remove: `移除`,
 | 
					    code_remove: `移除`,
 | 
				
			||||||
    code_addItemsConfirm: `确定要向您的账户添加 |COUNT| 件物品吗?`,
 | 
					    code_addItemsConfirm: `确定要向您的账户添加 |COUNT| 件物品吗?`,
 | 
				
			||||||
    code_addTechProjectsConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| research to your clan?`,
 | 
					    code_addTechProjectsConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| research to your clan?`,
 | 
				
			||||||
    code_addDecoRecipesConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| deco recipes to your clan?`,
 | 
					    code_addVaultItemsConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| items to your clan vault?`,
 | 
				
			||||||
    code_succRankUp: `等级已提升`,
 | 
					    code_succRankUp: `等级已提升`,
 | 
				
			||||||
    code_noEquipmentToRankUp: `没有可升级的装备`,
 | 
					    code_noEquipmentToRankUp: `没有可升级的装备`,
 | 
				
			||||||
    code_succAdded: `添加成功`,
 | 
					    code_succAdded: `添加成功`,
 | 
				
			||||||
@ -419,6 +419,8 @@ dict = {
 | 
				
			|||||||
    guildView_cheats: `[UNTRANSLATED] Clan Cheats`,
 | 
					    guildView_cheats: `[UNTRANSLATED] Clan Cheats`,
 | 
				
			||||||
    guildView_techProjects: `研究`,
 | 
					    guildView_techProjects: `研究`,
 | 
				
			||||||
    guildView_vaultDecoRecipes: `[UNTRANSLATED] Dojo Deco Recipes`,
 | 
					    guildView_vaultDecoRecipes: `[UNTRANSLATED] Dojo Deco Recipes`,
 | 
				
			||||||
 | 
					    guildView_vaultMiscItems: `[UNTRANSLATED] Resources in Vault`,
 | 
				
			||||||
 | 
					    guildView_vaultShipDecorations: `[UNTRANSLATED] Decorations in Vault`,
 | 
				
			||||||
    guildView_alliance: `联盟`,
 | 
					    guildView_alliance: `联盟`,
 | 
				
			||||||
    guildView_members: `成员`,
 | 
					    guildView_members: `成员`,
 | 
				
			||||||
    guildView_pending: `待处理`,
 | 
					    guildView_pending: `待处理`,
 | 
				
			||||||
@ -441,6 +443,7 @@ dict = {
 | 
				
			|||||||
    guildView_currency_owned: `[UNTRANSLATED] |COUNT| in Vault.`,
 | 
					    guildView_currency_owned: `[UNTRANSLATED] |COUNT| in Vault.`,
 | 
				
			||||||
    guildView_bulkAddTechProjects: `[UNTRANSLATED] Add Missing Research`,
 | 
					    guildView_bulkAddTechProjects: `[UNTRANSLATED] Add Missing Research`,
 | 
				
			||||||
    guildView_bulkAddVaultDecoRecipes: `[UNTRANSLATED] Add Missing Dojo Deco Recipes`,
 | 
					    guildView_bulkAddVaultDecoRecipes: `[UNTRANSLATED] Add Missing Dojo Deco Recipes`,
 | 
				
			||||||
 | 
					    guildView_bulkAddVaultShipDecorations: `[UNTRANSLATED] Add Missing Decorations in Vault`,
 | 
				
			||||||
    guildView_bulkFundTechProjects: `[UNTRANSLATED] Fund All Research`,
 | 
					    guildView_bulkFundTechProjects: `[UNTRANSLATED] Fund All Research`,
 | 
				
			||||||
    guildView_bulkCompleteTechProjects: `[UNTRANSLATED] Complete All Research`,
 | 
					    guildView_bulkCompleteTechProjects: `[UNTRANSLATED] Complete All Research`,
 | 
				
			||||||
    guildView_promote: `升级`,
 | 
					    guildView_promote: `升级`,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user