Compare commits
9 Commits
08b09e783e
...
9d5d3f17bf
Author | SHA1 | Date | |
---|---|---|---|
9d5d3f17bf | |||
d28437b658 | |||
a6d2c8b18a | |||
0c884576bd | |||
380f0662a4 | |||
bd83738168 | |||
fa68a1357d | |||
43f3917b09 | |||
8ebb749732 |
20
src/controllers/api/giveShipDecoAndLoreFragmentController.ts
Normal file
20
src/controllers/api/giveShipDecoAndLoreFragmentController.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||||
|
import { addLoreFragmentScans, addShipDecorations, getInventory } from "@/src/services/inventoryService";
|
||||||
|
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||||
|
import { ILoreFragmentScan, ITypeCount } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||||
|
import { RequestHandler } from "express";
|
||||||
|
|
||||||
|
export const giveShipDecoAndLoreFragmentController: RequestHandler = async (req, res) => {
|
||||||
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
const inventory = await getInventory(accountId, "LoreFragmentScans ShipDecorations");
|
||||||
|
const data = getJSONfromString<IGiveShipDecoAndLoreFragmentRequest>(String(req.body));
|
||||||
|
addLoreFragmentScans(inventory, data.LoreFragmentScans);
|
||||||
|
addShipDecorations(inventory, data.ShipDecorations);
|
||||||
|
await inventory.save();
|
||||||
|
res.end();
|
||||||
|
};
|
||||||
|
|
||||||
|
interface IGiveShipDecoAndLoreFragmentRequest {
|
||||||
|
LoreFragmentScans: ILoreFragmentScan[];
|
||||||
|
ShipDecorations: ITypeCount[];
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||||
import { ISetPlacedDecoInfoRequest } from "@/src/types/shipTypes";
|
import { IPictureFrameInfo, ISetPlacedDecoInfoRequest } from "@/src/types/shipTypes";
|
||||||
import { RequestHandler } from "express";
|
import { RequestHandler } from "express";
|
||||||
import { handleSetPlacedDecoInfo } from "@/src/services/shipCustomizationsService";
|
import { handleSetPlacedDecoInfo } from "@/src/services/shipCustomizationsService";
|
||||||
|
|
||||||
@ -7,5 +7,17 @@ export const setPlacedDecoInfoController: RequestHandler = async (req, res) => {
|
|||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
const payload = JSON.parse(req.body as string) as ISetPlacedDecoInfoRequest;
|
const payload = JSON.parse(req.body as string) as ISetPlacedDecoInfoRequest;
|
||||||
await handleSetPlacedDecoInfo(accountId, payload);
|
await handleSetPlacedDecoInfo(accountId, payload);
|
||||||
res.end();
|
res.json({
|
||||||
|
DecoId: payload.DecoId,
|
||||||
|
IsPicture: true,
|
||||||
|
PictureFrameInfo: payload.PictureFrameInfo,
|
||||||
|
BootLocation: payload.BootLocation
|
||||||
|
} satisfies ISetPlacedDecoInfoResponse);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
interface ISetPlacedDecoInfoResponse {
|
||||||
|
DecoId: string;
|
||||||
|
IsPicture: boolean;
|
||||||
|
PictureFrameInfo?: IPictureFrameInfo;
|
||||||
|
BootLocation?: string;
|
||||||
|
}
|
||||||
|
@ -25,7 +25,13 @@ export const upgradesController: RequestHandler = async (req, res) => {
|
|||||||
operation.UpgradeRequirement == "/Lotus/Types/Items/MiscItems/CustomizationSlotUnlocker"
|
operation.UpgradeRequirement == "/Lotus/Types/Items/MiscItems/CustomizationSlotUnlocker"
|
||||||
) {
|
) {
|
||||||
updateCurrency(inventory, 10, true);
|
updateCurrency(inventory, 10, true);
|
||||||
} else if (operation.OperationType != "UOT_ABILITY_OVERRIDE") {
|
} else if (
|
||||||
|
operation.OperationType != "UOT_SWAP_POLARITY" &&
|
||||||
|
operation.OperationType != "UOT_ABILITY_OVERRIDE"
|
||||||
|
) {
|
||||||
|
if (!operation.UpgradeRequirement) {
|
||||||
|
throw new Error(`${operation.OperationType} operation should be free?`);
|
||||||
|
}
|
||||||
addMiscItems(inventory, [
|
addMiscItems(inventory, [
|
||||||
{
|
{
|
||||||
ItemType: operation.UpgradeRequirement,
|
ItemType: operation.UpgradeRequirement,
|
||||||
|
@ -62,6 +62,7 @@ import { gildWeaponController } from "@/src/controllers/api/gildWeaponController
|
|||||||
import { giveKeyChainTriggeredItemsController } from "@/src/controllers/api/giveKeyChainTriggeredItemsController";
|
import { giveKeyChainTriggeredItemsController } from "@/src/controllers/api/giveKeyChainTriggeredItemsController";
|
||||||
import { giveKeyChainTriggeredMessageController } from "@/src/controllers/api/giveKeyChainTriggeredMessageController";
|
import { giveKeyChainTriggeredMessageController } from "@/src/controllers/api/giveKeyChainTriggeredMessageController";
|
||||||
import { giveQuestKeyRewardController } from "@/src/controllers/api/giveQuestKey";
|
import { giveQuestKeyRewardController } from "@/src/controllers/api/giveQuestKey";
|
||||||
|
import { giveShipDecoAndLoreFragmentController } from "@/src/controllers/api/giveShipDecoAndLoreFragmentController";
|
||||||
import { giveStartingGearController } from "@/src/controllers/api/giveStartingGearController";
|
import { giveStartingGearController } from "@/src/controllers/api/giveStartingGearController";
|
||||||
import { guildTechController } from "@/src/controllers/api/guildTechController";
|
import { guildTechController } from "@/src/controllers/api/guildTechController";
|
||||||
import { hostSessionController } from "@/src/controllers/api/hostSessionController";
|
import { hostSessionController } from "@/src/controllers/api/hostSessionController";
|
||||||
@ -239,6 +240,7 @@ apiRouter.post("/gildWeapon.php", gildWeaponController);
|
|||||||
apiRouter.post("/giveKeyChainTriggeredItems.php", giveKeyChainTriggeredItemsController);
|
apiRouter.post("/giveKeyChainTriggeredItems.php", giveKeyChainTriggeredItemsController);
|
||||||
apiRouter.post("/giveKeyChainTriggeredMessage.php", giveKeyChainTriggeredMessageController);
|
apiRouter.post("/giveKeyChainTriggeredMessage.php", giveKeyChainTriggeredMessageController);
|
||||||
apiRouter.post("/giveQuestKeyReward.php", giveQuestKeyRewardController);
|
apiRouter.post("/giveQuestKeyReward.php", giveQuestKeyRewardController);
|
||||||
|
apiRouter.post("/giveShipDecoAndLoreFragment.php", giveShipDecoAndLoreFragmentController);
|
||||||
apiRouter.post("/giveStartingGear.php", giveStartingGearController);
|
apiRouter.post("/giveStartingGear.php", giveStartingGearController);
|
||||||
apiRouter.post("/guildTech.php", guildTechController);
|
apiRouter.post("/guildTech.php", guildTechController);
|
||||||
apiRouter.post("/hostSession.php", hostSessionController);
|
apiRouter.post("/hostSession.php", hostSessionController);
|
||||||
|
@ -21,7 +21,8 @@ import {
|
|||||||
ICalendarProgress,
|
ICalendarProgress,
|
||||||
IDroneClient,
|
IDroneClient,
|
||||||
IUpgradeClient,
|
IUpgradeClient,
|
||||||
TPartialStartingGear
|
TPartialStartingGear,
|
||||||
|
ILoreFragmentScan
|
||||||
} from "@/src/types/inventoryTypes/inventoryTypes";
|
} from "@/src/types/inventoryTypes/inventoryTypes";
|
||||||
import { IGenericUpdate, IUpdateNodeIntrosResponse } from "../types/genericUpdate";
|
import { IGenericUpdate, IUpdateNodeIntrosResponse } from "../types/genericUpdate";
|
||||||
import { IKeyChainRequest, IMissionInventoryUpdateRequest } from "../types/requestTypes";
|
import { IKeyChainRequest, IMissionInventoryUpdateRequest } from "../types/requestTypes";
|
||||||
@ -1350,6 +1351,17 @@ export const addFocusXpIncreases = (inventory: TInventoryDatabaseDocument, focus
|
|||||||
inventory.DailyFocus -= focusXpPlus.reduce((a, b) => a + b, 0);
|
inventory.DailyFocus -= focusXpPlus.reduce((a, b) => a + b, 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const addLoreFragmentScans = (inventory: TInventoryDatabaseDocument, arr: ILoreFragmentScan[]): void => {
|
||||||
|
arr.forEach(clientFragment => {
|
||||||
|
const fragment = inventory.LoreFragmentScans.find(x => x.ItemType == clientFragment.ItemType);
|
||||||
|
if (fragment) {
|
||||||
|
fragment.Progress += clientFragment.Progress;
|
||||||
|
} else {
|
||||||
|
inventory.LoreFragmentScans.push(clientFragment);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
export const addChallenges = (
|
export const addChallenges = (
|
||||||
inventory: TInventoryDatabaseDocument,
|
inventory: TInventoryDatabaseDocument,
|
||||||
ChallengeProgress: IChallengeProgress[],
|
ChallengeProgress: IChallengeProgress[],
|
||||||
|
@ -23,6 +23,7 @@ import {
|
|||||||
addGearExpByCategory,
|
addGearExpByCategory,
|
||||||
addItem,
|
addItem,
|
||||||
addLevelKeys,
|
addLevelKeys,
|
||||||
|
addLoreFragmentScans,
|
||||||
addMiscItems,
|
addMiscItems,
|
||||||
addMissionComplete,
|
addMissionComplete,
|
||||||
addMods,
|
addMods,
|
||||||
@ -297,14 +298,7 @@ export const addMissionInventoryUpdates = async (
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "LoreFragmentScans":
|
case "LoreFragmentScans":
|
||||||
value.forEach(clientFragment => {
|
addLoreFragmentScans(inventory, value);
|
||||||
const fragment = inventory.LoreFragmentScans.find(x => x.ItemType == clientFragment.ItemType);
|
|
||||||
if (fragment) {
|
|
||||||
fragment.Progress += clientFragment.Progress;
|
|
||||||
} else {
|
|
||||||
inventory.LoreFragmentScans.push(clientFragment);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
break;
|
break;
|
||||||
case "LibraryScans":
|
case "LibraryScans":
|
||||||
value.forEach(scan => {
|
value.forEach(scan => {
|
||||||
@ -603,7 +597,14 @@ 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 (node.missionIndex !== 28) {
|
if (
|
||||||
|
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
|
||||||
|
) {
|
||||||
const levelCreditReward = getLevelCreditRewards(node);
|
const levelCreditReward = getLevelCreditRewards(node);
|
||||||
missionCompletionCredits += levelCreditReward;
|
missionCompletionCredits += levelCreditReward;
|
||||||
inventory.RegularCredits += levelCreditReward;
|
inventory.RegularCredits += levelCreditReward;
|
||||||
@ -909,6 +910,12 @@ function getLevelCreditRewards(node: IRegion): number {
|
|||||||
|
|
||||||
function getRandomMissionDrops(RewardInfo: IRewardInfo, tierOverride: number | undefined): IMissionReward[] {
|
function getRandomMissionDrops(RewardInfo: IRewardInfo, tierOverride: number | undefined): IMissionReward[] {
|
||||||
const drops: IMissionReward[] = [];
|
const drops: IMissionReward[] = [];
|
||||||
|
if (RewardInfo.periodicMissionTag?.startsWith("HardDaily")) {
|
||||||
|
drops.push({
|
||||||
|
StoreItem: "/Lotus/StoreItems/Types/Items/MiscItems/SteelEssence",
|
||||||
|
ItemCount: 5
|
||||||
|
});
|
||||||
|
}
|
||||||
if (RewardInfo.node in ExportRegions) {
|
if (RewardInfo.node in ExportRegions) {
|
||||||
const region = ExportRegions[RewardInfo.node];
|
const region = ExportRegions[RewardInfo.node];
|
||||||
let rewardManifests: string[] =
|
let rewardManifests: string[] =
|
||||||
@ -933,7 +940,7 @@ function getRandomMissionDrops(RewardInfo: IRewardInfo, tierOverride: number | u
|
|||||||
|
|
||||||
if (syndicateEntry.Tag === "EntratiSyndicate") {
|
if (syndicateEntry.Tag === "EntratiSyndicate") {
|
||||||
const vault = syndicateEntry.Jobs.find(j => j.locationTag === locationTag);
|
const vault = syndicateEntry.Jobs.find(j => j.locationTag === locationTag);
|
||||||
if (vault) job = vault;
|
if (vault && locationTag) job = vault;
|
||||||
// if (
|
// if (
|
||||||
// [
|
// [
|
||||||
// "DeimosRuinsExterminateBounty",
|
// "DeimosRuinsExterminateBounty",
|
||||||
@ -1008,8 +1015,10 @@ function getRandomMissionDrops(RewardInfo: IRewardInfo, tierOverride: number | u
|
|||||||
(RewardInfo.JobStage === job.xpAmounts.length - 1 || job.isVault) &&
|
(RewardInfo.JobStage === job.xpAmounts.length - 1 || job.isVault) &&
|
||||||
!isEndlessJob
|
!isEndlessJob
|
||||||
) {
|
) {
|
||||||
rewardManifests.push(job.rewards);
|
if (ExportRewards[job.rewards]) {
|
||||||
rotations.push(ExportRewards[job.rewards].length - 1);
|
rewardManifests.push(job.rewards);
|
||||||
|
rotations.push(ExportRewards[job.rewards].length - 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1065,17 +1074,20 @@ function getRandomMissionDrops(RewardInfo: IRewardInfo, tierOverride: number | u
|
|||||||
logger.debug(`generating random mission rewards`, { rewardManifests, rotations });
|
logger.debug(`generating random mission rewards`, { rewardManifests, rotations });
|
||||||
}
|
}
|
||||||
const rng = new SRng(BigInt(RewardInfo.rewardSeed ?? generateRewardSeed()) ^ 0xffffffffffffffffn);
|
const rng = new SRng(BigInt(RewardInfo.rewardSeed ?? generateRewardSeed()) ^ 0xffffffffffffffffn);
|
||||||
rewardManifests
|
rewardManifests.forEach(name => {
|
||||||
.map(name => ExportRewards[name])
|
const table = ExportRewards[name];
|
||||||
.forEach(table => {
|
if (!table) {
|
||||||
for (const rotation of rotations) {
|
logger.error(`unknown droptable: ${name}`);
|
||||||
const rotationRewards = table[rotation];
|
return;
|
||||||
const drop = getRandomRewardByChance(rotationRewards, rng);
|
}
|
||||||
if (drop) {
|
for (const rotation of rotations) {
|
||||||
drops.push({ StoreItem: drop.type, ItemCount: drop.itemCount });
|
const rotationRewards = table[rotation];
|
||||||
}
|
const drop = getRandomRewardByChance(rotationRewards, rng);
|
||||||
|
if (drop) {
|
||||||
|
drops.push({ StoreItem: drop.type, ItemCount: drop.itemCount });
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (region.cacheRewardManifest && RewardInfo.EnemyCachesFound) {
|
if (region.cacheRewardManifest && RewardInfo.EnemyCachesFound) {
|
||||||
const deck = ExportRewards[region.cacheRewardManifest];
|
const deck = ExportRewards[region.cacheRewardManifest];
|
||||||
|
@ -139,7 +139,7 @@ dict = {
|
|||||||
cheats_noVendorPurchaseLimits: `Keine Kaufbeschränkungen bei Händlern`,
|
cheats_noVendorPurchaseLimits: `Keine Kaufbeschränkungen bei Händlern`,
|
||||||
cheats_noKimCooldowns: `Keine Wartezeit bei KIM`,
|
cheats_noKimCooldowns: `Keine Wartezeit bei KIM`,
|
||||||
cheats_instantResourceExtractorDrones: `Sofortige Ressourcen-Extraktor-Drohnen`,
|
cheats_instantResourceExtractorDrones: `Sofortige Ressourcen-Extraktor-Drohnen`,
|
||||||
cheats_noResourceExtractorDronesDamage: `[UNTRANSLATED] No Resource Extractor Drones Damage`,
|
cheats_noResourceExtractorDronesDamage: `Kein Schaden für Ressourcen-Extraktor-Drohnen`,
|
||||||
cheats_noDojoRoomBuildStage: `Kein Dojo-Raum-Bauvorgang`,
|
cheats_noDojoRoomBuildStage: `Kein Dojo-Raum-Bauvorgang`,
|
||||||
cheats_noDojoDecoBuildStage: `Kein Dojo-Deko-Bauvorgang`,
|
cheats_noDojoDecoBuildStage: `Kein Dojo-Deko-Bauvorgang`,
|
||||||
cheats_fastDojoRoomDestruction: `Schnelle Dojo-Raum-Zerstörung`,
|
cheats_fastDojoRoomDestruction: `Schnelle Dojo-Raum-Zerstörung`,
|
||||||
|
@ -139,7 +139,7 @@ dict = {
|
|||||||
cheats_noVendorPurchaseLimits: `Sin límite de compras de vendedores`,
|
cheats_noVendorPurchaseLimits: `Sin límite de compras de vendedores`,
|
||||||
cheats_noKimCooldowns: `Sin tiempo de espera para conversaciones KIM`,
|
cheats_noKimCooldowns: `Sin tiempo de espera para conversaciones KIM`,
|
||||||
cheats_instantResourceExtractorDrones: `Drones de extracción de recursos instantáneos`,
|
cheats_instantResourceExtractorDrones: `Drones de extracción de recursos instantáneos`,
|
||||||
cheats_noResourceExtractorDronesDamage: `[UNTRANSLATED] No Resource Extractor Drones Damage`,
|
cheats_noResourceExtractorDronesDamage: `Sin daño a los drones extractores de recursos`,
|
||||||
cheats_noDojoRoomBuildStage: `Sin etapa de construcción de sala del dojo`,
|
cheats_noDojoRoomBuildStage: `Sin etapa de construcción de sala del dojo`,
|
||||||
cheats_noDojoDecoBuildStage: `Sin etapa de construcción de decoraciones del dojo`,
|
cheats_noDojoDecoBuildStage: `Sin etapa de construcción de decoraciones del dojo`,
|
||||||
cheats_fastDojoRoomDestruction: `Destrucción rápida de salas del dojo`,
|
cheats_fastDojoRoomDestruction: `Destrucción rápida de salas del dojo`,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user