feat: orphix venom (#2637)
Without rotation on last mission Re #1103 Thanks to https://wiki.warframe.com/w/World_State/Example Reviewed-on: #2637 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
cddd2cdd2b
commit
d0743654dd
@ -67,6 +67,7 @@
|
|||||||
"resourceBoost": false,
|
"resourceBoost": false,
|
||||||
"tennoLiveRelay": false,
|
"tennoLiveRelay": false,
|
||||||
"wolfHunt": false,
|
"wolfHunt": false,
|
||||||
|
"orphixVenom": false,
|
||||||
"longShadow": false,
|
"longShadow": false,
|
||||||
"hallowedFlame": false,
|
"hallowedFlame": false,
|
||||||
"hallowedNightmares": false,
|
"hallowedNightmares": false,
|
||||||
|
|||||||
@ -8,7 +8,7 @@ const leaderboardEntrySchema = new Schema<ILeaderboardEntryDatabase>(
|
|||||||
displayName: { type: String, required: true },
|
displayName: { type: String, required: true },
|
||||||
score: { type: Number, required: true },
|
score: { type: Number, required: true },
|
||||||
guildId: Schema.Types.ObjectId,
|
guildId: Schema.Types.ObjectId,
|
||||||
expiry: { type: Date, required: true },
|
expiry: Date,
|
||||||
guildTier: Number
|
guildTier: Number
|
||||||
},
|
},
|
||||||
{ id: false }
|
{ id: false }
|
||||||
|
|||||||
@ -97,7 +97,19 @@ const statsSchema = new Schema<IStatsDatabase>({
|
|||||||
SentinelGameScore: Number,
|
SentinelGameScore: Number,
|
||||||
CaliberChicksScore: Number,
|
CaliberChicksScore: Number,
|
||||||
OlliesCrashCourseScore: Number,
|
OlliesCrashCourseScore: Number,
|
||||||
DojoObstacleScore: Number
|
DojoObstacleScore: Number,
|
||||||
|
|
||||||
|
Halloween16: Number,
|
||||||
|
AmalgamEventScoreMax: Number,
|
||||||
|
Halloween19ScoreMax: Number,
|
||||||
|
FlotillaEventScore: Number,
|
||||||
|
FlotillaSpaceBadgesTier1: Number,
|
||||||
|
FlotillaSpaceBadgesTier2: Number,
|
||||||
|
FlotillaSpaceBadgesTier3: Number,
|
||||||
|
FlotillaGroundBadgesTier1: Number,
|
||||||
|
FlotillaGroundBadgesTier2: Number,
|
||||||
|
FlotillaGroundBadgesTier3: Number,
|
||||||
|
MechSurvivalScoreMax: Number
|
||||||
});
|
});
|
||||||
|
|
||||||
statsSchema.set("toJSON", {
|
statsSchema.set("toJSON", {
|
||||||
|
|||||||
@ -8,5 +8,6 @@ const statsRouter = express.Router();
|
|||||||
statsRouter.get("/view.php", viewController);
|
statsRouter.get("/view.php", viewController);
|
||||||
statsRouter.post("/upload.php", uploadController);
|
statsRouter.post("/upload.php", uploadController);
|
||||||
statsRouter.post("/leaderboardWeekly.php", leaderboardController);
|
statsRouter.post("/leaderboardWeekly.php", leaderboardController);
|
||||||
|
statsRouter.post("/leaderboardArchived.php", leaderboardController);
|
||||||
|
|
||||||
export { statsRouter };
|
export { statsRouter };
|
||||||
|
|||||||
@ -79,6 +79,7 @@ export interface IConfig {
|
|||||||
tennoLiveRelay?: boolean;
|
tennoLiveRelay?: boolean;
|
||||||
baroTennoConRelay?: boolean;
|
baroTennoConRelay?: boolean;
|
||||||
wolfHunt?: boolean;
|
wolfHunt?: boolean;
|
||||||
|
orphixVenom?: boolean;
|
||||||
longShadow?: boolean;
|
longShadow?: boolean;
|
||||||
hallowedFlame?: boolean;
|
hallowedFlame?: boolean;
|
||||||
hallowedNightmares?: boolean;
|
hallowedNightmares?: boolean;
|
||||||
|
|||||||
@ -896,5 +896,20 @@ export const goalGuildRewardByTag: Record<string, { guildGoals: number[][]; rewa
|
|||||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/DuviriMurmurEventSilverTrophyRecipe",
|
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/DuviriMurmurEventSilverTrophyRecipe",
|
||||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/DuviriMurmurEventGoldTrophyRecipe"
|
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/DuviriMurmurEventGoldTrophyRecipe"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
MechSurvival: {
|
||||||
|
guildGoals: [
|
||||||
|
[1390, 5860, 13920, 18850],
|
||||||
|
[3510, 22275, 69120, 137250],
|
||||||
|
[11700, 75250, 230400, 457500],
|
||||||
|
[35100, 222750, 691200, 1372500],
|
||||||
|
[117000, 742500, 2304000, 4575000]
|
||||||
|
],
|
||||||
|
rewards: [
|
||||||
|
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/MechEventTrophyTerracottaRecipe",
|
||||||
|
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/MechEventTrophyBronzeRecipe",
|
||||||
|
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/MechEventTrophySilverRecipe",
|
||||||
|
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/MechEventTrophyGoldRecipe"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,38 +1,66 @@
|
|||||||
import { Guild } from "@/src/models/guildModel";
|
import { Guild } from "@/src/models/guildModel";
|
||||||
import { Leaderboard, TLeaderboardEntryDocument } from "@/src/models/leaderboardModel";
|
import { Leaderboard, TLeaderboardEntryDocument } from "@/src/models/leaderboardModel";
|
||||||
import { ILeaderboardEntryClient } from "@/src/types/leaderboardTypes";
|
import { ILeaderboardEntryClient } from "@/src/types/leaderboardTypes";
|
||||||
|
import { handleGuildGoalProgress } from "@/src/services/guildService";
|
||||||
|
import { getWorldState } from "@/src/services/worldStateService";
|
||||||
|
import { Types } from "mongoose";
|
||||||
|
|
||||||
export const submitLeaderboardScore = async (
|
export const submitLeaderboardScore = async (
|
||||||
schedule: "weekly" | "daily",
|
schedule: "weekly" | "daily" | "events",
|
||||||
leaderboard: string,
|
leaderboard: string,
|
||||||
ownerId: string,
|
ownerId: string,
|
||||||
displayName: string,
|
displayName: string,
|
||||||
score: number,
|
score: number,
|
||||||
guildId: string | undefined
|
guildId: string | undefined
|
||||||
): Promise<void> => {
|
): Promise<void> => {
|
||||||
let expiry: Date;
|
let expiry: Date | undefined;
|
||||||
if (schedule == "daily") {
|
if (schedule == "daily") {
|
||||||
expiry = new Date(Math.trunc(Date.now() / 86400000) * 86400000 + 86400000);
|
expiry = new Date(Math.trunc(Date.now() / 86400000) * 86400000 + 86400000);
|
||||||
} else {
|
} else if (schedule == "weekly") {
|
||||||
const EPOCH = 1734307200 * 1000; // Monday
|
const EPOCH = 1734307200 * 1000; // Monday
|
||||||
const week = Math.trunc((Date.now() - EPOCH) / 604800000);
|
const week = Math.trunc((Date.now() - EPOCH) / 604800000);
|
||||||
const weekStart = EPOCH + week * 604800000;
|
const weekStart = EPOCH + week * 604800000;
|
||||||
const weekEnd = weekStart + 604800000;
|
const weekEnd = weekStart + 604800000;
|
||||||
expiry = new Date(weekEnd);
|
expiry = new Date(weekEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (guildId) {
|
||||||
|
const guild = (await Guild.findById(guildId, "Name Tier GoalProgress VaultDecoRecipes"))!;
|
||||||
|
if (schedule == "events") {
|
||||||
|
const prevAccount = await Leaderboard.findOne(
|
||||||
|
{ leaderboard: `${schedule}.accounts.${leaderboard}`, ownerId },
|
||||||
|
"score"
|
||||||
|
);
|
||||||
|
const delta = score - (prevAccount?.score ?? 0);
|
||||||
|
if (delta > 0) {
|
||||||
|
await Leaderboard.findOneAndUpdate(
|
||||||
|
{ leaderboard: `${schedule}.guilds.${leaderboard}`, ownerId: guildId },
|
||||||
|
{ $inc: { score: delta }, $set: { displayName: guild.Name, guildTier: guild.Tier } },
|
||||||
|
{ upsert: true }
|
||||||
|
);
|
||||||
|
const goal = getWorldState().Goals.find(x => x.ScoreMaxTag == leaderboard);
|
||||||
|
if (goal) {
|
||||||
|
await handleGuildGoalProgress(guild, {
|
||||||
|
Count: delta,
|
||||||
|
Tag: goal.Tag,
|
||||||
|
goalId: new Types.ObjectId(goal._id.$oid)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await Leaderboard.findOneAndUpdate(
|
||||||
|
{ leaderboard: `${schedule}.guilds.${leaderboard}`, ownerId: guildId },
|
||||||
|
{ $max: { score }, $set: { displayName: guild.Name, guildTier: guild.Tier, expiry } },
|
||||||
|
{ upsert: true, new: true }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
await Leaderboard.findOneAndUpdate(
|
await Leaderboard.findOneAndUpdate(
|
||||||
{ leaderboard: `${schedule}.accounts.${leaderboard}`, ownerId },
|
{ leaderboard: `${schedule}.accounts.${leaderboard}`, ownerId },
|
||||||
{ $max: { score }, $set: { displayName, guildId, expiry } },
|
{ $max: { score }, $set: { displayName, guildId, expiry } },
|
||||||
{ upsert: true }
|
{ upsert: true }
|
||||||
);
|
);
|
||||||
if (guildId) {
|
|
||||||
const guild = (await Guild.findById(guildId, "Name Tier"))!;
|
|
||||||
await Leaderboard.findOneAndUpdate(
|
|
||||||
{ leaderboard: `${schedule}.guilds.${leaderboard}`, ownerId: guildId },
|
|
||||||
{ $max: { score }, $set: { displayName: guild.Name, guildTier: guild.Tier, expiry } },
|
|
||||||
{ upsert: true }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getLeaderboard = async (
|
export const getLeaderboard = async (
|
||||||
@ -43,6 +71,7 @@ export const getLeaderboard = async (
|
|||||||
guildId: string | undefined,
|
guildId: string | undefined,
|
||||||
guildTier: number | undefined
|
guildTier: number | undefined
|
||||||
): Promise<ILeaderboardEntryClient[]> => {
|
): Promise<ILeaderboardEntryClient[]> => {
|
||||||
|
leaderboard = leaderboard.replace("archived", guildTier || guildId ? "events.guilds" : "events.accounts");
|
||||||
const filter: { leaderboard: string; guildId?: string; guildTier?: number } = { leaderboard };
|
const filter: { leaderboard: string; guildId?: string; guildTier?: number } = { leaderboard };
|
||||||
if (guildId) {
|
if (guildId) {
|
||||||
filter.guildId = guildId;
|
filter.guildId = guildId;
|
||||||
|
|||||||
@ -652,7 +652,12 @@ export const addMissionInventoryUpdates = async (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (currentMissionKey && currentMissionKey in goalMessagesByKey) {
|
if (currentMissionKey && currentMissionKey in goalMessagesByKey) {
|
||||||
const totalCount = (goalProgress?.Count ?? 0) + uploadProgress.Count;
|
let countBeforeUpload = goalProgress?.Count ?? 0;
|
||||||
|
let totalCount = countBeforeUpload + uploadProgress.Count;
|
||||||
|
if (goal.Best) {
|
||||||
|
countBeforeUpload = goalProgress?.Best ?? 0;
|
||||||
|
totalCount = uploadProgress.Best;
|
||||||
|
}
|
||||||
let reward;
|
let reward;
|
||||||
|
|
||||||
if (goal.InterimGoals && goal.InterimRewards) {
|
if (goal.InterimGoals && goal.InterimRewards) {
|
||||||
@ -660,7 +665,7 @@ export const addMissionInventoryUpdates = async (
|
|||||||
if (
|
if (
|
||||||
goal.InterimGoals[i] &&
|
goal.InterimGoals[i] &&
|
||||||
goal.InterimGoals[i] <= totalCount &&
|
goal.InterimGoals[i] <= totalCount &&
|
||||||
(!goalProgress || goalProgress.Count < goal.InterimGoals[i]) &&
|
(!goalProgress || countBeforeUpload < goal.InterimGoals[i]) &&
|
||||||
goal.InterimRewards[i]
|
goal.InterimRewards[i]
|
||||||
) {
|
) {
|
||||||
reward = goal.InterimRewards[i];
|
reward = goal.InterimRewards[i];
|
||||||
@ -672,7 +677,7 @@ export const addMissionInventoryUpdates = async (
|
|||||||
!reward &&
|
!reward &&
|
||||||
goal.Goal &&
|
goal.Goal &&
|
||||||
goal.Goal <= totalCount &&
|
goal.Goal <= totalCount &&
|
||||||
(!goalProgress || goalProgress.Count < goal.Goal) &&
|
(!goalProgress || countBeforeUpload < goal.Goal) &&
|
||||||
goal.Reward
|
goal.Reward
|
||||||
) {
|
) {
|
||||||
reward = goal.Reward;
|
reward = goal.Reward;
|
||||||
@ -681,7 +686,7 @@ export const addMissionInventoryUpdates = async (
|
|||||||
!reward &&
|
!reward &&
|
||||||
goal.BonusGoal &&
|
goal.BonusGoal &&
|
||||||
goal.BonusGoal <= totalCount &&
|
goal.BonusGoal <= totalCount &&
|
||||||
(!goalProgress || goalProgress.Count < goal.BonusGoal) &&
|
(!goalProgress || countBeforeUpload < goal.BonusGoal) &&
|
||||||
goal.BonusReward
|
goal.BonusReward
|
||||||
) {
|
) {
|
||||||
reward = goal.BonusReward;
|
reward = goal.BonusReward;
|
||||||
@ -1091,6 +1096,12 @@ export const addMissionRewards = async (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (rewardInfo.GoalProgressAmount && goal.Tag.startsWith("MechSurvival")) {
|
||||||
|
MissionRewards.push({
|
||||||
|
StoreItem: "/Lotus/StoreItems/Types/Items/MiscItems/MechSurvivalEventCreds",
|
||||||
|
ItemCount: Math.trunc(rewardInfo.GoalProgressAmount / 10)
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2416,5 +2427,35 @@ const goalMessagesByKey: Record<string, { sndr: string; msg: string; sub: string
|
|||||||
msg: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionRewardBody",
|
msg: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionRewardBody",
|
||||||
sub: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionFourTitle",
|
sub: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionFourTitle",
|
||||||
icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
|
icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
|
||||||
|
},
|
||||||
|
"/Lotus/Types/Keys/MechSurvivalCorpusShip": {
|
||||||
|
sndr: "/Lotus/Language/Bosses/DeimosFather",
|
||||||
|
msg: "/Lotus/Language/Inbox/MechEvent2020Tier1CompleteDesc",
|
||||||
|
sub: "/Lotus/Language/Inbox/MechEvent2020Tier1CompleteTitle",
|
||||||
|
icon: "/Lotus/Interface/Icons/Npcs/Entrati/Father.png"
|
||||||
|
},
|
||||||
|
"/Lotus/Types/Keys/MechSurvivalGrineerGalleon": {
|
||||||
|
sndr: "/Lotus/Language/Bosses/DeimosFather",
|
||||||
|
msg: "/Lotus/Language/Inbox/MechEvent2020Tier2CompleteDesc",
|
||||||
|
sub: "/Lotus/Language/Inbox/MechEvent2020Tier2CompleteTitle",
|
||||||
|
icon: "/Lotus/Interface/Icons/Npcs/Entrati/Father.png"
|
||||||
|
},
|
||||||
|
"/Lotus/Types/Keys/MechSurvivalGasCity": {
|
||||||
|
sndr: "/Lotus/Language/Bosses/DeimosFather",
|
||||||
|
msg: "/Lotus/Language/Inbox/MechEvent2020Tier3CompleteDesc",
|
||||||
|
sub: "/Lotus/Language/Inbox/MechEvent2020Tier3CompleteTitle",
|
||||||
|
icon: "/Lotus/Interface/Icons/Npcs/Entrati/Father.png"
|
||||||
|
},
|
||||||
|
"/Lotus/Types/Keys/MechSurvivalCorpusShipEndurance": {
|
||||||
|
sndr: "/Lotus/Language/Bosses/DeimosFather",
|
||||||
|
msg: "/Lotus/Language/Inbox/MechEvent2020Tier3CompleteDesc",
|
||||||
|
sub: "/Lotus/Language/Inbox/MechEvent2020Tier3CompleteTitle",
|
||||||
|
icon: "/Lotus/Interface/Icons/Npcs/Entrati/Father.png"
|
||||||
|
},
|
||||||
|
"/Lotus/Types/Keys/MechSurvivalGrineerGalleonEndurance": {
|
||||||
|
sndr: "/Lotus/Language/Bosses/DeimosFather",
|
||||||
|
msg: "/Lotus/Language/Inbox/MechEvent2020Tier3CompleteDesc",
|
||||||
|
sub: "/Lotus/Language/Inbox/MechEvent2020Tier3CompleteTitle",
|
||||||
|
icon: "/Lotus/Interface/Icons/Npcs/Entrati/Father.png"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -382,6 +382,29 @@ export const updateStats = async (accountOwnerId: string, payload: IStatsUpdate)
|
|||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "Halloween16":
|
||||||
|
case "AmalgamEventScoreMax":
|
||||||
|
case "Halloween19ScoreMax":
|
||||||
|
case "FlotillaEventScore":
|
||||||
|
case "FlotillaSpaceBadgesTier1":
|
||||||
|
case "FlotillaSpaceBadgesTier2":
|
||||||
|
case "FlotillaSpaceBadgesTier3":
|
||||||
|
case "FlotillaGroundBadgesTier1":
|
||||||
|
case "FlotillaGroundBadgesTier2":
|
||||||
|
case "FlotillaGroundBadgesTier3":
|
||||||
|
case "MechSurvivalScoreMax":
|
||||||
|
playerStats[category] ??= 0;
|
||||||
|
if (data > playerStats[category]) playerStats[category] = data as number;
|
||||||
|
await submitLeaderboardScore(
|
||||||
|
"events",
|
||||||
|
category,
|
||||||
|
accountOwnerId,
|
||||||
|
payload.displayName,
|
||||||
|
data as number,
|
||||||
|
payload.guildId
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (!ignoredCategories.includes(category)) {
|
if (!ignoredCategories.includes(category)) {
|
||||||
unknownCategories[action] ??= [];
|
unknownCategories[action] ??= [];
|
||||||
|
|||||||
@ -1538,7 +1538,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
|||||||
Personal: true,
|
Personal: true,
|
||||||
Bounty: true,
|
Bounty: true,
|
||||||
ClampNodeScores: true,
|
ClampNodeScores: true,
|
||||||
Node: "EventNode28", // Incompatible with Wolf Hunt (2025)
|
Node: "EventNode28", // Incompatible with Wolf Hunt (2025), Orphix Venom
|
||||||
MissionKeyName: "/Lotus/Types/Keys/GalleonRobberyAlertB",
|
MissionKeyName: "/Lotus/Types/Keys/GalleonRobberyAlertB",
|
||||||
Desc: "/Lotus/Language/Events/GalleonRobberyEventMissionTitle",
|
Desc: "/Lotus/Language/Events/GalleonRobberyEventMissionTitle",
|
||||||
Icon: "/Lotus/Interface/Icons/Player/GalleonRobberiesEvent.png",
|
Icon: "/Lotus/Interface/Icons/Player/GalleonRobberiesEvent.png",
|
||||||
@ -1964,7 +1964,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
|||||||
"/Lotus/Types/Keys/WolfTacAlertReduxD"
|
"/Lotus/Types/Keys/WolfTacAlertReduxD"
|
||||||
],
|
],
|
||||||
ConcurrentNodeReqs: [1, 2, 3],
|
ConcurrentNodeReqs: [1, 2, 3],
|
||||||
ConcurrentNodes: ["EventNode28", "EventNode39", "EventNode40"], // Incompatible with Galleon Of Ghouls
|
ConcurrentNodes: ["EventNode28", "EventNode39", "EventNode40"], // Incompatible with Galleon Of Ghouls, Orphix Venom
|
||||||
MissionKeyName: "/Lotus/Types/Keys/WolfTacAlertReduxA",
|
MissionKeyName: "/Lotus/Types/Keys/WolfTacAlertReduxA",
|
||||||
Faction: "FC_GRINEER",
|
Faction: "FC_GRINEER",
|
||||||
Desc: "/Lotus/Language/Alerts/WolfAlert",
|
Desc: "/Lotus/Language/Alerts/WolfAlert",
|
||||||
@ -2216,7 +2216,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
|||||||
"/Lotus/Types/Keys/TacAlertKeyProxyRebellionFour"
|
"/Lotus/Types/Keys/TacAlertKeyProxyRebellionFour"
|
||||||
],
|
],
|
||||||
ConcurrentNodeReqs: [1, 2, 3],
|
ConcurrentNodeReqs: [1, 2, 3],
|
||||||
ConcurrentNodes: ["EventNode7", "EventNode4", "EventNode17"],
|
ConcurrentNodes: ["EventNode7", "EventNode4", "EventNode17"], // Incompatible with Orphix venom
|
||||||
MissionKeyName: "/Lotus/Types/Keys/TacAlertKeyProxyRebellionOne",
|
MissionKeyName: "/Lotus/Types/Keys/TacAlertKeyProxyRebellionOne",
|
||||||
Faction: "FC_CORPUS",
|
Faction: "FC_CORPUS",
|
||||||
Desc: "/Lotus/Language/Alerts/TacAlertProxyRebellion",
|
Desc: "/Lotus/Language/Alerts/TacAlertProxyRebellion",
|
||||||
@ -2315,6 +2315,83 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (config.worldState?.orphixVenom) {
|
||||||
|
worldState.Goals.push(
|
||||||
|
{
|
||||||
|
_id: { $oid: "5fdcccb875d5ad500dc477d0" },
|
||||||
|
Activation: { $date: { $numberLong: "1608320400000" } },
|
||||||
|
Expiry: { $date: { $numberLong: "2000000000000" } },
|
||||||
|
Count: 0,
|
||||||
|
Goal: 500,
|
||||||
|
Success: 0,
|
||||||
|
Personal: true,
|
||||||
|
Best: true,
|
||||||
|
Node: "EventNode17", // Incompatible with Proxy Rebellion
|
||||||
|
MissionKeyName: "/Lotus/Types/Keys/MechSurvivalCorpusShip",
|
||||||
|
Faction: "FC_SENTIENT",
|
||||||
|
Desc: "/Lotus/Language/Events/MechEventMissionTier1",
|
||||||
|
Icon: "/Lotus/Interface/Icons/Categories/IconMech256.png",
|
||||||
|
Tag: "MechSurvivalA",
|
||||||
|
ScoreVar: "MechSurvivalScore",
|
||||||
|
Reward: {
|
||||||
|
items: ["/Lotus/StoreItems/Upgrades/Skins/Clan/MechEventEmblemItem"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
_id: { $oid: "5fdcccb875d5ad500dc477d1" },
|
||||||
|
Activation: { $date: { $numberLong: "1608320400000" } },
|
||||||
|
Expiry: { $date: { $numberLong: "2000000000000" } },
|
||||||
|
Count: 0,
|
||||||
|
Goal: 1000,
|
||||||
|
Success: 0,
|
||||||
|
Personal: true,
|
||||||
|
Best: true,
|
||||||
|
Node: "EventNode28", // Incompatible with Galleon Of Ghouls, Wolf Hunt (2025)
|
||||||
|
MissionKeyName: "/Lotus/Types/Keys/MechSurvivalGrineerGalleon",
|
||||||
|
Faction: "FC_SENTIENT",
|
||||||
|
Desc: "/Lotus/Language/Events/MechEventMissionTier2",
|
||||||
|
Icon: "/Lotus/Interface/Icons/Categories/IconMech256.png",
|
||||||
|
Tag: "MechSurvivalB",
|
||||||
|
PrereqGoalTags: ["MechSurvivalA"],
|
||||||
|
ScoreVar: "MechSurvivalScore",
|
||||||
|
Reward: {
|
||||||
|
items: ["/Lotus/StoreItems/Types/Items/FusionTreasures/OroFusexJ"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
_id: { $oid: "5fdcccb875d5ad500dc477d2" },
|
||||||
|
Activation: { $date: { $numberLong: "1608320400000" } },
|
||||||
|
Expiry: { $date: { $numberLong: "2000000000000" } },
|
||||||
|
Count: 0,
|
||||||
|
Goal: 2000,
|
||||||
|
Success: 0,
|
||||||
|
Personal: true,
|
||||||
|
Best: true,
|
||||||
|
Node: "EventNode32",
|
||||||
|
MissionKeyName: "/Lotus/Types/Keys/MechSurvivalGasCity",
|
||||||
|
MissionKeyRotation: [
|
||||||
|
"/Lotus/Types/Keys/MechSurvivalGasCity",
|
||||||
|
"/Lotus/Types/Keys/MechSurvivalCorpusShipEndurance",
|
||||||
|
"/Lotus/Types/Keys/MechSurvivalGrineerGalleonEndurance"
|
||||||
|
],
|
||||||
|
MissionKeyRotationInterval: 3600, // 1 hour
|
||||||
|
Faction: "FC_SENTIENT",
|
||||||
|
Desc: "/Lotus/Language/Events/MechEventMissionTier3",
|
||||||
|
Icon: "/Lotus/Interface/Icons/Categories/IconMech256.png",
|
||||||
|
Tag: "MechSurvival",
|
||||||
|
PrereqGoalTags: ["MechSurvivalA", "MechSurvivalB"],
|
||||||
|
ScoreVar: "MechSurvivalScore",
|
||||||
|
ScoreMaxTag: "MechSurvivalScoreMax",
|
||||||
|
Reward: {
|
||||||
|
items: [
|
||||||
|
"/Lotus/StoreItems/Types/Items/MiscItems/FormaAura",
|
||||||
|
"/Lotus/StoreItems/Upgrades/Skins/Necramech/MechWeapon/MechEventMausolonSkin"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Nightwave Challenges
|
// Nightwave Challenges
|
||||||
const nightwaveSyndicateTag = getNightwaveSyndicateTag(buildLabel);
|
const nightwaveSyndicateTag = getNightwaveSyndicateTag(buildLabel);
|
||||||
if (nightwaveSyndicateTag) {
|
if (nightwaveSyndicateTag) {
|
||||||
|
|||||||
@ -6,7 +6,7 @@ export interface ILeaderboardEntryDatabase {
|
|||||||
displayName: string;
|
displayName: string;
|
||||||
score: number;
|
score: number;
|
||||||
guildId?: Types.ObjectId;
|
guildId?: Types.ObjectId;
|
||||||
expiry: Date;
|
expiry?: Date;
|
||||||
guildTier?: number;
|
guildTier?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -206,6 +206,7 @@ export interface IRewardInfo {
|
|||||||
Q?: boolean; // likely indicates that the bonus objective for this stage was completed
|
Q?: boolean; // likely indicates that the bonus objective for this stage was completed
|
||||||
CheckpointCounter?: number; // starts at 1, is incremented with each job stage upload, and does not reset when starting a new job
|
CheckpointCounter?: number; // starts at 1, is incremented with each job stage upload, and does not reset when starting a new job
|
||||||
challengeMissionId?: string;
|
challengeMissionId?: string;
|
||||||
|
GoalProgressAmount?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type IMissionStatus = "GS_SUCCESS" | "GS_FAILURE" | "GS_DUMPED" | "GS_QUIT" | "GS_INTERRUPTED";
|
export type IMissionStatus = "GS_SUCCESS" | "GS_FAILURE" | "GS_DUMPED" | "GS_QUIT" | "GS_INTERRUPTED";
|
||||||
|
|||||||
@ -32,6 +32,19 @@ export interface IStatsClient {
|
|||||||
OlliesCrashCourseScore?: number;
|
OlliesCrashCourseScore?: number;
|
||||||
DojoObstacleScore?: number;
|
DojoObstacleScore?: number;
|
||||||
|
|
||||||
|
// event scores
|
||||||
|
Halloween16?: number;
|
||||||
|
AmalgamEventScoreMax?: number;
|
||||||
|
Halloween19ScoreMax?: number;
|
||||||
|
FlotillaEventScore?: number;
|
||||||
|
FlotillaSpaceBadgesTier1?: number;
|
||||||
|
FlotillaSpaceBadgesTier2?: number;
|
||||||
|
FlotillaSpaceBadgesTier3?: number;
|
||||||
|
FlotillaGroundBadgesTier1?: number;
|
||||||
|
FlotillaGroundBadgesTier2?: number;
|
||||||
|
FlotillaGroundBadgesTier3?: number;
|
||||||
|
MechSurvivalScoreMax?: number;
|
||||||
|
|
||||||
// not in schema
|
// not in schema
|
||||||
PVP?: {
|
PVP?: {
|
||||||
suitDeaths?: number;
|
suitDeaths?: number;
|
||||||
|
|||||||
@ -56,7 +56,7 @@ export interface IGoal {
|
|||||||
Success?: number;
|
Success?: number;
|
||||||
Personal?: boolean;
|
Personal?: boolean;
|
||||||
Community?: boolean;
|
Community?: boolean;
|
||||||
Best?: boolean; // Fist one on Event Tab
|
Best?: boolean; // Use Best instead of Count to check for reward
|
||||||
Bounty?: boolean; // Tactical Alert
|
Bounty?: boolean; // Tactical Alert
|
||||||
ClampNodeScores?: boolean;
|
ClampNodeScores?: boolean;
|
||||||
|
|
||||||
@ -88,9 +88,12 @@ export interface IGoal {
|
|||||||
JobPreviousVersion?: IOid;
|
JobPreviousVersion?: IOid;
|
||||||
|
|
||||||
ScoreVar?: string;
|
ScoreVar?: string;
|
||||||
ScoreMaxTag?: string;
|
ScoreMaxTag?: string; // Field in leaderboard
|
||||||
ScoreLocTag?: string;
|
ScoreLocTag?: string;
|
||||||
|
|
||||||
|
MissionKeyRotation?: string[];
|
||||||
|
MissionKeyRotationInterval?: number;
|
||||||
|
|
||||||
NightLevel?: string;
|
NightLevel?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -940,7 +940,12 @@
|
|||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="checkbox" id="worldState.wolfHunt" />
|
<input class="form-check-input" type="checkbox" id="worldState.wolfHunt" />
|
||||||
<label class="form-check-label" for="worldState.wolfHunt" data-loc="worldState_wolfHunt"></label>
|
<label class="form-check-label" for="worldState.wolfHunt" data-loc="worldState_wolfHunt"></label>
|
||||||
<abbr data-loc-inc="worldState_galleonOfGhouls"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><path d="M320 576C461.4 576 576 461.4 576 320C576 178.6 461.4 64 320 64C178.6 64 64 178.6 64 320C64 461.4 178.6 576 320 576zM320 200C333.3 200 344 210.7 344 224L344 336C344 349.3 333.3 360 320 360C306.7 360 296 349.3 296 336L296 224C296 210.7 306.7 200 320 200zM293.3 416C292.7 406.1 297.6 396.7 306.1 391.5C314.6 386.4 325.3 386.4 333.8 391.5C342.3 396.7 347.2 406.1 346.6 416C347.2 425.9 342.3 435.3 333.8 440.5C325.3 445.6 314.6 445.6 306.1 440.5C297.6 435.3 292.7 425.9 293.3 416z"/></svg></abbr>
|
<abbr data-loc-inc="worldState_galleonOfGhouls|worldState_orphixVenom"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><path d="M320 576C461.4 576 576 461.4 576 320C576 178.6 461.4 64 320 64C178.6 64 64 178.6 64 320C64 461.4 178.6 576 320 576zM320 200C333.3 200 344 210.7 344 224L344 336C344 349.3 333.3 360 320 360C306.7 360 296 349.3 296 336L296 224C296 210.7 306.7 200 320 200zM293.3 416C292.7 406.1 297.6 396.7 306.1 391.5C314.6 386.4 325.3 386.4 333.8 391.5C342.3 396.7 347.2 406.1 346.6 416C347.2 425.9 342.3 435.3 333.8 440.5C325.3 445.6 314.6 445.6 306.1 440.5C297.6 435.3 292.7 425.9 293.3 416z"/></svg></abbr>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="checkbox" id="worldState.orphixVenom" />
|
||||||
|
<label class="form-check-label" for="worldState.orphixVenom" data-loc="worldState_orphixVenom"></label>
|
||||||
|
<abbr data-loc-inc="worldState_galleonOfGhouls|worldState_wolfHunt|worldState_proxyRebellion"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><path d="M320 576C461.4 576 576 461.4 576 320C576 178.6 461.4 64 320 64C178.6 64 64 178.6 64 320C64 461.4 178.6 576 320 576zM320 200C333.3 200 344 210.7 344 224L344 336C344 349.3 333.3 360 320 360C306.7 360 296 349.3 296 336L296 224C296 210.7 306.7 200 320 200zM293.3 416C292.7 406.1 297.6 396.7 306.1 391.5C314.6 386.4 325.3 386.4 333.8 391.5C342.3 396.7 347.2 406.1 346.6 416C347.2 425.9 342.3 435.3 333.8 440.5C325.3 445.6 314.6 445.6 306.1 440.5C297.6 435.3 292.7 425.9 293.3 416z"/></svg></abbr>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="checkbox" id="worldState.longShadow" />
|
<input class="form-check-input" type="checkbox" id="worldState.longShadow" />
|
||||||
@ -972,6 +977,7 @@
|
|||||||
<div class="form-group mt-2 d-flex gap-2">
|
<div class="form-group mt-2 d-flex gap-2">
|
||||||
<div class="flex-fill">
|
<div class="flex-fill">
|
||||||
<label class="form-label" for="worldState.proxyRebellion" data-loc="worldState_proxyRebellion"></label>
|
<label class="form-label" for="worldState.proxyRebellion" data-loc="worldState_proxyRebellion"></label>
|
||||||
|
<abbr data-loc-inc="worldState_orphixVenom"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><path d="M320 576C461.4 576 576 461.4 576 320C576 178.6 461.4 64 320 64C178.6 64 64 178.6 64 320C64 461.4 178.6 576 320 576zM320 200C333.3 200 344 210.7 344 224L344 336C344 349.3 333.3 360 320 360C306.7 360 296 349.3 296 336L296 224C296 210.7 306.7 200 320 200zM293.3 416C292.7 406.1 297.6 396.7 306.1 391.5C314.6 386.4 325.3 386.4 333.8 391.5C342.3 396.7 347.2 406.1 346.6 416C347.2 425.9 342.3 435.3 333.8 440.5C325.3 445.6 314.6 445.6 306.1 440.5C297.6 435.3 292.7 425.9 293.3 416z"/></svg></abbr>
|
||||||
<select class="form-control" id="worldState.proxyRebellion" data-default="false">
|
<select class="form-control" id="worldState.proxyRebellion" data-default="false">
|
||||||
<option value="true" data-loc="enabled"></option>
|
<option value="true" data-loc="enabled"></option>
|
||||||
<option value="false" data-loc="disabled"></option>
|
<option value="false" data-loc="disabled"></option>
|
||||||
|
|||||||
@ -251,6 +251,7 @@ dict = {
|
|||||||
worldState_dogDays: `Hitzefrei`,
|
worldState_dogDays: `Hitzefrei`,
|
||||||
worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
|
worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
|
||||||
worldState_wolfHunt: `Wolfsjagd (2025)`,
|
worldState_wolfHunt: `Wolfsjagd (2025)`,
|
||||||
|
worldState_orphixVenom: `Orphix Gift`,
|
||||||
worldState_longShadow: `Lange Schatten`,
|
worldState_longShadow: `Lange Schatten`,
|
||||||
worldState_hallowedFlame: `Geweihte Flamme`,
|
worldState_hallowedFlame: `Geweihte Flamme`,
|
||||||
worldState_hallowedNightmares: `Geweihte Albträume`,
|
worldState_hallowedNightmares: `Geweihte Albträume`,
|
||||||
|
|||||||
@ -250,6 +250,7 @@ dict = {
|
|||||||
worldState_dogDays: `Dog Days`,
|
worldState_dogDays: `Dog Days`,
|
||||||
worldState_dogDaysRewards: `Dog Days Rewards`,
|
worldState_dogDaysRewards: `Dog Days Rewards`,
|
||||||
worldState_wolfHunt: `Wolf Hunt (2025)`,
|
worldState_wolfHunt: `Wolf Hunt (2025)`,
|
||||||
|
worldState_orphixVenom: `Orphix Venom`,
|
||||||
worldState_longShadow: `Long Shadow`,
|
worldState_longShadow: `Long Shadow`,
|
||||||
worldState_hallowedFlame: `Hallowed Flame`,
|
worldState_hallowedFlame: `Hallowed Flame`,
|
||||||
worldState_hallowedNightmares: `Hallowed Nightmares`,
|
worldState_hallowedNightmares: `Hallowed Nightmares`,
|
||||||
|
|||||||
@ -251,6 +251,7 @@ dict = {
|
|||||||
worldState_dogDays: `Canícula`,
|
worldState_dogDays: `Canícula`,
|
||||||
worldState_dogDaysRewards: `Recompensas de Canícula`,
|
worldState_dogDaysRewards: `Recompensas de Canícula`,
|
||||||
worldState_wolfHunt: `Cacería del Lobo (2025)`,
|
worldState_wolfHunt: `Cacería del Lobo (2025)`,
|
||||||
|
worldState_orphixVenom: `Veneno de Orphix`,
|
||||||
worldState_longShadow: `Sombra Prolongada`,
|
worldState_longShadow: `Sombra Prolongada`,
|
||||||
worldState_hallowedFlame: `Llama Sagrada`,
|
worldState_hallowedFlame: `Llama Sagrada`,
|
||||||
worldState_hallowedNightmares: `Pesadillas Sagradas`,
|
worldState_hallowedNightmares: `Pesadillas Sagradas`,
|
||||||
|
|||||||
@ -251,6 +251,7 @@ dict = {
|
|||||||
worldState_dogDays: `Bataille d'Eau`,
|
worldState_dogDays: `Bataille d'Eau`,
|
||||||
worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
|
worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
|
||||||
worldState_wolfHunt: `Chasse au Loup (2025)`,
|
worldState_wolfHunt: `Chasse au Loup (2025)`,
|
||||||
|
worldState_orphixVenom: `Venin Orphix`,
|
||||||
worldState_longShadow: `La Propagation des Ombres`,
|
worldState_longShadow: `La Propagation des Ombres`,
|
||||||
worldState_hallowedFlame: `Flamme Hantée`,
|
worldState_hallowedFlame: `Flamme Hantée`,
|
||||||
worldState_hallowedNightmares: `Cauchemars Hantés`,
|
worldState_hallowedNightmares: `Cauchemars Hantés`,
|
||||||
|
|||||||
@ -251,6 +251,7 @@ dict = {
|
|||||||
worldState_dogDays: `Знойные дни`,
|
worldState_dogDays: `Знойные дни`,
|
||||||
worldState_dogDaysRewards: `Награды Знойных дней`,
|
worldState_dogDaysRewards: `Награды Знойных дней`,
|
||||||
worldState_wolfHunt: `Волчья Охота (2025)`,
|
worldState_wolfHunt: `Волчья Охота (2025)`,
|
||||||
|
worldState_orphixVenom: `Яд Орфикса`,
|
||||||
worldState_longShadow: `Длинная Тень`,
|
worldState_longShadow: `Длинная Тень`,
|
||||||
worldState_hallowedFlame: `Священное пламя`,
|
worldState_hallowedFlame: `Священное пламя`,
|
||||||
worldState_hallowedNightmares: `Священные кошмары`,
|
worldState_hallowedNightmares: `Священные кошмары`,
|
||||||
|
|||||||
@ -251,6 +251,7 @@ dict = {
|
|||||||
worldState_dogDays: `Спекотні дні`,
|
worldState_dogDays: `Спекотні дні`,
|
||||||
worldState_dogDaysRewards: `Нагороди Спекотних днів`,
|
worldState_dogDaysRewards: `Нагороди Спекотних днів`,
|
||||||
worldState_wolfHunt: `Полювання на Вовка (2025)`,
|
worldState_wolfHunt: `Полювання на Вовка (2025)`,
|
||||||
|
worldState_orphixVenom: `Орфіксова отрута`,
|
||||||
worldState_longShadow: `Довга тінь`,
|
worldState_longShadow: `Довга тінь`,
|
||||||
worldState_hallowedFlame: `Священне полум'я`,
|
worldState_hallowedFlame: `Священне полум'я`,
|
||||||
worldState_hallowedNightmares: `Священні жахіття`,
|
worldState_hallowedNightmares: `Священні жахіття`,
|
||||||
|
|||||||
@ -251,6 +251,7 @@ dict = {
|
|||||||
worldState_dogDays: `三伏天`,
|
worldState_dogDays: `三伏天`,
|
||||||
worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
|
worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
|
||||||
worldState_wolfHunt: `恶狼狩猎 (2025)`,
|
worldState_wolfHunt: `恶狼狩猎 (2025)`,
|
||||||
|
worldState_orphixVenom: `奥影之毒`,
|
||||||
worldState_longShadow: `暗夜长影`,
|
worldState_longShadow: `暗夜长影`,
|
||||||
worldState_hallowedFlame: `万圣之焰`,
|
worldState_hallowedFlame: `万圣之焰`,
|
||||||
worldState_hallowedNightmares: `万圣噩梦`,
|
worldState_hallowedNightmares: `万圣噩梦`,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user