forked from OpenWF/SpaceNinjaServer
Compare commits
7 Commits
18fafc38b5
...
b56c79d9f4
| Author | SHA1 | Date | |
|---|---|---|---|
| b56c79d9f4 | |||
| 23abe5de02 | |||
| 0d21c73ab7 | |||
| 482101ccd0 | |||
| 60e87543aa | |||
| c4c17f24d7 | |||
| 43fa1978c0 |
62
src/controllers/api/feedPrinceController.ts
Normal file
62
src/controllers/api/feedPrinceController.ts
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
import type { RequestHandler } from "express";
|
||||||
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
|
import { addMiscItem, getInventory } from "../../services/inventoryService.ts";
|
||||||
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
|
import { logger } from "../../utils/logger.ts";
|
||||||
|
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
|
||||||
|
|
||||||
|
export const feedPrinceController: RequestHandler = async (req, res) => {
|
||||||
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
const inventory = await getInventory(accountId, "MiscItems NokkoColony NodeIntrosCompleted");
|
||||||
|
const payload = getJSONfromString<IFeedPrinceRequest>(String(req.body));
|
||||||
|
|
||||||
|
switch (payload.Mode) {
|
||||||
|
case "r": {
|
||||||
|
inventory.NokkoColony ??= {
|
||||||
|
FeedLevel: 0,
|
||||||
|
JournalEntries: []
|
||||||
|
};
|
||||||
|
const InventoryChanges: IInventoryChanges = {};
|
||||||
|
inventory.NokkoColony.FeedLevel += payload.Amount;
|
||||||
|
if (
|
||||||
|
(!inventory.NodeIntrosCompleted.includes("CompletedVision1") && inventory.NokkoColony.FeedLevel > 20) ||
|
||||||
|
(!inventory.NodeIntrosCompleted.includes("CompletedVision2") && inventory.NokkoColony.FeedLevel > 60)
|
||||||
|
) {
|
||||||
|
res.json({
|
||||||
|
FeedSucceeded: false,
|
||||||
|
FeedLevel: inventory.NokkoColony.FeedLevel - payload.Amount,
|
||||||
|
InventoryChanges
|
||||||
|
} satisfies IFeedPrinceResponse);
|
||||||
|
} else {
|
||||||
|
addMiscItem(
|
||||||
|
inventory,
|
||||||
|
"/Lotus/Types/Items/MiscItems/MushroomFood",
|
||||||
|
payload.Amount * -1,
|
||||||
|
InventoryChanges
|
||||||
|
);
|
||||||
|
await inventory.save();
|
||||||
|
res.json({
|
||||||
|
FeedSucceeded: true,
|
||||||
|
FeedLevel: inventory.NokkoColony.FeedLevel,
|
||||||
|
InventoryChanges
|
||||||
|
} satisfies IFeedPrinceResponse);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
logger.debug(`data provided to ${req.path}: ${String(req.body)}`);
|
||||||
|
throw new Error(`unknown feedPrince mode: ${payload.Mode}`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
interface IFeedPrinceRequest {
|
||||||
|
Mode: string; // r
|
||||||
|
Amount: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IFeedPrinceResponse {
|
||||||
|
FeedSucceeded: boolean;
|
||||||
|
FeedLevel: number;
|
||||||
|
InventoryChanges: IInventoryChanges;
|
||||||
|
}
|
||||||
117
src/controllers/api/researchMushroomController.ts
Normal file
117
src/controllers/api/researchMushroomController.ts
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
import type { RequestHandler } from "express";
|
||||||
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
|
import { addMiscItem, getInventory } from "../../services/inventoryService.ts";
|
||||||
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
|
import { logger } from "../../utils/logger.ts";
|
||||||
|
import type { IJournalEntry } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
|
import type { IAffiliationMods } from "../../types/purchaseTypes.ts";
|
||||||
|
|
||||||
|
export const researchMushroomController: RequestHandler = async (req, res) => {
|
||||||
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
const inventory = await getInventory(accountId, "MiscItems NokkoColony Affiliations");
|
||||||
|
const payload = getJSONfromString<IResearchMushroom>(String(req.body));
|
||||||
|
switch (payload.Mode) {
|
||||||
|
case "r": {
|
||||||
|
const InventoryChanges = {};
|
||||||
|
const AffiliationMods: IAffiliationMods[] = [];
|
||||||
|
|
||||||
|
addMiscItem(inventory, payload.MushroomItem, payload.Amount * -1, InventoryChanges);
|
||||||
|
if (payload.Convert) {
|
||||||
|
addMiscItem(inventory, "/Lotus/Types/Items/MiscItems/MushroomFood", payload.Amount, InventoryChanges);
|
||||||
|
}
|
||||||
|
|
||||||
|
inventory.NokkoColony ??= {
|
||||||
|
FeedLevel: 0,
|
||||||
|
JournalEntries: []
|
||||||
|
};
|
||||||
|
|
||||||
|
let journalEntry = inventory.NokkoColony.JournalEntries.find(x => x.EntryType == payload.MushroomItem);
|
||||||
|
if (!journalEntry) {
|
||||||
|
journalEntry = { EntryType: payload.MushroomItem, Progress: 0 };
|
||||||
|
inventory.NokkoColony.JournalEntries.push(journalEntry);
|
||||||
|
}
|
||||||
|
|
||||||
|
let syndicate = inventory.Affiliations.find(x => x.Tag == "NightcapJournalSyndicate");
|
||||||
|
if (!syndicate) {
|
||||||
|
syndicate = { Tag: "NightcapJournalSyndicate", Title: 0, Standing: 0 };
|
||||||
|
inventory.Affiliations.push(syndicate);
|
||||||
|
}
|
||||||
|
const completedBefore = inventory.NokkoColony.JournalEntries.filter(
|
||||||
|
entry => getJournalRank(entry) === 3
|
||||||
|
).length;
|
||||||
|
const PrevRank = syndicateTitleThresholds.reduce(
|
||||||
|
(rank, threshold, i) => (completedBefore >= threshold ? i : rank),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
if (getJournalRank(journalEntry) < 3) journalEntry.Progress += payload.Amount;
|
||||||
|
|
||||||
|
const completedAfter = inventory.NokkoColony.JournalEntries.filter(
|
||||||
|
entry => getJournalRank(entry) === 3
|
||||||
|
).length;
|
||||||
|
const NewRank = syndicateTitleThresholds.reduce(
|
||||||
|
(rank, threshold, i) => (completedAfter >= threshold ? i : rank),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
if (NewRank > (syndicate.Title ?? 0)) {
|
||||||
|
syndicate.Title = NewRank;
|
||||||
|
AffiliationMods.push({ Tag: "NightcapJournalSyndicate", Title: NewRank });
|
||||||
|
}
|
||||||
|
|
||||||
|
await inventory.save();
|
||||||
|
res.json({
|
||||||
|
PrevRank,
|
||||||
|
NewRank,
|
||||||
|
Progress: journalEntry.Progress,
|
||||||
|
InventoryChanges,
|
||||||
|
AffiliationMods
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
logger.debug(`data provided to ${req.path}: ${String(req.body)}`);
|
||||||
|
throw new Error(`unknown researchMushroom mode: ${payload.Mode}`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
interface IResearchMushroom {
|
||||||
|
Mode: string; // r
|
||||||
|
MushroomItem: string;
|
||||||
|
Amount: number;
|
||||||
|
Convert: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
const journalEntriesRank: Record<string, number> = {
|
||||||
|
"/Lotus/Types/Items/MushroomJournal/PlainMushroomJournalItem": 1,
|
||||||
|
"/Lotus/Types/Items/MushroomJournal/GasMushroomJournalItem": 4,
|
||||||
|
"/Lotus/Types/Items/MushroomJournal/ToxinMushroomJournalItem": 3,
|
||||||
|
"/Lotus/Types/Items/MushroomJournal/ViralMushroomJournalItem": 4,
|
||||||
|
"/Lotus/Types/Items/MushroomJournal/MagneticMushroomJournalItem": 4,
|
||||||
|
"/Lotus/Types/Items/MushroomJournal/ElectricMushroomJournalItem": 3,
|
||||||
|
"/Lotus/Types/Items/MushroomJournal/TauMushroomJournalItem": 5,
|
||||||
|
"/Lotus/Types/Items/MushroomJournal/SlashMushroomJournalItem": 3,
|
||||||
|
"/Lotus/Types/Items/MushroomJournal/BlastMushroomJournalItem": 4,
|
||||||
|
"/Lotus/Types/Items/MushroomJournal/ImpactMushroomJournalItem": 3,
|
||||||
|
"/Lotus/Types/Items/MushroomJournal/ColdMushroomJournalItem": 3,
|
||||||
|
"/Lotus/Types/Items/MushroomJournal/CorrosiveMushroomJournalItem": 4,
|
||||||
|
"/Lotus/Types/Items/MushroomJournal/PunctureMushroomJournalItem": 3,
|
||||||
|
"/Lotus/Types/Items/MushroomJournal/HeatMushroomJournalItem": 3,
|
||||||
|
"/Lotus/Types/Items/MushroomJournal/RadiationMushroomJournalItem": 4,
|
||||||
|
"/Lotus/Types/Items/MushroomJournal/VoidMushroomJournalItem": 5
|
||||||
|
};
|
||||||
|
|
||||||
|
const syndicateTitleThresholds = [0, 1, 2, 6, 12, 16];
|
||||||
|
|
||||||
|
const getJournalRank = (journalEntry: IJournalEntry): number => {
|
||||||
|
const k = journalEntriesRank[journalEntry.EntryType];
|
||||||
|
if (!k) return 0;
|
||||||
|
|
||||||
|
const thresholds = [k * 1, k * 3, k * 6];
|
||||||
|
|
||||||
|
if (journalEntry.Progress >= thresholds[2]) return 3;
|
||||||
|
if (journalEntry.Progress >= thresholds[1]) return 2;
|
||||||
|
if (journalEntry.Progress >= thresholds[0]) return 1;
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
@ -96,10 +96,15 @@ export const upgradesController: RequestHandler = async (req, res) => {
|
|||||||
case "/Lotus/Types/Items/MiscItems/WeaponPrimaryArcaneUnlocker":
|
case "/Lotus/Types/Items/MiscItems/WeaponPrimaryArcaneUnlocker":
|
||||||
case "/Lotus/Types/Items/MiscItems/WeaponSecondaryArcaneUnlocker":
|
case "/Lotus/Types/Items/MiscItems/WeaponSecondaryArcaneUnlocker":
|
||||||
case "/Lotus/Types/Items/MiscItems/WeaponMeleeArcaneUnlocker":
|
case "/Lotus/Types/Items/MiscItems/WeaponMeleeArcaneUnlocker":
|
||||||
case "/Lotus/Types/Items/MiscItems/WeaponAmpArcaneUnlocker": {
|
case "/Lotus/Types/Items/MiscItems/WeaponAmpArcaneUnlocker":
|
||||||
|
case "/Lotus/Types/Items/MiscItems/WeaponArchGunArcaneUnlocker": {
|
||||||
const item = inventory[payload.ItemCategory].id(payload.ItemId.$oid)!;
|
const item = inventory[payload.ItemCategory].id(payload.ItemId.$oid)!;
|
||||||
item.Features ??= 0;
|
item.Features ??= 0;
|
||||||
item.Features |= EquipmentFeatures.ARCANE_SLOT;
|
if (operation.OperationType == "UOT_ARCANE_UNLOCK_1") {
|
||||||
|
item.Features |= EquipmentFeatures.SECOND_ARCANE_SLOT;
|
||||||
|
} else {
|
||||||
|
item.Features |= EquipmentFeatures.ARCANE_SLOT;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "/Lotus/Types/Items/MiscItems/ValenceAdapter": {
|
case "/Lotus/Types/Items/MiscItems/ValenceAdapter": {
|
||||||
|
|||||||
24
src/controllers/custom/removeIsNewController.ts
Normal file
24
src/controllers/custom/removeIsNewController.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
|
import type { RequestHandler } from "express";
|
||||||
|
import { equipmentKeys } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
|
import { broadcastInventoryUpdate } from "../../services/wsService.ts";
|
||||||
|
|
||||||
|
export const removeIsNewController: RequestHandler = async (req, res) => {
|
||||||
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
const filteredEquipmentKeys = equipmentKeys.filter(k => k !== "CrewShipWeapons" && k !== "CrewShipSalvagedWeapons");
|
||||||
|
const inventory = await getInventory(accountId, [...filteredEquipmentKeys, "WeaponSkins"].join(" "));
|
||||||
|
for (const key of filteredEquipmentKeys) {
|
||||||
|
if (key in inventory) {
|
||||||
|
for (const equipment of inventory[key]) {
|
||||||
|
if (equipment.IsNew) equipment.IsNew = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (const equipment of inventory.WeaponSkins) {
|
||||||
|
if (equipment.IsNew) equipment.IsNew = false;
|
||||||
|
}
|
||||||
|
await inventory.save();
|
||||||
|
res.end();
|
||||||
|
broadcastInventoryUpdate(req);
|
||||||
|
};
|
||||||
@ -88,7 +88,9 @@ import type {
|
|||||||
IGoalProgressDatabase,
|
IGoalProgressDatabase,
|
||||||
IGoalProgressClient,
|
IGoalProgressClient,
|
||||||
IKubrowPetPrintClient,
|
IKubrowPetPrintClient,
|
||||||
IKubrowPetPrintDatabase
|
IKubrowPetPrintDatabase,
|
||||||
|
INokkoColony,
|
||||||
|
IJournalEntry
|
||||||
} from "../../types/inventoryTypes/inventoryTypes.ts";
|
} from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { equipmentKeys } from "../../types/inventoryTypes/inventoryTypes.ts";
|
import { equipmentKeys } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import type { IOid, ITypeCount } from "../../types/commonTypes.ts";
|
import type { IOid, ITypeCount } from "../../types/commonTypes.ts";
|
||||||
@ -1424,6 +1426,22 @@ const hubNpcCustomizationSchema = new Schema<IHubNpcCustomization>(
|
|||||||
{ _id: false }
|
{ _id: false }
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const journalEntrySchema = new Schema<IJournalEntry>(
|
||||||
|
{
|
||||||
|
EntryType: String,
|
||||||
|
Progress: Number
|
||||||
|
},
|
||||||
|
{ _id: false }
|
||||||
|
);
|
||||||
|
|
||||||
|
const nokkoColonySchema = new Schema<INokkoColony>(
|
||||||
|
{
|
||||||
|
FeedLevel: Number,
|
||||||
|
JournalEntries: [journalEntrySchema]
|
||||||
|
},
|
||||||
|
{ _id: false }
|
||||||
|
);
|
||||||
|
|
||||||
const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
|
const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
|
||||||
{
|
{
|
||||||
accountOwnerId: Schema.Types.ObjectId,
|
accountOwnerId: Schema.Types.ObjectId,
|
||||||
@ -1840,7 +1858,9 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
|
|||||||
|
|
||||||
ClaimedJunctionChallengeRewards: { type: [String], default: undefined },
|
ClaimedJunctionChallengeRewards: { type: [String], default: undefined },
|
||||||
|
|
||||||
SpecialItemRewardAttenuation: { type: [rewardAttenutationSchema], default: undefined }
|
SpecialItemRewardAttenuation: { type: [rewardAttenutationSchema], default: undefined },
|
||||||
|
|
||||||
|
NokkoColony: { type: nokkoColonySchema, default: undefined }
|
||||||
},
|
},
|
||||||
{ timestamps: { createdAt: "Created", updatedAt: false } }
|
{ timestamps: { createdAt: "Created", updatedAt: false } }
|
||||||
);
|
);
|
||||||
|
|||||||
@ -50,6 +50,7 @@ import { dronesController } from "../controllers/api/dronesController.ts";
|
|||||||
import { endlessXpController } from "../controllers/api/endlessXpController.ts";
|
import { endlessXpController } from "../controllers/api/endlessXpController.ts";
|
||||||
import { entratiLabConquestModeController } from "../controllers/api/entratiLabConquestModeController.ts";
|
import { entratiLabConquestModeController } from "../controllers/api/entratiLabConquestModeController.ts";
|
||||||
import { evolveWeaponController } from "../controllers/api/evolveWeaponController.ts";
|
import { evolveWeaponController } from "../controllers/api/evolveWeaponController.ts";
|
||||||
|
import { feedPrinceController } from "../controllers/api/feedPrinceController.ts";
|
||||||
import { findSessionsController } from "../controllers/api/findSessionsController.ts";
|
import { findSessionsController } from "../controllers/api/findSessionsController.ts";
|
||||||
import { fishmongerController } from "../controllers/api/fishmongerController.ts";
|
import { fishmongerController } from "../controllers/api/fishmongerController.ts";
|
||||||
import { focusController } from "../controllers/api/focusController.ts";
|
import { focusController } from "../controllers/api/focusController.ts";
|
||||||
@ -116,6 +117,7 @@ import { removeFromGuildController } from "../controllers/api/removeFromGuildCon
|
|||||||
import { removeIgnoredUserController } from "../controllers/api/removeIgnoredUserController.ts";
|
import { removeIgnoredUserController } from "../controllers/api/removeIgnoredUserController.ts";
|
||||||
import { renamePetController } from "../controllers/api/renamePetController.ts";
|
import { renamePetController } from "../controllers/api/renamePetController.ts";
|
||||||
import { rerollRandomModController } from "../controllers/api/rerollRandomModController.ts";
|
import { rerollRandomModController } from "../controllers/api/rerollRandomModController.ts";
|
||||||
|
import { researchMushroomController } from "../controllers/api/researchMushroomController.ts";
|
||||||
import { resetQuestProgressController } from "../controllers/api/resetQuestProgressController.ts";
|
import { resetQuestProgressController } from "../controllers/api/resetQuestProgressController.ts";
|
||||||
import { retrievePetFromStasisController } from "../controllers/api/retrievePetFromStasisController.ts";
|
import { retrievePetFromStasisController } from "../controllers/api/retrievePetFromStasisController.ts";
|
||||||
import { saveDialogueController } from "../controllers/api/saveDialogueController.ts";
|
import { saveDialogueController } from "../controllers/api/saveDialogueController.ts";
|
||||||
@ -271,6 +273,7 @@ apiRouter.post("/drones.php", dronesController);
|
|||||||
apiRouter.post("/endlessXp.php", endlessXpController);
|
apiRouter.post("/endlessXp.php", endlessXpController);
|
||||||
apiRouter.post("/entratiLabConquestMode.php", entratiLabConquestModeController);
|
apiRouter.post("/entratiLabConquestMode.php", entratiLabConquestModeController);
|
||||||
apiRouter.post("/evolveWeapon.php", evolveWeaponController);
|
apiRouter.post("/evolveWeapon.php", evolveWeaponController);
|
||||||
|
apiRouter.post("/feedPrince.php", feedPrinceController);
|
||||||
apiRouter.post("/findSessions.php", findSessionsController);
|
apiRouter.post("/findSessions.php", findSessionsController);
|
||||||
apiRouter.post("/fishmonger.php", fishmongerController);
|
apiRouter.post("/fishmonger.php", fishmongerController);
|
||||||
apiRouter.post("/focus.php", focusController);
|
apiRouter.post("/focus.php", focusController);
|
||||||
@ -318,6 +321,7 @@ apiRouter.post("/removeFromGuild.php", removeFromGuildController);
|
|||||||
apiRouter.post("/removeIgnoredUser.php", removeIgnoredUserController);
|
apiRouter.post("/removeIgnoredUser.php", removeIgnoredUserController);
|
||||||
apiRouter.post("/renamePet.php", renamePetController);
|
apiRouter.post("/renamePet.php", renamePetController);
|
||||||
apiRouter.post("/rerollRandomMod.php", rerollRandomModController);
|
apiRouter.post("/rerollRandomMod.php", rerollRandomModController);
|
||||||
|
apiRouter.post("/researchMushroom.php", researchMushroomController);
|
||||||
apiRouter.post("/retrievePetFromStasis.php", retrievePetFromStasisController);
|
apiRouter.post("/retrievePetFromStasis.php", retrievePetFromStasisController);
|
||||||
apiRouter.post("/saveDialogue.php", saveDialogueController);
|
apiRouter.post("/saveDialogue.php", saveDialogueController);
|
||||||
apiRouter.post("/saveLoadout.php", saveLoadoutController);
|
apiRouter.post("/saveLoadout.php", saveLoadoutController);
|
||||||
|
|||||||
@ -22,6 +22,7 @@ import { unlockAllScansController } from "../controllers/custom/unlockAllScansCo
|
|||||||
import { unlockAllShipFeaturesController } from "../controllers/custom/unlockAllShipFeaturesController.ts";
|
import { unlockAllShipFeaturesController } from "../controllers/custom/unlockAllShipFeaturesController.ts";
|
||||||
import { unlockAllCapturaScenesController } from "../controllers/custom/unlockAllCapturaScenesController.ts";
|
import { unlockAllCapturaScenesController } from "../controllers/custom/unlockAllCapturaScenesController.ts";
|
||||||
import { removeCustomizationController } from "../controllers/custom/removeCustomizationController.ts";
|
import { removeCustomizationController } from "../controllers/custom/removeCustomizationController.ts";
|
||||||
|
import { removeIsNewController } from "../controllers/custom/removeIsNewController.ts";
|
||||||
|
|
||||||
import { abilityOverrideController } from "../controllers/custom/abilityOverrideController.ts";
|
import { abilityOverrideController } from "../controllers/custom/abilityOverrideController.ts";
|
||||||
import { createAccountController } from "../controllers/custom/createAccountController.ts";
|
import { createAccountController } from "../controllers/custom/createAccountController.ts";
|
||||||
@ -73,6 +74,7 @@ customRouter.get("/unlockAllScans", unlockAllScansController);
|
|||||||
customRouter.get("/unlockAllShipFeatures", unlockAllShipFeaturesController);
|
customRouter.get("/unlockAllShipFeatures", unlockAllShipFeaturesController);
|
||||||
customRouter.get("/unlockAllCapturaScenes", unlockAllCapturaScenesController);
|
customRouter.get("/unlockAllCapturaScenes", unlockAllCapturaScenesController);
|
||||||
customRouter.get("/removeCustomization", removeCustomizationController);
|
customRouter.get("/removeCustomization", removeCustomizationController);
|
||||||
|
customRouter.get("/removeIsNew", removeIsNewController);
|
||||||
|
|
||||||
customRouter.post("/abilityOverride", abilityOverrideController);
|
customRouter.post("/abilityOverride", abilityOverrideController);
|
||||||
customRouter.post("/createAccount", createAccountController);
|
customRouter.post("/createAccount", createAccountController);
|
||||||
|
|||||||
@ -1391,7 +1391,10 @@ export const addStanding = (
|
|||||||
|
|
||||||
// TODO: AffiliationMods support (Nightwave).
|
// TODO: AffiliationMods support (Nightwave).
|
||||||
export const updateGeneric = async (data: IGenericUpdate, accountId: string): Promise<IUpdateNodeIntrosResponse> => {
|
export const updateGeneric = async (data: IGenericUpdate, accountId: string): Promise<IUpdateNodeIntrosResponse> => {
|
||||||
const inventory = await getInventory(accountId, "NodeIntrosCompleted MiscItems ShipDecorations");
|
const inventory = await getInventory(
|
||||||
|
accountId,
|
||||||
|
"NodeIntrosCompleted MiscItems ShipDecorations FlavourItems WeaponSkins"
|
||||||
|
);
|
||||||
|
|
||||||
// Make it an array for easier parsing.
|
// Make it an array for easier parsing.
|
||||||
if (typeof data.NodeIntrosCompleted === "string") {
|
if (typeof data.NodeIntrosCompleted === "string") {
|
||||||
@ -1400,6 +1403,12 @@ export const updateGeneric = async (data: IGenericUpdate, accountId: string): Pr
|
|||||||
|
|
||||||
const inventoryChanges: IInventoryChanges = {};
|
const inventoryChanges: IInventoryChanges = {};
|
||||||
for (const node of data.NodeIntrosCompleted) {
|
for (const node of data.NodeIntrosCompleted) {
|
||||||
|
if (inventory.NodeIntrosCompleted.indexOf(node) != -1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
inventory.NodeIntrosCompleted.push(node);
|
||||||
|
logger.debug(`completed dialogue/cutscene for ${node}`);
|
||||||
|
|
||||||
if (node == "TC2025") {
|
if (node == "TC2025") {
|
||||||
inventoryChanges.ShipDecorations = [
|
inventoryChanges.ShipDecorations = [
|
||||||
{
|
{
|
||||||
@ -1420,16 +1429,15 @@ export const updateGeneric = async (data: IGenericUpdate, accountId: string): Pr
|
|||||||
await addEmailItem(inventory, "/Lotus/Types/Items/EmailItems/BeatCaliberChicksEmailItem", inventoryChanges);
|
await addEmailItem(inventory, "/Lotus/Types/Items/EmailItems/BeatCaliberChicksEmailItem", inventoryChanges);
|
||||||
} else if (node == "ClearedFiveLoops") {
|
} else if (node == "ClearedFiveLoops") {
|
||||||
await addEmailItem(inventory, "/Lotus/Types/Items/EmailItems/ClearedFiveLoopsEmailItem", inventoryChanges);
|
await addEmailItem(inventory, "/Lotus/Types/Items/EmailItems/ClearedFiveLoopsEmailItem", inventoryChanges);
|
||||||
|
} else if (node == "NokkoVisions_AllCompleted") {
|
||||||
|
addCustomization(
|
||||||
|
inventory,
|
||||||
|
"/Lotus/Types/StoreItems/AvatarImages/Warframes/NokkoBabySecretGlyph",
|
||||||
|
inventoryChanges
|
||||||
|
);
|
||||||
|
addSkin(inventory, "/Lotus/Upgrades/Skins/Clan/NokkoBabySecretEmblemItem", inventoryChanges);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Combine the two arrays into one.
|
|
||||||
data.NodeIntrosCompleted = inventory.NodeIntrosCompleted.concat(data.NodeIntrosCompleted);
|
|
||||||
|
|
||||||
// Remove duplicate entries.
|
|
||||||
const nodes = [...new Set(data.NodeIntrosCompleted)];
|
|
||||||
|
|
||||||
inventory.NodeIntrosCompleted = nodes;
|
|
||||||
await inventory.save();
|
await inventory.save();
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@ -2172,7 +2180,7 @@ export const addMissionComplete = (inventory: TInventoryDatabaseDocument, { Tag,
|
|||||||
|
|
||||||
if (itemIndex !== -1) {
|
if (itemIndex !== -1) {
|
||||||
Missions[itemIndex].Completes += Completes;
|
Missions[itemIndex].Completes += Completes;
|
||||||
if (Tier) {
|
if (Completes && Tier) {
|
||||||
Missions[itemIndex].Tier = Tier;
|
Missions[itemIndex].Tier = Tier;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -310,6 +310,9 @@ export const addMissionInventoryUpdates = async (
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "Missions":
|
||||||
|
addMissionComplete(inventory, value);
|
||||||
|
break;
|
||||||
case "LastRegionPlayed":
|
case "LastRegionPlayed":
|
||||||
if (!(config.unfaithfulBugFixes?.ignore1999LastRegionPlayed && value === "1999MapName")) {
|
if (!(config.unfaithfulBugFixes?.ignore1999LastRegionPlayed && value === "1999MapName")) {
|
||||||
inventory.LastRegionPlayed = value;
|
inventory.LastRegionPlayed = value;
|
||||||
@ -1242,9 +1245,6 @@ export const addMissionRewards = async (
|
|||||||
if (missions && missions.Tag in ExportRegions) {
|
if (missions && missions.Tag in ExportRegions) {
|
||||||
const node = ExportRegions[missions.Tag];
|
const node = ExportRegions[missions.Tag];
|
||||||
|
|
||||||
// cannot add this with normal updates because { Tier: 1 } would mark the SP node as completed even on a failure
|
|
||||||
addMissionComplete(inventory, missions);
|
|
||||||
|
|
||||||
//node based credit rewards for mission completion
|
//node based credit rewards for mission completion
|
||||||
if (isEligibleForCreditReward(rewardInfo, missions, node)) {
|
if (isEligibleForCreditReward(rewardInfo, missions, node)) {
|
||||||
const levelCreditReward = getLevelCreditRewards(node);
|
const levelCreditReward = getLevelCreditRewards(node);
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import { addFixedLevelRewards } from "./missionInventoryUpdateService.ts";
|
|||||||
import type { IInventoryChanges } from "../types/purchaseTypes.ts";
|
import type { IInventoryChanges } from "../types/purchaseTypes.ts";
|
||||||
import questCompletionItems from "../../static/fixed_responses/questCompletionRewards.json" with { type: "json" };
|
import questCompletionItems from "../../static/fixed_responses/questCompletionRewards.json" with { type: "json" };
|
||||||
import type { ITypeCount } from "../types/commonTypes.ts";
|
import type { ITypeCount } from "../types/commonTypes.ts";
|
||||||
|
import { addString } from "../helpers/stringHelpers.ts";
|
||||||
|
|
||||||
export interface IUpdateQuestRequest {
|
export interface IUpdateQuestRequest {
|
||||||
QuestKeys: IQuestKeyClient[];
|
QuestKeys: IQuestKeyClient[];
|
||||||
@ -175,6 +176,11 @@ export const completeQuest = async (
|
|||||||
existingQuestKey.Completed = true;
|
existingQuestKey.Completed = true;
|
||||||
existingQuestKey.CompletionDate = new Date();
|
existingQuestKey.CompletionDate = new Date();
|
||||||
await handleQuestCompletion(inventory, questKey, undefined, run > 0);
|
await handleQuestCompletion(inventory, questKey, undefined, run > 0);
|
||||||
|
|
||||||
|
if (questKey == "/Lotus/Types/Keys/ModQuest/ModQuestKeyChain") {
|
||||||
|
// This would be set by the client during the equilogue, but since we're cheating through, we have to do it ourselves.
|
||||||
|
addString(inventory.NodeIntrosCompleted, "ModQuestTeshinAccess");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return existingQuestKey.toJSON<IQuestKeyClient>();
|
return existingQuestKey.toJSON<IQuestKeyClient>();
|
||||||
|
|||||||
@ -25,6 +25,7 @@ export enum EquipmentFeatures {
|
|||||||
GRAVIMAG_INSTALLED = 4,
|
GRAVIMAG_INSTALLED = 4,
|
||||||
GILDED = 8,
|
GILDED = 8,
|
||||||
ARCANE_SLOT = 32,
|
ARCANE_SLOT = 32,
|
||||||
|
SECOND_ARCANE_SLOT = 64,
|
||||||
INCARNON_GENESIS = 512,
|
INCARNON_GENESIS = 512,
|
||||||
VALENCE_SWAP = 1024
|
VALENCE_SWAP = 1024
|
||||||
}
|
}
|
||||||
|
|||||||
@ -436,6 +436,7 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
|
|||||||
Ship?: IOrbiterClient; // U22 and below, response only
|
Ship?: IOrbiterClient; // U22 and below, response only
|
||||||
ClaimedJunctionChallengeRewards?: string[]; // U39
|
ClaimedJunctionChallengeRewards?: string[]; // U39
|
||||||
SpecialItemRewardAttenuation?: IRewardAttenuation[]; // Baro's Void Surplus
|
SpecialItemRewardAttenuation?: IRewardAttenuation[]; // Baro's Void Surplus
|
||||||
|
NokkoColony?: INokkoColony; // Field Guide
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IAffiliation {
|
export interface IAffiliation {
|
||||||
@ -1220,3 +1221,13 @@ export interface IHubNpcCustomization {
|
|||||||
Pattern: string;
|
Pattern: string;
|
||||||
Tag: string;
|
Tag: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IJournalEntry {
|
||||||
|
EntryType: string;
|
||||||
|
Progress: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface INokkoColony {
|
||||||
|
FeedLevel: number;
|
||||||
|
JournalEntries: IJournalEntry[];
|
||||||
|
}
|
||||||
|
|||||||
@ -136,5 +136,7 @@
|
|||||||
"ConquestSetupIntro",
|
"ConquestSetupIntro",
|
||||||
"EntratiLabConquestHardModeUnlocked",
|
"EntratiLabConquestHardModeUnlocked",
|
||||||
"/Lotus/Language/Npcs/KonzuPostNewWar",
|
"/Lotus/Language/Npcs/KonzuPostNewWar",
|
||||||
"/Lotus/Language/SolarisVenus/EudicoPostNewWar"
|
"/Lotus/Language/SolarisVenus/EudicoPostNewWar",
|
||||||
|
"/Lotus/Language/NokkoColony/NokkoVendorName",
|
||||||
|
"NokkoVisions_FirstVisit"
|
||||||
]
|
]
|
||||||
|
|||||||
@ -558,6 +558,7 @@
|
|||||||
<button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['ShipDecorations']);" data-loc="inventory_bulkAddShipDecorations"></button>
|
<button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['ShipDecorations']);" data-loc="inventory_bulkAddShipDecorations"></button>
|
||||||
<button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['WeaponSkins']);" data-loc="inventory_bulkAddWeaponSkins"></button>
|
<button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['WeaponSkins']);" data-loc="inventory_bulkAddWeaponSkins"></button>
|
||||||
<button class="btn btn-primary" onclick="debounce(addMissingEvolutionProgress);" data-loc="inventory_bulkAddEvolutionProgress"></button>
|
<button class="btn btn-primary" onclick="debounce(addMissingEvolutionProgress);" data-loc="inventory_bulkAddEvolutionProgress"></button>
|
||||||
|
<button class="btn btn-primary" onclick="removeIsNew();" data-loc="inventory_removeIsNew"></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-2 d-flex flex-wrap gap-2">
|
<div class="mb-2 d-flex flex-wrap gap-2">
|
||||||
<button class="btn btn-success" onclick="debounce(maxRankAllEquipment, ['Suits']);" data-loc="inventory_bulkRankUpSuits"></button>
|
<button class="btn btn-success" onclick="debounce(maxRankAllEquipment, ['Suits']);" data-loc="inventory_bulkRankUpSuits"></button>
|
||||||
|
|||||||
@ -559,7 +559,7 @@ function fetchItemList() {
|
|||||||
});
|
});
|
||||||
} else if (type == "Syndicates") {
|
} else if (type == "Syndicates") {
|
||||||
items.forEach(item => {
|
items.forEach(item => {
|
||||||
if (item.uniqueName === "ConclaveSyndicate") {
|
if (["ConclaveSyndicate", "NightcapJournalSyndicate"].includes(item.uniqueName)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (item.uniqueName.startsWith("RadioLegion")) {
|
if (item.uniqueName.startsWith("RadioLegion")) {
|
||||||
@ -2177,6 +2177,15 @@ function removeCustomization(uniqueName) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function removeIsNew() {
|
||||||
|
revalidateAuthz().then(() => {
|
||||||
|
const req = $.get("/custom/removeIsNew?" + window.authz);
|
||||||
|
req.done(() => {
|
||||||
|
updateInventory();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function getRequiredParts(category, WeaponType) {
|
function getRequiredParts(category, WeaponType) {
|
||||||
switch (category) {
|
switch (category) {
|
||||||
case "Hoverboards":
|
case "Hoverboards":
|
||||||
|
|||||||
@ -135,6 +135,7 @@ dict = {
|
|||||||
inventory_bulkRankUpSentinelWeapons: `Alle Wächter-Waffen auf Max. Rang`,
|
inventory_bulkRankUpSentinelWeapons: `Alle Wächter-Waffen auf Max. Rang`,
|
||||||
inventory_bulkRankUpEvolutionProgress: `Alle Incarnon-Entwicklungsfortschritte auf Max. Rang`,
|
inventory_bulkRankUpEvolutionProgress: `Alle Incarnon-Entwicklungsfortschritte auf Max. Rang`,
|
||||||
inventory_maxPlexus: `Plexus auf Max. Rang`,
|
inventory_maxPlexus: `Plexus auf Max. Rang`,
|
||||||
|
inventory_removeIsNew: `[UNTRANSLATED] Remove New Equipment Exclamation Icon`,
|
||||||
|
|
||||||
quests_list: `Quests`,
|
quests_list: `Quests`,
|
||||||
quests_completeAll: `Alle Quests abschließen`,
|
quests_completeAll: `Alle Quests abschließen`,
|
||||||
|
|||||||
@ -134,6 +134,7 @@ dict = {
|
|||||||
inventory_bulkRankUpSentinelWeapons: `Max Rank All Sentinel Weapons`,
|
inventory_bulkRankUpSentinelWeapons: `Max Rank All Sentinel Weapons`,
|
||||||
inventory_bulkRankUpEvolutionProgress: `Max Rank All Incarnon Evolution Progress`,
|
inventory_bulkRankUpEvolutionProgress: `Max Rank All Incarnon Evolution Progress`,
|
||||||
inventory_maxPlexus: `Max Rank Plexus`,
|
inventory_maxPlexus: `Max Rank Plexus`,
|
||||||
|
inventory_removeIsNew: `Remove New Equipment Exclamation Icon`,
|
||||||
|
|
||||||
quests_list: `Quests`,
|
quests_list: `Quests`,
|
||||||
quests_completeAll: `Complete All Quests`,
|
quests_completeAll: `Complete All Quests`,
|
||||||
|
|||||||
@ -135,6 +135,7 @@ dict = {
|
|||||||
inventory_bulkRankUpSentinelWeapons: `Maximizar rango de todas las armas de centinela`,
|
inventory_bulkRankUpSentinelWeapons: `Maximizar rango de todas las armas de centinela`,
|
||||||
inventory_bulkRankUpEvolutionProgress: `Maximizar todo el progreso de evolución Incarnon`,
|
inventory_bulkRankUpEvolutionProgress: `Maximizar todo el progreso de evolución Incarnon`,
|
||||||
inventory_maxPlexus: `Rango máximo de Plexus`,
|
inventory_maxPlexus: `Rango máximo de Plexus`,
|
||||||
|
inventory_removeIsNew: `[UNTRANSLATED] Remove New Equipment Exclamation Icon`,
|
||||||
|
|
||||||
quests_list: `Misiones`,
|
quests_list: `Misiones`,
|
||||||
quests_completeAll: `Completar todas las misiones`,
|
quests_completeAll: `Completar todas las misiones`,
|
||||||
|
|||||||
@ -135,6 +135,7 @@ dict = {
|
|||||||
inventory_bulkRankUpSentinelWeapons: `Toutes les armes de Sentinelles au rang max`,
|
inventory_bulkRankUpSentinelWeapons: `Toutes les armes de Sentinelles au rang max`,
|
||||||
inventory_bulkRankUpEvolutionProgress: `Toutes les évolutions Incarnon au rang max`,
|
inventory_bulkRankUpEvolutionProgress: `Toutes les évolutions Incarnon au rang max`,
|
||||||
inventory_maxPlexus: `Plexus au rang max`,
|
inventory_maxPlexus: `Plexus au rang max`,
|
||||||
|
inventory_removeIsNew: `[UNTRANSLATED] Remove New Equipment Exclamation Icon`,
|
||||||
|
|
||||||
quests_list: `Quêtes`,
|
quests_list: `Quêtes`,
|
||||||
quests_completeAll: `Compléter toutes les quêtes`,
|
quests_completeAll: `Compléter toutes les quêtes`,
|
||||||
|
|||||||
@ -135,6 +135,7 @@ dict = {
|
|||||||
inventory_bulkRankUpSentinelWeapons: `Макс. ранг всего оружия Стражей`,
|
inventory_bulkRankUpSentinelWeapons: `Макс. ранг всего оружия Стражей`,
|
||||||
inventory_bulkRankUpEvolutionProgress: `Макс. ранг всех эволюций Инкарнонов`,
|
inventory_bulkRankUpEvolutionProgress: `Макс. ранг всех эволюций Инкарнонов`,
|
||||||
inventory_maxPlexus: `Макс. ранг Плексуса`,
|
inventory_maxPlexus: `Макс. ранг Плексуса`,
|
||||||
|
inventory_removeIsNew: `Удалить значок восклицательного знака нового снаряжения`,
|
||||||
|
|
||||||
quests_list: `Квесты`,
|
quests_list: `Квесты`,
|
||||||
quests_completeAll: `Завершить все квесты`,
|
quests_completeAll: `Завершить все квесты`,
|
||||||
|
|||||||
@ -135,6 +135,7 @@ dict = {
|
|||||||
inventory_bulkRankUpSentinelWeapons: `Макс. рівень всієї зброї Вартових`,
|
inventory_bulkRankUpSentinelWeapons: `Макс. рівень всієї зброї Вартових`,
|
||||||
inventory_bulkRankUpEvolutionProgress: `Макс. рівень всіх еволюцій Інкарнонів`,
|
inventory_bulkRankUpEvolutionProgress: `Макс. рівень всіх еволюцій Інкарнонів`,
|
||||||
inventory_maxPlexus: `Макс. рівень Плексу`,
|
inventory_maxPlexus: `Макс. рівень Плексу`,
|
||||||
|
inventory_removeIsNew: `[UNTRANSLATED] Remove New Equipment Exclamation Icon`,
|
||||||
|
|
||||||
quests_list: `Пригоди`,
|
quests_list: `Пригоди`,
|
||||||
quests_completeAll: `Закінчити всі пригоди`,
|
quests_completeAll: `Закінчити всі пригоди`,
|
||||||
|
|||||||
@ -135,6 +135,7 @@ dict = {
|
|||||||
inventory_bulkRankUpSentinelWeapons: `所有守护武器升满级`,
|
inventory_bulkRankUpSentinelWeapons: `所有守护武器升满级`,
|
||||||
inventory_bulkRankUpEvolutionProgress: `所有灵化之源进度最大等级`,
|
inventory_bulkRankUpEvolutionProgress: `所有灵化之源进度最大等级`,
|
||||||
inventory_maxPlexus: `最大深控等级`,
|
inventory_maxPlexus: `最大深控等级`,
|
||||||
|
inventory_removeIsNew: `[UNTRANSLATED] Remove New Equipment Exclamation Icon`,
|
||||||
|
|
||||||
quests_list: `系列任务`,
|
quests_list: `系列任务`,
|
||||||
quests_completeAll: `完成所有任务`,
|
quests_completeAll: `完成所有任务`,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user