From c4f348c252105648a7e4a3104b13f0075ae2bd47 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Thu, 11 Sep 2025 01:10:24 -0700 Subject: [PATCH 1/5] chore: update PE+ (#2769) Some more deprecations Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2769 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- src/controllers/api/infestedFoundryController.ts | 4 ++-- src/controllers/custom/addXpController.ts | 4 ++-- src/controllers/custom/getItemListsController.ts | 9 +++++++-- src/services/inventoryService.ts | 6 +++--- src/services/itemDataService.ts | 10 ++++++++++ src/services/purchaseService.ts | 6 +++--- 8 files changed, 32 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index c48dbc2f..03a98546 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "morgan": "^1.10.0", "ncp": "^2.0.0", "undici": "^7.10.0", - "warframe-public-export-plus": "^0.5.86", + "warframe-public-export-plus": "^0.5.87", "warframe-riven-info": "^0.1.2", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0", @@ -5532,9 +5532,9 @@ } }, "node_modules/warframe-public-export-plus": { - "version": "0.5.86", - "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.86.tgz", - "integrity": "sha512-tWJudKs4WdjFNiF6ipav9md3sboPXJFvSItTfSmT9ko+Xgg1QP75vS/qPsuPw67pqzMaSnAbHpEzNn/rZ4mCug==" + "version": "0.5.87", + "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.87.tgz", + "integrity": "sha512-pWDU3Df3fcEgYn42NNZb2XFOs5AdCIqFF/t9fU7VLpokBWjFzZgLz3O4gILssiUrwB4KCkvnjHi3BivgzJuv6g==" }, "node_modules/warframe-riven-info": { "version": "0.1.2", diff --git a/package.json b/package.json index ed3c5d4a..5b996ba2 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "morgan": "^1.10.0", "ncp": "^2.0.0", "undici": "^7.10.0", - "warframe-public-export-plus": "^0.5.86", + "warframe-public-export-plus": "^0.5.87", "warframe-riven-info": "^0.1.2", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0", diff --git a/src/controllers/api/infestedFoundryController.ts b/src/controllers/api/infestedFoundryController.ts index f46abd6c..f4ae1b31 100644 --- a/src/controllers/api/infestedFoundryController.ts +++ b/src/controllers/api/infestedFoundryController.ts @@ -10,7 +10,7 @@ import type { IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts"; import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts"; -import { ExportMisc } from "warframe-public-export-plus"; +import { ExportResources } from "warframe-public-export-plus"; import { getRecipe } from "../../services/itemDataService.ts"; import { toMongoDate, version_compare } from "../../helpers/inventoryHelpers.ts"; import { logger } from "../../utils/logger.ts"; @@ -146,7 +146,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => { const currentUnixSeconds = Math.trunc(Date.now() / 1000); for (const contribution of request.ResourceContributions) { - const snack = ExportMisc.helminthSnacks[contribution.ItemType]; + const snack = ExportResources[contribution.ItemType].helminthSnack!; // tally items for removal const change = miscItemChanges.find(x => x.ItemType == contribution.ItemType); diff --git a/src/controllers/custom/addXpController.ts b/src/controllers/custom/addXpController.ts index 7ca1d2d9..5ef17a2d 100644 --- a/src/controllers/custom/addXpController.ts +++ b/src/controllers/custom/addXpController.ts @@ -1,11 +1,11 @@ import { applyClientEquipmentUpdates, getInventory } from "../../services/inventoryService.ts"; +import { getMaxLevelCap } from "../../services/itemDataService.ts"; import { getAccountIdForRequest } from "../../services/loginService.ts"; import { broadcastInventoryUpdate } from "../../services/wsService.ts"; import type { IOid } from "../../types/commonTypes.ts"; import type { IEquipmentClient } from "../../types/equipmentTypes.ts"; import type { TEquipmentKey } from "../../types/inventoryTypes/inventoryTypes.ts"; import type { RequestHandler } from "express"; -import { ExportMisc } from "warframe-public-export-plus"; export const addXpController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); @@ -15,7 +15,7 @@ export const addXpController: RequestHandler = async (req, res) => { for (const clientItem of gear) { const dbItem = inventory[category as TEquipmentKey].id((clientItem.ItemId as IOid).$oid); if (dbItem) { - if (dbItem.ItemType in ExportMisc.uniqueLevelCaps) { + if (getMaxLevelCap(dbItem.ItemType) > 30) { if ((dbItem.Polarized ?? 0) < 5) { dbItem.Polarized = 5; } diff --git a/src/controllers/custom/getItemListsController.ts b/src/controllers/custom/getItemListsController.ts index 70f5f814..063d7cfa 100644 --- a/src/controllers/custom/getItemListsController.ts +++ b/src/controllers/custom/getItemListsController.ts @@ -12,7 +12,6 @@ import { ExportFactions, ExportGear, ExportKeys, - ExportMisc, ExportRailjackWeapons, ExportRecipes, ExportRelics, @@ -80,7 +79,7 @@ const toTitleCase = (str: string): string => { const getItemListsController: RequestHandler = (req, response) => { const lang = getDict(typeof req.query.lang == "string" ? req.query.lang : "en"); const res: ItemLists = { - uniqueLevelCaps: ExportMisc.uniqueLevelCaps, + uniqueLevelCaps: {}, Suits: [], LongGuns: [], Melee: [], @@ -147,6 +146,9 @@ const getItemListsController: RequestHandler = (req, response) => { name: getString(ability.name || uniqueName, lang) }); }); + if (item.maxLevelCap) { + res.uniqueLevelCaps[uniqueName] = item.maxLevelCap; + } } for (const [uniqueName, item] of Object.entries(ExportSentinels)) { if (item.productCategory == "Sentinels" || item.productCategory == "KubrowPets") { @@ -196,6 +198,9 @@ const getItemListsController: RequestHandler = (req, response) => { name: getString(item.name, lang) }); } + if (item.maxLevelCap) { + res.uniqueLevelCaps[uniqueName] = item.maxLevelCap; + } } for (const [uniqueName, item] of Object.entries(ExportResources)) { let name = getString(item.name, lang); diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index b0603244..eeb411f7 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -40,6 +40,7 @@ import { ExportBoosters, ExportBundles, ExportChallenges, + ExportCreditBundles, ExportCustoms, ExportDrones, ExportEmailItems, @@ -48,7 +49,6 @@ import { ExportFusionBundles, ExportGear, ExportKeys, - ExportMisc, ExportRailjackWeapons, ExportRecipes, ExportResources, @@ -631,8 +631,8 @@ export const addItem = async ( }; } } - if (typeName in ExportMisc.creditBundles) { - const creditsTotal = ExportMisc.creditBundles[typeName] * quantity; + if (typeName in ExportCreditBundles) { + const creditsTotal = ExportCreditBundles[typeName].credits * quantity; inventory.RegularCredits += creditsTotal; return { RegularCredits: creditsTotal diff --git a/src/services/itemDataService.ts b/src/services/itemDataService.ts index 838d732d..0b33a1a1 100644 --- a/src/services/itemDataService.ts +++ b/src/services/itemDataService.ts @@ -323,3 +323,13 @@ export const getDefaultUpgrades = (parts: string[]): IDefaultUpgrade[] | undefin } return allDefaultUpgrades.length == 0 ? undefined : allDefaultUpgrades; }; + +export const getMaxLevelCap = (type: string): number => { + if (type in ExportWarframes) { + return ExportWarframes[type].maxLevelCap ?? 30; + } + if (type in ExportWeapons) { + return ExportWeapons[type].maxLevelCap ?? 30; + } + return 30; +}; diff --git a/src/services/purchaseService.ts b/src/services/purchaseService.ts index a1aa6ee2..69277c54 100644 --- a/src/services/purchaseService.ts +++ b/src/services/purchaseService.ts @@ -24,8 +24,8 @@ import { ExportBoosterPacks, ExportBoosters, ExportBundles, + ExportCreditBundles, ExportGear, - ExportMisc, ExportResources, ExportSyndicates, ExportVendors @@ -631,8 +631,8 @@ const handleCreditBundlePurchase = async ( typeName: string, inventory: TInventoryDatabaseDocument ): Promise => { - if (typeName && typeName in ExportMisc.creditBundles) { - const creditsAmount = ExportMisc.creditBundles[typeName]; + if (typeName && typeName in ExportCreditBundles) { + const creditsAmount = ExportCreditBundles[typeName].credits; inventory.RegularCredits += creditsAmount; await inventory.save(); From f099b64ef4d3447952a712c3716fc34d2111b3ac Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Thu, 11 Sep 2025 01:10:32 -0700 Subject: [PATCH 2/5] fix(webui): correct check for guild id (#2770) Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2770 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> --- static/webui/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/webui/script.js b/static/webui/script.js index 0497ec33..4dc98212 100644 --- a/static/webui/script.js +++ b/static/webui/script.js @@ -664,7 +664,7 @@ function updateInventory() { req.done(data => { window.itemListPromise.then(itemMap => { window.didInitialInventoryUpdate = true; - if (data.GuildId.$oid) { + if (data.GuildId) { window.guildId = data.GuildId.$oid; document.getElementById("nav-guildView").classList.remove("d-none"); } else { From a5be29159fa76fafdd054b3b57c48d817406687b Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Fri, 12 Sep 2025 00:40:48 -0700 Subject: [PATCH 3/5] fix: handle lab conquest keeping RewardInfo from previous missions (#2771) Closes #2768 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2771 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com> --- src/services/missionInventoryUpdateService.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index c9fa0241..5fa0a508 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -92,11 +92,6 @@ import { handleGuildGoalProgress } from "./guildService.ts"; import { importLoadOutConfig } from "./importService.ts"; const getRotations = (rewardInfo: IRewardInfo, tierOverride?: number): number[] => { - // Disruption missions just tell us (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2599) - if (rewardInfo.rewardTierOverrides) { - return rewardInfo.rewardTierOverrides; - } - // For Spy missions, e.g. 3 vaults cracked = A, B, C if (rewardInfo.VaultsCracked) { const rotations: number[] = []; @@ -109,16 +104,26 @@ const getRotations = (rewardInfo: IRewardInfo, tierOverride?: number): number[] const region = ExportRegions[rewardInfo.node] as IRegion | undefined; const missionType: TMissionType | undefined = region?.missionType; - if (missionType == "MT_RESCUE" && rewardInfo.rewardTier) { + // Disruption uses 'rewardTierOverrides' to tell us (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2599) + // Note that this may stick in lab conquest so we need to filter by mission type (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2768) + if (missionType == "MT_ARTIFACT") { + return rewardInfo.rewardTierOverrides ?? []; + } + + if (missionType == "MT_RESCUE" && rewardInfo.rewardTier !== undefined) { return [rewardInfo.rewardTier]; } - // 'rewardQualifications' is unreliable for non-endless railjack missions (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2586, https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2612) + // 'rewardQualifications' may stick from previous missions for non-endless missions done after them + // - via railjack (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2586, https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2612) + // - via lab conquest (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2768) switch (region?.missionName) { case "/Lotus/Language/Missions/MissionName_Railjack": case "/Lotus/Language/Missions/MissionName_RailjackVolatile": case "/Lotus/Language/Missions/MissionName_RailjackExterminate": case "/Lotus/Language/Missions/MissionName_RailjackAssassinate": + case "/Lotus/Language/Missions/MissionName_Assassination": + case "/Lotus/Language/Missions/MissionName_Exterminate": return [0]; } From cd6ce61b800d9e3d11a0ea2275d0236d1043e04e Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Fri, 12 Sep 2025 00:41:05 -0700 Subject: [PATCH 4/5] feat: conservation standing reward (#2772) Closes #2763 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2772 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com> --- package-lock.json | 8 +- package.json | 2 +- src/services/missionInventoryUpdateService.ts | 17 +- .../fixed_responses/conservationAnimals.json | 491 ------------------ 4 files changed, 17 insertions(+), 501 deletions(-) delete mode 100644 static/fixed_responses/conservationAnimals.json diff --git a/package-lock.json b/package-lock.json index 03a98546..7462d960 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "morgan": "^1.10.0", "ncp": "^2.0.0", "undici": "^7.10.0", - "warframe-public-export-plus": "^0.5.87", + "warframe-public-export-plus": "^0.5.88", "warframe-riven-info": "^0.1.2", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0", @@ -5532,9 +5532,9 @@ } }, "node_modules/warframe-public-export-plus": { - "version": "0.5.87", - "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.87.tgz", - "integrity": "sha512-pWDU3Df3fcEgYn42NNZb2XFOs5AdCIqFF/t9fU7VLpokBWjFzZgLz3O4gILssiUrwB4KCkvnjHi3BivgzJuv6g==" + "version": "0.5.88", + "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.88.tgz", + "integrity": "sha512-uX766+MYDY3pMncu/23Dp9VZvrUe8pdWRWMcxfUbXg29aYO2GqipimHaFtw+vfrY06YAE8nbFkCWhFL3oPDPGw==" }, "node_modules/warframe-riven-info": { "version": "0.1.2", diff --git a/package.json b/package.json index 5b996ba2..ee531756 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "morgan": "^1.10.0", "ncp": "^2.0.0", "undici": "^7.10.0", - "warframe-public-export-plus": "^0.5.87", + "warframe-public-export-plus": "^0.5.88", "warframe-riven-info": "^0.1.2", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0", diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 5fa0a508..4d2c64ac 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -5,6 +5,7 @@ import type { TMissionType } from "warframe-public-export-plus"; import { + ExportAnimals, ExportEnemies, ExportFusionBundles, ExportRegions, @@ -61,7 +62,6 @@ import { createMessage } from "./inboxService.ts"; import kuriaMessage50 from "../../static/fixed_responses/kuriaMessages/fiftyPercent.json" with { type: "json" }; import kuriaMessage75 from "../../static/fixed_responses/kuriaMessages/seventyFivePercent.json" with { type: "json" }; import kuriaMessage100 from "../../static/fixed_responses/kuriaMessages/oneHundredPercent.json" with { type: "json" }; -import conservationAnimals from "../../static/fixed_responses/conservationAnimals.json" with { type: "json" }; import { generateNemesisProfile, getInfestedLichItemRewards, @@ -519,22 +519,23 @@ export const addMissionInventoryUpdates = async ( } case "CapturedAnimals": { for (const capturedAnimal of value) { - const meta = conservationAnimals[capturedAnimal.AnimalType as keyof typeof conservationAnimals]; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + const meta = ExportAnimals[capturedAnimal.AnimalType]?.conservation; // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (meta) { if (capturedAnimal.NumTags) { addMiscItems(inventory, [ { - ItemType: meta.tag, + ItemType: meta.itemReward, ItemCount: capturedAnimal.NumTags } ]); } if (capturedAnimal.NumExtraRewards) { - if ("extraReward" in meta) { + if (meta.woundedAnimalReward) { addMiscItems(inventory, [ { - ItemType: meta.extraReward, + ItemType: meta.woundedAnimalReward, ItemCount: capturedAnimal.NumExtraRewards } ]); @@ -544,6 +545,12 @@ export const addMissionInventoryUpdates = async ( ); } } + if (meta.standingReward) { + const syndicateTag = + inventoryUpdates.Missions!.Tag == "SolNode129" ? "SolarisSyndicate" : "CetusSyndicate"; + logger.debug(`adding ${meta.standingReward} standing to ${syndicateTag} for conservation`); + addStanding(inventory, syndicateTag, meta.standingReward); + } } else { logger.warn(`ignoring conservation of unknown AnimalType: ${capturedAnimal.AnimalType}`); } diff --git a/static/fixed_responses/conservationAnimals.json b/static/fixed_responses/conservationAnimals.json deleted file mode 100644 index 81dc1c0e..00000000 --- a/static/fixed_responses/conservationAnimals.json +++ /dev/null @@ -1,491 +0,0 @@ -{ - "/Lotus/Types/NeutralCreatures/Conservation/BirdOfPrey/CommonBirdOfPreyAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagCondrocCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/BirdOfPrey/CommonFemaleBirdOfPreyAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagCondrocCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/BirdOfPrey/CommonMaleBirdOfPreyAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagCondrocCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/BirdOfPrey/RareBirdOfPreyAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagCondrocRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/BirdOfPrey/RareFemaleBirdOfPreyAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagCondrocRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/BirdOfPrey/RareMaleBirdOfPreyAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagCondrocRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/BirdOfPrey/UncommonBirdOfPreyAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagCondrocUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/BirdOfPrey/UncommonFemaleBirdOfPreyAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagCondrocUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/BirdOfPrey/UncommonMaleBirdOfPreyAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagCondrocUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedCritter/BaseInfestedCritterAvatar": { - "tag": "/Lotus/Types/Items/Conservation/ConservationTagItem", - "extraReward": "/Lotus/Types/Items/Conservation/WoundedAnimalRewardItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedCritter/CommonInfestedCritterAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedCritterCommon", - "extraReward": "/Lotus/Types/Items/Deimos/WoundedInfestedCritterCommonRewardItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedCritter/RareInfestedCritterAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedCritterRare", - "extraReward": "/Lotus/Types/Items/Deimos/WoundedInfestedCritterRareRewardItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedCritter/UncommonInfestedCritterAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedCritterUncommon", - "extraReward": "/Lotus/Types/Items/Deimos/WoundedInfestedCritterUncommonRewardItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedKDrive/GrottoInfKDriveAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedKdriveUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedKDrive/HighlandInfKDriveAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedKdriveRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedKDrive/SwampInfKDriveAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedKdriveCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedMaggot/CommonInfestedMaggotAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedMaggotCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedMaggot/RareInfestedMaggotAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedMaggotRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedMaggot/UncommonInfestedMaggotAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedMaggotUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedMergoo/CommonInfestedMergooAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedMergooCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedMergoo/RareInfestedMergooAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedMergooRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedMergoo/UncommonInfestedMergooAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedMergooUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedNexifera/BaseInfestedNexiferaAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedNexiferaCommon", - "extraReward": "/Lotus/Types/Items/Conservation/WoundedAnimalRewardItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedNexifera/CommonInfestedNexiferaAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedNexiferaCommon", - "extraReward": "/Lotus/Types/Items/Conservation/WoundedAnimalRewardItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedNexifera/RareInfestedNexiferaAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedNexiferaRare", - "extraReward": "/Lotus/Types/Items/Conservation/WoundedAnimalRewardItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedNexifera/UncommonInfestedNexiferaAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedNexiferaUncommon", - "extraReward": "/Lotus/Types/Items/Conservation/WoundedAnimalRewardItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedPredator/BaseInfestedPredatorAvatar": { - "tag": "/Lotus/Types/Items/Conservation/ConservationTagItem", - "extraReward": "/Lotus/Types/Items/Conservation/WoundedAnimalRewardItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedPredator/CommonInfestedPredatorAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedPredatorCommon", - "extraReward": "/Lotus/Types/Items/Deimos/WoundedInfestedPredatorCommonRewardItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedPredator/RareInfestedPredatorAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedPredatorRare", - "extraReward": "/Lotus/Types/Items/Deimos/WoundedInfestedPredatorRareRewardItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedPredator/UncommonInfestedPredatorAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedPredatorUncommon", - "extraReward": "/Lotus/Types/Items/Deimos/WoundedInfestedPredatorUncommonRewardItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedUndazoa/BaseUndazoaAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedZongroCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedUndazoa/CommonUndazoaAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedZongroCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedUndazoa/RareUndazoaAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedZongroRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Deimos/InfestedUndazoa/UncommonUndazoaAvatar": { - "tag": "/Lotus/Types/Items/Deimos/AnimalTagInfestedZongroUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Duviri/Rabbit/BaseDuviriRabbitAvatar": { - "tag": "/Lotus/Types/Items/Conservation/ConservationTagItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Duviri/Rabbit/TeshinRabbitAvatar": { - "tag": "/Lotus/Types/Items/Conservation/ConservationTagItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Duviri/Rabbit/TeshinRabbitOnHandAvatar": { - "tag": "/Lotus/Types/Items/Conservation/ConservationTagItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Duviri/Wolf/DuviriWolfAvatar": { - "tag": "/Lotus/Types/Items/Conservation/ConservationTagItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/Duviri/Wolf/DuviriWolfConservationAvatar": { - "tag": "/Lotus/Types/Items/Conservation/ConservationTagItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/ForestRodent/CommonFemaleForestRodentAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagKuakaCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/ForestRodent/CommonForestRodentAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagKuakaCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/ForestRodent/CommonMaleForestRodentAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagKuakaCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/ForestRodent/RareFemaleForestRodentAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagKuakaRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/ForestRodent/RareForestRodentAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagKuakaRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/ForestRodent/RareMaleForestRodentAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagKuakaRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/ForestRodent/TutorialForestRodentAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagKuakaCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/ForestRodent/UncommonFemaleForestRodentAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagKuakaUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/ForestRodent/UncommonForestRodentAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagKuakaUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/ForestRodent/UncommonMaleForestRodentAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagKuakaUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/LegendaryKubrow/BaseLegendaryKubrowAvatar": { - "tag": "/Lotus/Types/Items/Conservation/ConservationTagItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/LegendaryKubrow/CommonFemaleLegendaryKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagKubrodonCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/LegendaryKubrow/CommonLegendaryKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagKubrodonCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/LegendaryKubrow/CommonMaleLegendaryKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagKubrodonCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/LegendaryKubrow/CommonPupLegendaryKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagKubrodonCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/LegendaryKubrow/RareFemaleLegendaryKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagKubrodonRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/LegendaryKubrow/RareLegendaryKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagKubrodonRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/LegendaryKubrow/RareMaleLegendaryKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagKubrodonRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/LegendaryKubrow/RarePupLegendaryKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagKubrodonRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/LegendaryKubrow/UncommonFemaleLegendaryKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagKubrodonUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/LegendaryKubrow/UncommonLegendaryKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagKubrodonUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/LegendaryKubrow/UncommonMaleLegendaryKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagKubrodonUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/LegendaryKubrow/UncommonPupLegendaryKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagKubrodonUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OrokinKubrow/BaseOrokinKubrowAvatar": { - "tag": "/Lotus/Types/Items/Conservation/ConservationTagItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OrokinKubrow/CommonFemaleOrokinKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagStoverCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OrokinKubrow/CommonMaleOrokinKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagStoverCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OrokinKubrow/CommonOrokinKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagStoverCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OrokinKubrow/CommonPupOrokinKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagStoverCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OrokinKubrow/RareFemaleOrokinKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagStoverRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OrokinKubrow/RareMaleOrokinKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagStoverRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OrokinKubrow/RareOrokinKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagStoverRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OrokinKubrow/RarePupOrokinKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagStoverRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OrokinKubrow/UncommonFemaleOrokinKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagStoverUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OrokinKubrow/UncommonMaleOrokinKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagStoverUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OrokinKubrow/UncommonOrokinKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagStoverUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OrokinKubrow/UncommonPupOrokinKubrowAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagStoverUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OstronSeaBird/CommonFemaleOstronSeaBirdAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagMergooCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OstronSeaBird/CommonMaleOstronSeaBirdAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagMergooCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OstronSeaBird/CommonOstronSeaBirdAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagMergooCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OstronSeaBird/RareFemaleOstronSeaBirdAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagMergooRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OstronSeaBird/RareMaleOstronSeaBirdAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagMergooRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OstronSeaBird/RareOstronSeaBirdAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagMergooRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OstronSeaBird/UncommonFemaleOstronSeaBirdAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagMergooUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OstronSeaBird/UncommonMaleOstronSeaBirdAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagMergooUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/OstronSeaBird/UncommonOstronSeaBirdAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagMergooUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowArmadillo/BaseSnowArmadilloAvatar": { - "tag": "/Lotus/Types/Items/Conservation/ConservationTagItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowArmadillo/CommonFemaleSnowArmadilloAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagBolarolaCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowArmadillo/CommonMaleSnowArmadilloAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagBolarolaCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowArmadillo/CommonPupSnowArmadilloAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagBolarolaCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowArmadillo/CommonSnowArmadilloAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagBolarolaCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowArmadillo/RareFemaleSnowArmadilloAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagBolarolaRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowArmadillo/RareMaleSnowArmadilloAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagBolarolaRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowArmadillo/RarePupSnowArmadilloAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagBolarolaRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowArmadillo/RareSnowArmadilloAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagBolarolaRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowArmadillo/UncommonFemaleSnowArmadilloAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagBolarolaUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowArmadillo/UncommonMaleSnowArmadilloAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagBolarolaUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowArmadillo/UncommonPupSnowArmadilloAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagBolarolaUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowArmadillo/UncommonSnowArmadilloAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagBolarolaUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowBird/BaseSnowBirdAvatar": { - "tag": "/Lotus/Types/Items/Conservation/ConservationTagItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowBird/CommonFemaleSnowBirdAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagSawgawCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowBird/CommonMaleSnowBirdAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagSawgawCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowBird/CommonPupSnowBirdAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagSawgawCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowBird/CommonSnowBirdAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagSawgawCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowBird/RareFemaleSnowBirdAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagSawgawRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowBird/RareMaleSnowBirdAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagSawgawRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowBird/RarePupSnowBirdAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagSawgawRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowBird/RareSnowBirdAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagSawgawRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowBird/UncommonFemaleSnowBirdAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagSawgawUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowBird/UncommonMaleSnowBirdAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagSawgawUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowBird/UncommonPupSnowBirdAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagSawgawUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowBird/UncommonSnowBirdAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagSawgawUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowCritter/BaseSnowCritterAvatar": { - "tag": "/Lotus/Types/Items/Conservation/ConservationTagItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowCritter/CommonFemaleSnowCritterAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagVirminkCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowCritter/CommonMaleSnowCritterAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagVirminkCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowCritter/CommonPupSnowCritterAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagVirminkCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowCritter/CommonSnowCritterAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagVirminkCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowCritter/RareFemaleSnowCritterAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagVirminkRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowCritter/RareMaleSnowCritterAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagVirminkRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowCritter/RarePupSnowCritterAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagVirminkRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowCritter/RareSnowCritterAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagVirminkRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowCritter/UncommonFemaleSnowCritterAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagVirminkUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowCritter/UncommonMaleSnowCritterAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagVirminkUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowCritter/UncommonPupSnowCritterAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagVirminkUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowCritter/UncommonSnowCritterAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagVirminkUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowPredator/BaseSnowPredatorAvatar": { - "tag": "/Lotus/Types/Items/Conservation/ConservationTagItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowPredator/CommonFemaleSnowPredatorAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagHorrasqueCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowPredator/CommonMaleSnowPredatorAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagHorrasqueCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowPredator/CommonPupSnowPredatorAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagHorrasqueCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowPredator/CommonSnowPredatorAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagHorrasqueCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowPredator/RareFemaleSnowPredatorAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagHorrasqueRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowPredator/RareMaleSnowPredatorAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagHorrasqueRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowPredator/RarePupSnowPredatorAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagHorrasqueRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowPredator/RareSnowPredatorAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagHorrasqueRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowPredator/UncommonFemaleSnowPredatorAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagHorrasqueUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowPredator/UncommonMaleSnowPredatorAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagHorrasqueUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowPredator/UncommonPupSnowPredatorAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagHorrasqueUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowPredator/UncommonSnowPredatorAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagHorrasqueUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowRodent/BaseSnowRodentAvatar": { - "tag": "/Lotus/Types/Items/Conservation/ConservationTagItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowRodent/CommonFemaleSnowRodentAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagPobbersCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowRodent/CommonMaleSnowRodentAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagPobbersCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowRodent/CommonSnowRodentAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagPobbersCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowRodent/RareFemaleSnowRodentAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagPobbersRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowRodent/RareMaleSnowRodentAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagPobbersRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowRodent/RareSnowRodentAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagPobbersRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowRodent/UncommonFemaleSnowRodentAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagPobbersUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowRodent/UncommonMaleSnowRodentAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagPobbersUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/SnowRodent/UncommonSnowRodentAvatar": { - "tag": "/Lotus/Types/Items/Solaris/AnimalTagPobbersUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/VampireKavat/BaseVampireKavatAvatar": { - "tag": "/Lotus/Types/Items/Conservation/ConservationTagItem" - }, - "/Lotus/Types/NeutralCreatures/Conservation/VampireKavat/CommonVampireKavatAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagVampireKavatCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/VampireKavat/CommonVampireKavatCubAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagVampireKavatCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/VampireKavat/CommonVampireKavatFemaleAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagVampireKavatCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/VampireKavat/CommonVampireKavatMaleAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagVampireKavatCommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/VampireKavat/RareVampireKavatAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagVampireKavatRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/VampireKavat/RareVampireKavatCubAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagVampireKavatRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/VampireKavat/RareVampireKavatFemaleAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagVampireKavatRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/VampireKavat/RareVampireKavatMaleAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagVampireKavatRare" - }, - "/Lotus/Types/NeutralCreatures/Conservation/VampireKavat/UncommonVampireKavatAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagVampireKavatUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/VampireKavat/UncommonVampireKavatCubAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagVampireKavatUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/VampireKavat/UncommonVampireKavatFemaleAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagVampireKavatUncommon" - }, - "/Lotus/Types/NeutralCreatures/Conservation/VampireKavat/UncommonVampireKavatMaleAvatar": { - "tag": "/Lotus/Types/Items/Eidolon/AnimalTagVampireKavatUncommon" - } -} From d027e7f26e7f2fdcf795a03b1b20918bd5febb35 Mon Sep 17 00:00:00 2001 From: Vitruvio Date: Fri, 12 Sep 2025 06:25:50 -0700 Subject: [PATCH 5/5] chore(webui): update fr (#2773) Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2773 Co-authored-by: Vitruvio Co-committed-by: Vitruvio --- static/webui/translations/fr.js | 62 ++++++++++++++++----------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js index 6230c60d..15d4be30 100644 --- a/static/webui/translations/fr.js +++ b/static/webui/translations/fr.js @@ -1,7 +1,7 @@ // French translation by Vitruvio dict = { general_inventoryUpdateNote: `Note : Pour voir les changements en jeu, l'inventaire doit être actualisé. Cela se fait en tapant /sync dans le tchat, en visitant un dojo/relais ou en se reconnectant.`, - general_inventoryUpdateNoteGameWs: `[UNTRANSLATED] Note: You may need to reopen any menu you are on for changes to be reflected.`, + general_inventoryUpdateNoteGameWs: `Note : Rouvrir un menu est nécessaire pour voir les changements.`, general_addButton: `Ajouter`, general_setButton: `Définir`, general_none: `Aucun`, @@ -11,7 +11,7 @@ dict = { code_loginFail: `Connexion échouée. Vérifiez le mot de passe.`, code_regFail: `Enregistrement impossible. Compte existant?`, code_changeNameConfirm: `Nouveau nom du compte :`, - code_changeNameRetry: `[UNTRANSLATED] |NAME| is already taken.`, + code_changeNameRetry: `|NAME| est déjà pris.`, code_deleteAccountConfirm: `Supprimer |DISPLAYNAME| (|EMAIL|) ? Cette action est irreversible.`, code_archgun: `Archgun`, code_melee: `Melee`, @@ -32,8 +32,8 @@ dict = { code_renamePrompt: `Nouveau nom :`, code_remove: `Retirer`, code_addItemsConfirm: `Ajouter |COUNT| items à l'inventaire ?`, - 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_addTechProjectsConfirm: `Ajouter |COUNT| recherches au clan ?`, + code_addDecoRecipesConfirm: `Ajouter |COUNT| décorations au clan ?`, code_succRankUp: `Montée de niveau effectuée.`, code_noEquipmentToRankUp: `Aucun équipement à monter de niveau.`, code_succAdded: `Ajouté.`, @@ -66,8 +66,8 @@ dict = { code_pigment: `Pigment`, code_mature: `Maturer pour le combat`, code_unmature: `Régrésser l'âge génétique`, - code_fund: `[UNTRANSLATED] Fund`, - code_funded: `[UNTRANSLATED] Funded`, + code_fund: `Financer`, + code_funded: `Complété`, code_succChange: `Changement effectué.`, code_requiredInvigorationUpgrade: `Augmentation offensive et défensive requises.`, login_description: `Connexion avec les informations de connexion OpenWF.`, @@ -85,8 +85,8 @@ dict = { navbar_cheats: `Cheats`, navbar_import: `Importer`, inventory_addItems: `Ajouter des items`, - inventory_addItemByItemType: `[UNTRANSLATED] Raw`, - inventory_addItemByItemType_warning: `[UNTRANSLATED] Use this feature at your own risk. It may break your inventory, and you will need to remove items manually if something goes wrong.`, + inventory_addItemByItemType: `Brut`, + inventory_addItemByItemType_warning: `Cette fonctionnalité comporte des risques. Il faudra rajouter les items manuellement si l'inventaire est compris.`, inventory_suits: `Warframes`, inventory_longGuns: `Armes principales`, inventory_pistols: `Armes secondaires`, @@ -182,7 +182,7 @@ dict = { cheats_skipTutorial: `Passer le tutoriel`, cheats_skipAllDialogue: `Passer les dialogues`, cheats_unlockAllScans: `Débloquer tous les scans`, - cheats_unlockSuccRelog: `[UNTRANSLATED] Success. Please that you'll need to relog for the client to refresh this.`, + cheats_unlockSuccRelog: `Succès. Une reconnexion est requise pour appliquer les changements.`, cheats_unlockAllMissions: `Débloquer toutes les missions`, cheats_unlockAllMissions_ok: `Succès. Une actualisation de l'inventaire est nécessaire.`, cheats_infiniteCredits: `Crédits infinis`, @@ -218,7 +218,7 @@ dict = { cheats_baroFullyStocked: `Stock de Baro au max`, cheats_syndicateMissionsRepeatable: `Mission syndicat répétables`, cheats_unlockAllProfitTakerStages: `Débloquer toutes les étapes du Preneur de Profit`, - cheats_unlockSuccInventory: `[UNTRANSLATED] Success. Please note that you'll need to resync your inventory, e.g. using the bootstrapper's /sync command, visiting a dojo/relay, or relogging..`, + cheats_unlockSuccInventory: `Succès. Une resynchronisation est nécessaire en tapant "/sync" dans le tchat, en visitant un relais ou en se reconnectant.`, cheats_instantFinishRivenChallenge: `Débloquer le challenge Riven instantanément`, cheats_instantResourceExtractorDrones: `Ressources de drones d'extraction instantannées`, cheats_noResourceExtractorDronesDamage: `Aucun dégâts aux drones d'extraction de resources`, @@ -247,7 +247,7 @@ dict = { cheats_changeSupportedSyndicate: `Allégeance`, cheats_changeButton: `Changer`, cheats_markAllAsRead: `Marquer la boîte de réception comme lue`, - cheats_finishInvasionsInOneMission: `[UNTRANSLATED] Finish Invasions in One Mission`, + cheats_finishInvasionsInOneMission: `Compléter les invasions en une mission.`, worldState: `Carte Solaire`, worldState_creditBoost: `Booster de Crédit`, @@ -257,30 +257,30 @@ dict = { worldState_baroTennoConRelay: `Relais Baro TennoCon`, worldState_starDays: `Jours Stellaires`, worldState_galleonOfGhouls: `Galion des Goules`, - worldState_anniversary: `[UNTRANSLATED] Warframe Anniversary`, - worldState_useAnniversaryTagForOldGoals: `[UNTRANSLATED] Use Tag from Warframe Anniversary for old Events`, + worldState_anniversary: `Anniversaire de Warframe`, + worldState_useAnniversaryTagForOldGoals: `Utiliser Tag de l'Anniversaire de Warframe pour les anciens événements`, worldState_ghoulEmergence: `Purge des Goules`, worldState_plagueStar: `Fléau Céleste`, worldState_dogDays: `Bataille d'Eau`, - worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`, + worldState_dogDaysRewards: `Récompenses de la Bataille d'Eau`, worldState_wolfHunt: `Chasse au Loup (2025)`, worldState_orphixVenom: `Venin Orphix`, worldState_longShadow: `La Propagation des Ombres`, worldState_hallowedFlame: `Flamme Hantée`, worldState_hallowedNightmares: `Cauchemars Hantés`, - worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`, + worldState_hallowedNightmaresRewards: `Récompenses Flamme Hantée Cauchemar`, worldState_proxyRebellion: `Rébellion Proxy`, - worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`, + worldState_proxyRebellionRewards: `Récompenses Rébellion Proxy`, worldState_bellyOfTheBeast: `Ventre de la Bête`, - worldState_bellyOfTheBeastProgressOverride: `[UNTRANSLATED] Belly of the Beast Progress`, + worldState_bellyOfTheBeastProgressOverride: `Progrès du Ventre de la Bête`, worldState_eightClaw: `Huitième Griffe`, - worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`, + worldState_eightClawProgressOverride: `Progrès de la Huitième Griffe`, worldState_thermiaFractures: `Crevasses Thermia`, - worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`, - worldState_from_year: `[UNTRANSLATED] from |VAL|`, - worldState_pre_year: `[UNTRANSLATED] pre |VAL|`, - worldState_week: `[UNTRANSLATED] Week |VAL|`, - worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`, + worldState_thermiaFracturesProgressOverride: `Progrès des Fractures Thermia`, + worldState_from_year: `de |VAL|`, + worldState_pre_year: `pre-|VAL|`, + worldState_week: `Semaine |VAL|`, + worldState_incompatibleWith: `Incompatible avec :`, enabled: `Activé`, disabled: `Désactivé`, worldState_we1: `Weekend 1`, @@ -324,8 +324,8 @@ dict = { worldState_varziaFullyStocked: `Stock de Varzia au max`, worldState_varziaOverride: `Rotation de Varzia`, - import_importNote: `[UNTRANSLATED] You can provide a full or partial inventory.php or getShip.php response (client representation) here.`, - import_importNote2: `[UNTRANSLATED] All fields that are supported by the importer will be overwritten in your account.`, + import_importNote: `Une réponse partielle ou complète de inventory.php ou getShip.php peut être incluse ici.`, + import_importNote2: `Tous les champs sont supportés par l'outil d'import serront écrasés sur le compte.`, import_submit: `Soumettre`, import_samples: `Échantillons :`, import_samples_maxFocus: `Toutes les écoles de focus au rang max`, @@ -394,7 +394,7 @@ dict = { guildView_cheats: `[UNTRANSLATED] Clan Cheats`, guildView_techProjects: `Recherche`, - guildView_vaultDecoRecipes: `[UNTRANSLATED] Dojo Deco Recipes`, + guildView_vaultDecoRecipes: `Schémas de décorations de dojo`, guildView_alliance: `Alliance`, guildView_members: `Members`, guildView_pending: `En Attente`, @@ -414,11 +414,11 @@ dict = { guildView_rank_soldier: `Soldat`, guildView_rank_utility: `Utilitaire`, guildView_rank_warlord: `Seigneur de guerre`, - guildView_currency_owned: `[UNTRANSLATED] |COUNT| in Vault.`, - guildView_bulkAddTechProjects: `[UNTRANSLATED] Add Missing Research`, - guildView_bulkAddVaultDecoRecipes: `[UNTRANSLATED] Add Missing Dojo Deco Recipes`, - guildView_bulkFundTechProjects: `[UNTRANSLATED] Fund All Research`, - guildView_bulkCompleteTechProjects: `[UNTRANSLATED] Complete All Research`, + guildView_currency_owned: `|COUNT| dans le coffre.`, + guildView_bulkAddTechProjects: `Ajouter les recherches manquantes`, + guildView_bulkAddVaultDecoRecipes: `Ajouter les schémas de décorations de dojo manquantes`, + guildView_bulkFundTechProjects: `Financer toutes les recherches`, + guildView_bulkCompleteTechProjects: `Compléter toutes les recherches`, guildView_promote: `Promouvoir`, guildView_demote: `Rétrograder`,