merge upstream

This commit is contained in:
BanLanGen 2025-08-22 12:03:25 -07:00
commit 2530dd2c5b
21 changed files with 306 additions and 104 deletions

View File

@ -86,6 +86,8 @@
"bellyOfTheBeastProgressOverride": 0, "bellyOfTheBeastProgressOverride": 0,
"eightClaw": false, "eightClaw": false,
"eightClawProgressOverride": 0, "eightClawProgressOverride": 0,
"thermiaFracturesOverride": null,
"thermiaFracturesProgressOverride": 0,
"eidolonOverride": "", "eidolonOverride": "",
"vallisOverride": "", "vallisOverride": "",
"duviriOverride": "", "duviriOverride": "",

8
package-lock.json generated
View File

@ -23,7 +23,7 @@
"ncp": "^2.0.0", "ncp": "^2.0.0",
"typescript": "^5.5", "typescript": "^5.5",
"undici": "^7.10.0", "undici": "^7.10.0",
"warframe-public-export-plus": "^0.5.81", "warframe-public-export-plus": "^0.5.82",
"warframe-riven-info": "^0.1.2", "warframe-riven-info": "^0.1.2",
"winston": "^3.17.0", "winston": "^3.17.0",
"winston-daily-rotate-file": "^5.0.0", "winston-daily-rotate-file": "^5.0.0",
@ -5507,9 +5507,9 @@
} }
}, },
"node_modules/warframe-public-export-plus": { "node_modules/warframe-public-export-plus": {
"version": "0.5.81", "version": "0.5.82",
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.81.tgz", "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.82.tgz",
"integrity": "sha512-kh3e21XThVDSwdC3TJsMsXZnlZ4B/21HdeJkKcjuTygpCd842EPEKS3lRZl3mpXFOmdha744vAW1XEyHfiLofg==" "integrity": "sha512-hZa9KpMDA2wy0Hn03y9Nfyzbjxer1I6Rvb52b363uzrqS0cvDO56rhiDo71JbraeV34qF6yo+Vca1zwFmw2srA=="
}, },
"node_modules/warframe-riven-info": { "node_modules/warframe-riven-info": {
"version": "0.1.2", "version": "0.1.2",

View File

@ -40,7 +40,7 @@
"ncp": "^2.0.0", "ncp": "^2.0.0",
"typescript": "^5.5", "typescript": "^5.5",
"undici": "^7.10.0", "undici": "^7.10.0",
"warframe-public-export-plus": "^0.5.81", "warframe-public-export-plus": "^0.5.82",
"warframe-riven-info": "^0.1.2", "warframe-riven-info": "^0.1.2",
"winston": "^3.17.0", "winston": "^3.17.0",
"winston-daily-rotate-file": "^5.0.0", "winston-daily-rotate-file": "^5.0.0",

View File

@ -1,6 +1,6 @@
import { toMongoDate } from "@/src/helpers/inventoryHelpers"; import { toMongoDate } from "@/src/helpers/inventoryHelpers";
import { getJSONfromString } from "@/src/helpers/stringHelpers"; import { getJSONfromString } from "@/src/helpers/stringHelpers";
import { getInventory } from "@/src/services/inventoryService"; import { getInventory, updateEntratiVault } from "@/src/services/inventoryService";
import { getAccountIdForRequest } from "@/src/services/loginService"; import { getAccountIdForRequest } from "@/src/services/loginService";
import { RequestHandler } from "express"; import { RequestHandler } from "express";
@ -11,26 +11,7 @@ export const entratiLabConquestModeController: RequestHandler = async (req, res)
"EntratiVaultCountResetDate EntratiVaultCountLastPeriod EntratiLabConquestUnlocked EchoesHexConquestUnlocked EchoesHexConquestActiveFrameVariants EchoesHexConquestActiveStickers EntratiLabConquestActiveFrameVariants EntratiLabConquestCacheScoreMission EchoesHexConquestCacheScoreMission" "EntratiVaultCountResetDate EntratiVaultCountLastPeriod EntratiLabConquestUnlocked EchoesHexConquestUnlocked EchoesHexConquestActiveFrameVariants EchoesHexConquestActiveStickers EntratiLabConquestActiveFrameVariants EntratiLabConquestCacheScoreMission EchoesHexConquestCacheScoreMission"
); );
const body = getJSONfromString<IEntratiLabConquestModeRequest>(String(req.body)); const body = getJSONfromString<IEntratiLabConquestModeRequest>(String(req.body));
if (!inventory.EntratiVaultCountResetDate || Date.now() >= inventory.EntratiVaultCountResetDate.getTime()) { updateEntratiVault(inventory);
const EPOCH = 1734307200 * 1000; // Mondays, amirite?
const day = Math.trunc((Date.now() - EPOCH) / 86400000);
const week = Math.trunc(day / 7);
const weekStart = EPOCH + week * 604800000;
const weekEnd = weekStart + 604800000;
inventory.EntratiVaultCountLastPeriod = 0;
inventory.EntratiVaultCountResetDate = new Date(weekEnd);
if (inventory.EntratiLabConquestUnlocked) {
inventory.EntratiLabConquestUnlocked = 0;
inventory.EntratiLabConquestCacheScoreMission = 0;
inventory.EntratiLabConquestActiveFrameVariants = [];
}
if (inventory.EchoesHexConquestUnlocked) {
inventory.EchoesHexConquestUnlocked = 0;
inventory.EchoesHexConquestCacheScoreMission = 0;
inventory.EchoesHexConquestActiveFrameVariants = [];
inventory.EchoesHexConquestActiveStickers = [];
}
}
if (body.BuyMode) { if (body.BuyMode) {
inventory.EntratiVaultCountLastPeriod! += 2; inventory.EntratiVaultCountLastPeriod! += 2;
if (body.IsEchoesDeepArchemedea) { if (body.IsEchoesDeepArchemedea) {
@ -51,7 +32,7 @@ export const entratiLabConquestModeController: RequestHandler = async (req, res)
} }
await inventory.save(); await inventory.save();
res.json({ res.json({
EntratiVaultCountResetDate: toMongoDate(inventory.EntratiVaultCountResetDate), EntratiVaultCountResetDate: toMongoDate(inventory.EntratiVaultCountResetDate!),
EntratiVaultCountLastPeriod: inventory.EntratiVaultCountLastPeriod, EntratiVaultCountLastPeriod: inventory.EntratiVaultCountLastPeriod,
EntratiLabConquestUnlocked: inventory.EntratiLabConquestUnlocked, EntratiLabConquestUnlocked: inventory.EntratiLabConquestUnlocked,
EntratiLabConquestCacheScoreMission: inventory.EntratiLabConquestCacheScoreMission, EntratiLabConquestCacheScoreMission: inventory.EntratiLabConquestCacheScoreMission,

View File

@ -20,8 +20,6 @@ export const saveDialogueController: RequestHandler = async (req, res) => {
const tomorrowAt0Utc = config.noKimCooldowns const tomorrowAt0Utc = config.noKimCooldowns
? Date.now() ? Date.now()
: (Math.trunc(Date.now() / 86400_000) + 1) * 86400_000; : (Math.trunc(Date.now() / 86400_000) + 1) * 86400_000;
inventory.DialogueHistory ??= {};
inventory.DialogueHistory.Dialogues ??= [];
const dialogue = getDialogue(inventory, request.DialogueName); const dialogue = getDialogue(inventory, request.DialogueName);
dialogue.Rank = request.Rank; dialogue.Rank = request.Rank;
dialogue.Chemistry += request.Chemistry; dialogue.Chemistry += request.Chemistry;

View File

@ -35,6 +35,7 @@ export const completeAllMissionsController: RequestHandler = async (req, res) =>
await handleStoreItemAcquisition(reward.StoreItem, inventory, reward.ItemCount, undefined, true); await handleStoreItemAcquisition(reward.StoreItem, inventory, reward.ItemCount, undefined, true);
} }
addString(inventory.NodeIntrosCompleted, "TeshinHardModeUnlocked"); addString(inventory.NodeIntrosCompleted, "TeshinHardModeUnlocked");
addString(inventory.NodeIntrosCompleted, "CetusSyndicate_IntroJob");
await inventory.save(); await inventory.save();
res.end(); res.end();
}; };

View File

@ -98,6 +98,8 @@ export interface IConfig {
bellyOfTheBeastProgressOverride?: number; bellyOfTheBeastProgressOverride?: number;
eightClaw?: boolean; eightClaw?: boolean;
eightClawProgressOverride?: number; eightClawProgressOverride?: number;
thermiaFracturesOverride?: boolean;
thermiaFracturesProgressOverride?: number;
eidolonOverride?: string; eidolonOverride?: string;
vallisOverride?: string; vallisOverride?: string;
duviriOverride?: string; duviriOverride?: string;

View File

@ -444,7 +444,7 @@ export const importLoadOutPresets = (db: ILoadoutDatabase, client: ILoadOutPrese
db.NORMAL_PVP = client.NORMAL_PVP.map(convertLoadOutConfig); db.NORMAL_PVP = client.NORMAL_PVP.map(convertLoadOutConfig);
db.LUNARO = client.LUNARO.map(convertLoadOutConfig); db.LUNARO = client.LUNARO.map(convertLoadOutConfig);
db.OPERATOR = client.OPERATOR.map(convertLoadOutConfig); db.OPERATOR = client.OPERATOR.map(convertLoadOutConfig);
db.GEAR = client.GEAR.map(convertLoadOutConfig); db.GEAR = client.GEAR?.map(convertLoadOutConfig);
db.KDRIVE = client.KDRIVE.map(convertLoadOutConfig); db.KDRIVE = client.KDRIVE.map(convertLoadOutConfig);
db.DATAKNIFE = client.DATAKNIFE.map(convertLoadOutConfig); db.DATAKNIFE = client.DATAKNIFE.map(convertLoadOutConfig);
db.MECH = client.MECH.map(convertLoadOutConfig); db.MECH = client.MECH.map(convertLoadOutConfig);

View File

@ -2286,11 +2286,13 @@ export const cleanupInventory = (inventory: TInventoryDatabaseDocument): void =>
}; };
export const getDialogue = (inventory: TInventoryDatabaseDocument, dialogueName: string): IDialogueDatabase => { export const getDialogue = (inventory: TInventoryDatabaseDocument, dialogueName: string): IDialogueDatabase => {
let dialogue = inventory.DialogueHistory!.Dialogues!.find(x => x.DialogueName == dialogueName); inventory.DialogueHistory ??= {};
inventory.DialogueHistory.Dialogues ??= [];
let dialogue = inventory.DialogueHistory.Dialogues.find(x => x.DialogueName == dialogueName);
if (!dialogue) { if (!dialogue) {
dialogue = dialogue =
inventory.DialogueHistory!.Dialogues![ inventory.DialogueHistory.Dialogues[
inventory.DialogueHistory!.Dialogues!.push({ inventory.DialogueHistory.Dialogues.push({
Rank: 0, Rank: 0,
Chemistry: 0, Chemistry: 0,
AvailableDate: new Date(0), AvailableDate: new Date(0),
@ -2449,3 +2451,26 @@ export const giveNemesisPetRecipe = (
export const getEffectiveAvatarImageType = (inventory: TInventoryDatabaseDocument): string => { export const getEffectiveAvatarImageType = (inventory: TInventoryDatabaseDocument): string => {
return inventory.ActiveAvatarImageType ?? "/Lotus/Types/StoreItems/AvatarImages/AvatarImageDefault"; return inventory.ActiveAvatarImageType ?? "/Lotus/Types/StoreItems/AvatarImages/AvatarImageDefault";
}; };
export const updateEntratiVault = (inventory: TInventoryDatabaseDocument): void => {
if (!inventory.EntratiVaultCountResetDate || Date.now() >= inventory.EntratiVaultCountResetDate.getTime()) {
const EPOCH = 1734307200 * 1000; // Mondays, amirite?
const day = Math.trunc((Date.now() - EPOCH) / 86400000);
const week = Math.trunc(day / 7);
const weekStart = EPOCH + week * 604800000;
const weekEnd = weekStart + 604800000;
inventory.EntratiVaultCountLastPeriod = 0;
inventory.EntratiVaultCountResetDate = new Date(weekEnd);
if (inventory.EntratiLabConquestUnlocked) {
inventory.EntratiLabConquestUnlocked = 0;
inventory.EntratiLabConquestCacheScoreMission = 0;
inventory.EntratiLabConquestActiveFrameVariants = [];
}
if (inventory.EchoesHexConquestUnlocked) {
inventory.EchoesHexConquestUnlocked = 0;
inventory.EchoesHexConquestCacheScoreMission = 0;
inventory.EchoesHexConquestActiveFrameVariants = [];
inventory.EchoesHexConquestActiveStickers = [];
}
}
};

View File

@ -39,6 +39,7 @@ import {
giveNemesisPetRecipe, giveNemesisPetRecipe,
giveNemesisWeaponRecipe, giveNemesisWeaponRecipe,
updateCurrency, updateCurrency,
updateEntratiVault,
updateSyndicate updateSyndicate
} from "@/src/services/inventoryService"; } from "@/src/services/inventoryService";
import { updateQuestKey } from "@/src/services/questService"; import { updateQuestKey } from "@/src/services/questService";
@ -640,7 +641,7 @@ export const addMissionInventoryUpdates = async (
} }
const currentNode = inventoryUpdates.RewardInfo!.node; const currentNode = inventoryUpdates.RewardInfo!.node;
let currentMissionKey; let currentMissionKey: string | undefined;
if (currentNode == goal.Node) { if (currentNode == goal.Node) {
currentMissionKey = goal.MissionKeyName; currentMissionKey = goal.MissionKeyName;
} else if (goal.ConcurrentNodes && goal.ConcurrentMissionKeyNames) { } else if (goal.ConcurrentNodes && goal.ConcurrentMissionKeyNames) {
@ -651,15 +652,15 @@ export const addMissionInventoryUpdates = async (
} }
} }
} }
if (currentMissionKey && currentMissionKey in goalMessagesByKey) { const rewards = [];
let countBeforeUpload = goalProgress?.Count ?? 0; let countBeforeUpload = goalProgress?.Count ?? 0;
let totalCount = countBeforeUpload + uploadProgress.Count; let totalCount = countBeforeUpload + uploadProgress.Count;
if (goal.Best) { if (goal.Best) {
countBeforeUpload = goalProgress?.Best ?? 0; countBeforeUpload = goalProgress?.Best ?? 0;
totalCount = uploadProgress.Best; totalCount = uploadProgress.Best;
} }
let reward;
{
if (goal.InterimGoals && goal.InterimRewards) { if (goal.InterimGoals && goal.InterimRewards) {
for (let i = 0; i < goal.InterimGoals.length; i++) { for (let i = 0; i < goal.InterimGoals.length; i++) {
if ( if (
@ -668,70 +669,95 @@ export const addMissionInventoryUpdates = async (
(!goalProgress || countBeforeUpload < goal.InterimGoals[i]) && (!goalProgress || countBeforeUpload < goal.InterimGoals[i]) &&
goal.InterimRewards[i] goal.InterimRewards[i]
) { ) {
reward = goal.InterimRewards[i]; rewards.push(goal.InterimRewards[i]);
break; break;
} }
} }
} }
if ( if (
!reward &&
goal.Goal && goal.Goal &&
goal.Goal <= totalCount && goal.Goal <= totalCount &&
(!goalProgress || countBeforeUpload < goal.Goal) && (!goalProgress || countBeforeUpload < goal.Goal) &&
goal.Reward goal.Reward
) { ) {
reward = goal.Reward; rewards.push(goal.Reward);
} }
if ( if (
!reward &&
goal.BonusGoal && goal.BonusGoal &&
goal.BonusGoal <= totalCount && goal.BonusGoal <= totalCount &&
(!goalProgress || countBeforeUpload < goal.BonusGoal) && (!goalProgress || countBeforeUpload < goal.BonusGoal) &&
goal.BonusReward goal.BonusReward
) { ) {
reward = goal.BonusReward; rewards.push(goal.BonusReward);
}
if (reward) {
if (currentMissionKey in goalMessagesByKey) {
// Send reward via inbox
const info = goalMessagesByKey[currentMissionKey];
const message: IMessageCreationTemplate = {
sndr: info.sndr,
msg: info.msg,
sub: info.sub,
icon: info.icon,
highPriority: true
};
if (reward.items) {
message.att = reward.items.map(x => (isStoreItem(x) ? fromStoreItem(x) : x));
}
if (reward.countedItems) {
message.countedAtt = reward.countedItems;
}
if (reward.credits) {
message.RegularCredits = reward.credits;
}
if (info.arg) {
const args: Record<string, string | number> = {
PLAYER_NAME: account.DisplayName,
CREDIT_REWARD: reward.credits ?? 0
};
info.arg.forEach(key => {
const value = args[key];
if (value) {
message.arg ??= [];
message.arg.push({ Key: key, Tag: value });
}
});
}
await createMessage(inventory.accountOwnerId, [message]);
}
} }
} }
const messages: IMessageCreationTemplate[] = [];
const infos: {
sndr: string;
msg: string;
sub: string;
icon: string;
arg?: string[];
}[] = [];
{
if (currentMissionKey && currentMissionKey in goalMessagesByKey) {
infos.push(goalMessagesByKey[currentMissionKey]);
} else if (goal.Tag in goalMessagesByTag) {
const combinedGoals = [...(goal.InterimGoals || []), goal.Goal, goal.BonusGoal];
combinedGoals.forEach((n, i) => {
if (n !== undefined && n > countBeforeUpload && n <= totalCount) {
infos.push(goalMessagesByTag[goal.Tag][i]);
}
});
}
}
for (let i = 0; i < rewards.length; i++) {
if (infos[i]) {
const info = infos[i];
const reward = rewards[i];
const message: IMessageCreationTemplate = {
sndr: info.sndr,
msg: info.msg,
sub: info.sub,
icon: info.icon,
highPriority: true
};
if (reward.items) {
message.att = reward.items.map(x => (isStoreItem(x) ? fromStoreItem(x) : x));
}
if (reward.countedItems) {
message.countedAtt = reward.countedItems;
}
if (reward.credits) {
message.RegularCredits = reward.credits;
}
if (info.arg) {
const args: Record<string, string | number> = {
PLAYER_NAME: account.DisplayName,
CREDIT_REWARD: reward.credits ?? 0
};
for (let j = 0; j < info.arg.length; j++) {
const key = info.arg[j];
const value = args[key];
if (value) {
message.arg ??= [];
message.arg.push({
Key: key,
Tag: value
});
}
}
}
messages.push(message);
}
}
if (messages.length > 0) await createMessage(inventory.accountOwnerId, messages);
if (goalProgress) { if (goalProgress) {
goalProgress.Best = Math.max(goalProgress.Best!, uploadProgress.Best); goalProgress.Best = Math.max(goalProgress.Best!, uploadProgress.Best);
goalProgress.Count += uploadProgress.Count; goalProgress.Count += uploadProgress.Count;
@ -1059,6 +1085,22 @@ const droptableAliases: Record<string, string> = {
"/Lotus/Types/DropTables/WF1999DropTables/LasrianTankHardModeDropTable" "/Lotus/Types/DropTables/WF1999DropTables/LasrianTankHardModeDropTable"
}; };
const isEligibleForCreditReward = (rewardInfo: IRewardInfo, missions: IMission, node: IRegion): boolean => {
// (E)SO should not give credits for only completing zone 1, in which case it has no rewardQualifications (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/1823)
if (getRotations(rewardInfo).length == 0) {
return missions.Tag == "SolNode720"; // Netracells don't use rewardQualifications but probably should give credits anyway
}
// The rest here might not be needed anymore, but just to be sure we don't give undue credits...
return (
node.missionIndex != 23 && // junction
node.missionIndex != 28 && // open world
missions.Tag != "SolNode761" && // the index
missions.Tag != "SolNode762" && // the index
missions.Tag != "SolNode763" && // the index
missions.Tag != "CrewBattleNode556" // free flight
);
};
//TODO: return type of partial missioninventoryupdate response //TODO: return type of partial missioninventoryupdate response
export const addMissionRewards = async ( export const addMissionRewards = async (
account: TAccountDocument, account: TAccountDocument,
@ -1151,15 +1193,7 @@ export const addMissionRewards = async (
const node = ExportRegions[missions.Tag]; const node = ExportRegions[missions.Tag];
//node based credit rewards for mission completion //node based credit rewards for mission completion
if ( if (isEligibleForCreditReward(rewardInfo, missions, node)) {
node.missionIndex != 23 && // junction
node.missionIndex != 28 && // open world
missions.Tag != "SolNode761" && // the index
missions.Tag != "SolNode762" && // the index
missions.Tag != "SolNode763" && // the index
missions.Tag != "CrewBattleNode556" && // free flight
getRotations(rewardInfo).length > 0 // (E)SO should not give credits for only completing zone 1, in which case it has no rewardQualifications (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/1823)
) {
const levelCreditReward = getLevelCreditRewards(node); const levelCreditReward = getLevelCreditRewards(node);
missionCompletionCredits += levelCreditReward; missionCompletionCredits += levelCreditReward;
logger.debug(`levelCreditReward ${levelCreditReward}`); logger.debug(`levelCreditReward ${levelCreditReward}`);
@ -1189,6 +1223,12 @@ export const addMissionRewards = async (
} }
]); ]);
} }
// Consume netracells search pulse. Moved here to only cover successful completions. Discussed in https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2673
if (missions.Tag == "SolNode720") {
updateEntratiVault(inventory);
inventory.EntratiVaultCountLastPeriod! += 1;
}
} }
if (rewardInfo.useVaultManifest) { if (rewardInfo.useVaultManifest) {
@ -1352,7 +1392,7 @@ export const addMissionRewards = async (
} }
} }
} else { } else {
logger.error(`unknown droptable ${si.DropTable} for DROP_BLUEPRINT`); logger.error(`unknown droptable ${si.DropTable} for DROP_MISC_ITEM`);
} }
} }
} }
@ -2617,3 +2657,38 @@ const goalMessagesByKey: Record<string, { sndr: string; msg: string; sub: string
arg: ["PLAYER_NAME"] arg: ["PLAYER_NAME"]
} }
}; };
const goalMessagesByTag: Record<string, { sndr: string; msg: string; sub: string; icon: string; arg?: string[] }[]> = {
HeatFissure: [
{
sndr: "/Lotus/Language/Npcs/Eudico",
msg: "/Lotus/Language/Messages/OrbHeistEventRewardAInboxMessageBody",
sub: "/Lotus/Language/Messages/OrbHeistEventRewardAInboxMessageTitle",
icon: "/Lotus/Interface/Icons/Npcs/Eudico.png"
},
{
sndr: "/Lotus/Language/Npcs/Eudico",
msg: "/Lotus/Language/Messages/OrbHeistEventRewardBInboxMessageBody",
sub: "/Lotus/Language/Messages/OrbHeistEventRewardBInboxMessageTitle",
icon: "/Lotus/Interface/Icons/Npcs/Eudico.png"
},
{
sndr: "/Lotus/Language/Npcs/Eudico",
msg: "/Lotus/Language/Messages/OrbHeistEventRewardCInboxMessageBody",
sub: "/Lotus/Language/Messages/OrbHeistEventRewardCInboxMessageTitle",
icon: "/Lotus/Interface/Icons/Npcs/Eudico.png"
},
{
sndr: "/Lotus/Language/Npcs/Eudico",
msg: "/Lotus/Language/Messages/OrbHeistEventRewardDInboxMessageBody",
sub: "/Lotus/Language/Messages/OrbHeistEventRewardDInboxMessageTitle",
icon: "/Lotus/Interface/Icons/Npcs/Eudico.png"
},
{
sndr: "/Lotus/Language/Npcs/Eudico",
msg: "/Lotus/Language/Messages/OrbHeistEventRewardEInboxMessageBody",
sub: "/Lotus/Language/Messages/OrbHeistEventRewardEInboxMessageTitle",
icon: "/Lotus/Interface/Icons/Npcs/Eudico.png"
}
]
};

View File

@ -2629,6 +2629,87 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
); );
} }
const thermiaFracturesCycleDay = day % 32;
const isThermiaFracturesActive = thermiaFracturesCycleDay < 14;
if (config.worldState?.thermiaFracturesOverride ?? isThermiaFracturesActive) {
const activeStartDay = day - thermiaFracturesCycleDay;
const count = config.worldState?.thermiaFracturesProgressOverride ?? 0;
const activation = config.worldState?.thermiaFracturesOverride ? 1740416400000 : getSortieTime(activeStartDay);
const expiry = config.worldState?.thermiaFracturesOverride ? 2000000000000 : getSortieTime(activeStartDay + 14);
worldState.Goals.push({
_id: { $oid: "5c7cb0d00000000000000000" },
Activation: { $date: { $numberLong: activation.toString() } },
Expiry: { $date: { $numberLong: expiry.toString() } },
Node: "SolNode129",
ScoreVar: "FissuresClosed",
ScoreLocTag: "/Lotus/Language/G1Quests/HeatFissuresEventScore",
Count: count,
HealthPct: count / 100,
Regions: [1],
Desc: "/Lotus/Language/G1Quests/HeatFissuresEventName",
ToolTip: "/Lotus/Language/G1Quests/HeatFissuresEventDesc",
OptionalInMission: true,
Tag: "HeatFissure",
UpgradeIds: [{ $oid: "5c81cefa4c4566791728eaa7" }, { $oid: "5c81cefa4c4566791728eaa6" }],
Personal: true,
Community: true,
Goal: 100,
Reward: {
items: ["/Lotus/StoreItems/Weapons/Corpus/LongGuns/CrpBFG/Vandal/VandalCrpBFG"]
},
InterimGoals: [5, 25, 50, 75],
InterimRewards: [
{ items: ["/Lotus/StoreItems/Upgrades/Skins/Clan/OrbBadgeItem"] },
{
items: [
"/Lotus/StoreItems/Upgrades/Mods/DualSource/Shotgun/ShotgunMedicMod",
"/Lotus/StoreItems/Upgrades/Mods/DualSource/Rifle/SerratedRushMod"
]
},
{
items: [
"/Lotus/StoreItems/Upgrades/Mods/DualSource/Pistol/MultishotDodgeMod",
"/Lotus/StoreItems/Upgrades/Mods/DualSource/Melee/CritDamageChargeSpeedMod"
]
},
{ items: ["/Lotus/StoreItems/Upgrades/Skins/Sigils/OrbSigil"] }
]
});
worldState.NodeOverrides.push({
_id: { $oid: "5c7cb0d00000000000000000" },
Activation: { $date: { $numberLong: activation.toString() } },
Expiry: { $date: { $numberLong: expiry.toString() } },
Node: "SolNode129",
Faction: "FC_CORPUS",
CustomNpcEncounters: ["/Lotus/Types/Gameplay/Venus/Encounters/Heists/ExploiterHeistFissure"]
});
if (count >= 35) {
worldState.GlobalUpgrades.push({
_id: { $oid: "5c81cefa4c4566791728eaa6" },
Activation: { $date: { $numberLong: activation.toString() } },
ExpiryDate: { $date: { $numberLong: expiry.toString() } },
UpgradeType: "GAMEPLAY_MONEY_REWARD_AMOUNT",
OperationType: "MULTIPLY",
Value: 2,
Nodes: ["SolNode129"]
});
}
// Not sure about that
if (count == 100) {
worldState.GlobalUpgrades.push({
_id: { $oid: "5c81cefa4c4566791728eaa7" },
Activation: { $date: { $numberLong: activation.toString() } },
ExpiryDate: { $date: { $numberLong: expiry.toString() } },
UpgradeType: "GAMEPLAY_PICKUP_AMOUNT",
OperationType: "MULTIPLY",
Value: 2,
Nodes: ["SolNode129"]
});
}
}
// Nightwave Challenges // Nightwave Challenges
const nightwaveSyndicateTag = getNightwaveSyndicateTag(buildLabel); const nightwaveSyndicateTag = getNightwaveSyndicateTag(buildLabel);
if (nightwaveSyndicateTag) { if (nightwaveSyndicateTag) {
@ -2727,7 +2808,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
: Date.UTC( : Date.UTC(
date.getUTCFullYear(), date.getUTCFullYear(),
date.getUTCMonth(), date.getUTCMonth(),
date.getUTCDate() + (day - ghoulsCycleDay + 17) date.getUTCDate() + activeStartDay
).toString() ).toString()
} }
}, },
@ -2738,7 +2819,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
: Date.UTC( : Date.UTC(
date.getUTCFullYear(), date.getUTCFullYear(),
date.getUTCMonth(), date.getUTCMonth(),
date.getUTCDate() + (day - ghoulsCycleDay + 21) date.getUTCDate() + activeEndDay
).toString() ).toString()
} }
}, },

View File

@ -79,7 +79,7 @@ export interface ILoadoutDatabase {
NORMAL_PVP: ILoadoutConfigDatabase[]; NORMAL_PVP: ILoadoutConfigDatabase[];
LUNARO: ILoadoutConfigDatabase[]; LUNARO: ILoadoutConfigDatabase[];
OPERATOR: ILoadoutConfigDatabase[]; OPERATOR: ILoadoutConfigDatabase[];
GEAR: ILoadoutConfigDatabase[]; GEAR?: ILoadoutConfigDatabase[];
KDRIVE: ILoadoutConfigDatabase[]; KDRIVE: ILoadoutConfigDatabase[];
DATAKNIFE: ILoadoutConfigDatabase[]; DATAKNIFE: ILoadoutConfigDatabase[];
MECH: ILoadoutConfigDatabase[]; MECH: ILoadoutConfigDatabase[];
@ -96,7 +96,7 @@ export interface ILoadOutPresets {
ARCHWING: ILoadoutConfigClient[]; ARCHWING: ILoadoutConfigClient[];
SENTINEL: ILoadoutConfigClient[]; SENTINEL: ILoadoutConfigClient[];
OPERATOR: ILoadoutConfigClient[]; OPERATOR: ILoadoutConfigClient[];
GEAR: ILoadoutConfigClient[]; GEAR?: ILoadoutConfigClient[];
KDRIVE: ILoadoutConfigClient[]; KDRIVE: ILoadoutConfigClient[];
DATAKNIFE: ILoadoutConfigClient[]; DATAKNIFE: ILoadoutConfigClient[];
MECH: ILoadoutConfigClient[]; MECH: ILoadoutConfigClient[];

View File

@ -43,7 +43,7 @@ export interface IGoal {
Count?: number; Count?: number;
HealthPct?: number; HealthPct?: number;
Icon: string; Icon?: string;
Desc: string; Desc: string;
ToolTip?: string; ToolTip?: string;
Faction?: string; Faction?: string;
@ -94,6 +94,9 @@ export interface IGoal {
MissionKeyRotation?: string[]; MissionKeyRotation?: string[];
MissionKeyRotationInterval?: number; MissionKeyRotationInterval?: number;
OptionalInMission?: boolean;
UpgradeIds?: IOid[];
NightLevel?: string; NightLevel?: string;
} }
@ -128,8 +131,9 @@ export interface IGlobalUpgrade {
UpgradeType: string; UpgradeType: string;
OperationType: string; OperationType: string;
Value: number; Value: number;
LocalizeTag: string; LocalizeTag?: string;
LocalizeDescTag: string; LocalizeDescTag?: string;
Nodes?: string[];
} }
export interface IInvasion { export interface IInvasion {
@ -183,7 +187,7 @@ export interface INodeOverride {
Seed?: number; Seed?: number;
LevelOverride?: string; LevelOverride?: string;
Faction?: string; Faction?: string;
CustomNpcEncounters?: string; CustomNpcEncounters?: string[];
} }
export interface ISortie { export interface ISortie {

View File

@ -1103,6 +1103,25 @@
</form> </form>
</div> </div>
</div> </div>
<div class="form-group mt-2 d-flex gap-2">
<div class="flex-fill">
<label class="form-label" for="worldState.thermiaFracturesOverride" data-loc="worldState_thermiaFractures"></label>
<select class="form-control" id="worldState.thermiaFracturesOverride" data-default="null">
<option value="null" data-loc="normal"></option>
<option value="true" data-loc="enabled"></option>
<option value="false" data-loc="disabled"></option>
</select>
</div>
<div class="flex-fill">
<form class="form-group" onsubmit="doSaveConfigInt('worldState.thermiaFracturesProgressOverride'); return false;">
<label class="form-label" for="worldState.thermiaFracturesProgressOverride" data-loc="worldState_thermiaFracturesProgressOverride"></label>
<div class="input-group">
<input id="worldState.thermiaFracturesProgressOverride" class="form-control" type="number" min="0" max="100" data-default="0" />
<button class="btn btn-secondary" type="submit" data-loc="cheats_save"></button>
</div>
</form>
</div>
</div>
<div class="form-group mt-2"> <div class="form-group mt-2">
<label class="form-label" for="worldState.eidolonOverride" data-loc="worldState_eidolonOverride"></label> <label class="form-label" for="worldState.eidolonOverride" data-loc="worldState_eidolonOverride"></label>
<select class="form-control" id="worldState.eidolonOverride" data-default=""> <select class="form-control" id="worldState.eidolonOverride" data-default="">

View File

@ -265,6 +265,8 @@ dict = {
worldState_bellyOfTheBeastProgressOverride: `[UNTRANSLATED] Belly of the Beast Progress`, worldState_bellyOfTheBeastProgressOverride: `[UNTRANSLATED] Belly of the Beast Progress`,
worldState_eightClaw: `Acht Klauen`, worldState_eightClaw: `Acht Klauen`,
worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`, worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`,
worldState_thermiaFractures: `Thermische Risse`,
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
worldState_from_year: `[UNTRANSLATED] from |VAL|`, worldState_from_year: `[UNTRANSLATED] from |VAL|`,
worldState_pre_year: `[UNTRANSLATED] pre |VAL|`, worldState_pre_year: `[UNTRANSLATED] pre |VAL|`,
worldState_week: `[UNTRANSLATED] Week |VAL|`, worldState_week: `[UNTRANSLATED] Week |VAL|`,

View File

@ -264,6 +264,8 @@ dict = {
worldState_bellyOfTheBeastProgressOverride: `Belly of the Beast Progress`, worldState_bellyOfTheBeastProgressOverride: `Belly of the Beast Progress`,
worldState_eightClaw: `Eight Claw`, worldState_eightClaw: `Eight Claw`,
worldState_eightClawProgressOverride: `Eight Claw Progress`, worldState_eightClawProgressOverride: `Eight Claw Progress`,
worldState_thermiaFractures: `Thermia Fractures`,
worldState_thermiaFracturesProgressOverride: `Thermia Fractures Progress`,
worldState_from_year: `from |VAL|`, worldState_from_year: `from |VAL|`,
worldState_pre_year: `pre |VAL|`, worldState_pre_year: `pre |VAL|`,
worldState_week: `Week |VAL|`, worldState_week: `Week |VAL|`,

View File

@ -265,6 +265,8 @@ dict = {
worldState_bellyOfTheBeastProgressOverride: `Progreso del Vientre de la Bestia`, worldState_bellyOfTheBeastProgressOverride: `Progreso del Vientre de la Bestia`,
worldState_eightClaw: `Octava Garra`, worldState_eightClaw: `Octava Garra`,
worldState_eightClawProgressOverride: `Progreso de Octava Garra`, worldState_eightClawProgressOverride: `Progreso de Octava Garra`,
worldState_thermiaFractures: `Fracturas Thermia`,
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
worldState_from_year: `de |VAL|`, worldState_from_year: `de |VAL|`,
worldState_pre_year: `antes de |VAL|`, worldState_pre_year: `antes de |VAL|`,
worldState_week: `Semana |VAL|`, worldState_week: `Semana |VAL|`,

View File

@ -265,6 +265,8 @@ dict = {
worldState_bellyOfTheBeastProgressOverride: `[UNTRANSLATED] Belly of the Beast Progress`, worldState_bellyOfTheBeastProgressOverride: `[UNTRANSLATED] Belly of the Beast Progress`,
worldState_eightClaw: `Huitième Griffe`, worldState_eightClaw: `Huitième Griffe`,
worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`, worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`,
worldState_thermiaFractures: `Crevasses Thermia`,
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
worldState_from_year: `[UNTRANSLATED] from |VAL|`, worldState_from_year: `[UNTRANSLATED] from |VAL|`,
worldState_pre_year: `[UNTRANSLATED] pre |VAL|`, worldState_pre_year: `[UNTRANSLATED] pre |VAL|`,
worldState_week: `[UNTRANSLATED] Week |VAL|`, worldState_week: `[UNTRANSLATED] Week |VAL|`,

View File

@ -265,6 +265,8 @@ dict = {
worldState_bellyOfTheBeastProgressOverride: `Прогресс Чрева зверя`, worldState_bellyOfTheBeastProgressOverride: `Прогресс Чрева зверя`,
worldState_eightClaw: `Восемь когтей`, worldState_eightClaw: `Восемь когтей`,
worldState_eightClawProgressOverride: `Прогресс Восьми когтей`, worldState_eightClawProgressOverride: `Прогресс Восьми когтей`,
worldState_thermiaFractures: `Разломы Термии`,
worldState_thermiaFracturesProgressOverride: `Прогресс Разломов Термии`,
worldState_from_year: `из |VAL|`, worldState_from_year: `из |VAL|`,
worldState_pre_year: `до |VAL|`, worldState_pre_year: `до |VAL|`,
worldState_week: `Неделя |VAL|`, worldState_week: `Неделя |VAL|`,

View File

@ -265,6 +265,8 @@ dict = {
worldState_bellyOfTheBeastProgressOverride: `Прогрес У лігві звіра`, worldState_bellyOfTheBeastProgressOverride: `Прогрес У лігві звіра`,
worldState_eightClaw: `Вісім кігтів`, worldState_eightClaw: `Вісім кігтів`,
worldState_eightClawProgressOverride: `Прогрес Восьми кігтів`, worldState_eightClawProgressOverride: `Прогрес Восьми кігтів`,
worldState_thermiaFractures: `Розломи термії`,
worldState_thermiaFracturesProgressOverride: `Прогрес Розломів термії`,
worldState_from_year: `з |VAL|`, worldState_from_year: `з |VAL|`,
worldState_pre_year: `до |VAL|`, worldState_pre_year: `до |VAL|`,
worldState_week: `Тиждень |VAL|`, worldState_week: `Тиждень |VAL|`,

View File

@ -265,6 +265,8 @@ dict = {
worldState_bellyOfTheBeastProgressOverride: `不稳定微粒收集进度(%)`, worldState_bellyOfTheBeastProgressOverride: `不稳定微粒收集进度(%)`,
worldState_eightClaw: `八爪`, worldState_eightClaw: `八爪`,
worldState_eightClawProgressOverride: `大帝金币收集进度(%)`, worldState_eightClawProgressOverride: `大帝金币收集进度(%)`,
worldState_thermiaFractures: `热美亚裂缝`,
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
worldState_from_year: `|VAL|`, worldState_from_year: `|VAL|`,
worldState_pre_year: `|VAL|之前`, worldState_pre_year: `|VAL|之前`,
worldState_week: `第|VAL|周`, worldState_week: `第|VAL|周`,