forked from OpenWF/SpaceNinjaServer
feat: dojo visitors (#2374)
Closes #2373 Reviewed-on: OpenWF/SpaceNinjaServer#2374 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
This commit is contained in:
parent
fd1d72a1cf
commit
a9b3b16d31
8
package-lock.json
generated
8
package-lock.json
generated
@ -23,7 +23,7 @@
|
||||
"ncp": "^2.0.0",
|
||||
"typescript": "^5.5",
|
||||
"undici": "^7.10.0",
|
||||
"warframe-public-export-plus": "^0.5.74",
|
||||
"warframe-public-export-plus": "^0.5.76",
|
||||
"warframe-riven-info": "^0.1.2",
|
||||
"winston": "^3.17.0",
|
||||
"winston-daily-rotate-file": "^5.0.0",
|
||||
@ -3386,9 +3386,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/warframe-public-export-plus": {
|
||||
"version": "0.5.74",
|
||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.74.tgz",
|
||||
"integrity": "sha512-pA7dxA0lKn9w/2Sc97oxnn+CEzL1SrT9XriNLTDF4Xp+2SBEpGcfbqbdR9ljPQJopIbrc9Zy02R+uBQVomcwyA=="
|
||||
"version": "0.5.76",
|
||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.76.tgz",
|
||||
"integrity": "sha512-0gX3NTWaxFyzUmqBSUHhPY8pMRX92iXQFqoBuMQlMG1+6uC6JMKtwP5t8cuXR3pvV2vkaCi/cDWjP1JUChkZ9g=="
|
||||
},
|
||||
"node_modules/warframe-riven-info": {
|
||||
"version": "0.1.2",
|
||||
|
@ -37,7 +37,7 @@
|
||||
"ncp": "^2.0.0",
|
||||
"typescript": "^5.5",
|
||||
"undici": "^7.10.0",
|
||||
"warframe-public-export-plus": "^0.5.74",
|
||||
"warframe-public-export-plus": "^0.5.76",
|
||||
"warframe-riven-info": "^0.1.2",
|
||||
"winston": "^3.17.0",
|
||||
"winston-daily-rotate-file": "^5.0.0",
|
||||
|
@ -5,6 +5,7 @@ import {
|
||||
getGuildVault,
|
||||
hasAccessToDojo,
|
||||
hasGuildPermission,
|
||||
processCompletedGuildTechProject,
|
||||
processFundedGuildTechProject,
|
||||
processGuildTechProjectContributionsUpdate,
|
||||
removePigmentsFromGuildMembers,
|
||||
@ -51,8 +52,12 @@ export const guildTechController: RequestHandler = async (req, res) => {
|
||||
};
|
||||
if (project.CompletionDate) {
|
||||
techProject.CompletionDate = toMongoDate(project.CompletionDate);
|
||||
if (Date.now() >= project.CompletionDate.getTime()) {
|
||||
needSave ||= setGuildTechLogState(guild, project.ItemType, 4, project.CompletionDate);
|
||||
if (
|
||||
Date.now() >= project.CompletionDate.getTime() &&
|
||||
setGuildTechLogState(guild, project.ItemType, 4, project.CompletionDate)
|
||||
) {
|
||||
processCompletedGuildTechProject(guild, project.ItemType);
|
||||
needSave = true;
|
||||
}
|
||||
}
|
||||
techProjects.push(techProject);
|
||||
|
@ -57,8 +57,12 @@ export const placeDecoInComponentController: RequestHandler = async (req, res) =
|
||||
component.DecoCapacity -= meta.capacityCost;
|
||||
}
|
||||
} else {
|
||||
const [itemType, meta] = Object.entries(ExportResources).find(arr => arr[1].deco == deco.Type)!;
|
||||
if (!itemType || meta.dojoCapacityCost === undefined) {
|
||||
const entry = Object.entries(ExportResources).find(arr => arr[1].deco == deco.Type);
|
||||
if (!entry) {
|
||||
throw new Error(`unknown deco type: ${deco.Type}`);
|
||||
}
|
||||
const [itemType, meta] = entry;
|
||||
if (meta.dojoCapacityCost === undefined) {
|
||||
throw new Error(`unknown deco type: ${deco.Type}`);
|
||||
}
|
||||
component.DecoCapacity -= meta.dojoCapacityCost;
|
||||
@ -75,7 +79,13 @@ export const placeDecoInComponentController: RequestHandler = async (req, res) =
|
||||
if (meta) {
|
||||
processDojoBuildMaterialsGathered(guild, meta);
|
||||
}
|
||||
} else if (guild.AutoContributeFromVault && guild.VaultRegularCredits && guild.VaultMiscItems) {
|
||||
} else if (
|
||||
deco.Type.startsWith("/Lotus/Objects/Tenno/Dojo/NpcPlaceables/") ||
|
||||
(guild.AutoContributeFromVault && guild.VaultRegularCredits && guild.VaultMiscItems)
|
||||
) {
|
||||
if (!guild.VaultRegularCredits || !guild.VaultMiscItems) {
|
||||
throw new Error(`dojo visitor placed without anything in vault?!`);
|
||||
}
|
||||
if (guild.VaultRegularCredits >= scaleRequiredCount(guild.Tier, meta.price)) {
|
||||
let enoughMiscItems = true;
|
||||
for (const ingredient of meta.ingredients) {
|
||||
|
@ -550,6 +550,19 @@ export const processFundedGuildTechProject = (
|
||||
guild.XP += recipe.guildXpValue;
|
||||
}
|
||||
setGuildTechLogState(guild, techProject.ItemType, config.noDojoResearchTime ? 4 : 3, techProject.CompletionDate);
|
||||
if (config.noDojoResearchTime) {
|
||||
processCompletedGuildTechProject(guild, techProject.ItemType);
|
||||
}
|
||||
};
|
||||
|
||||
export const processCompletedGuildTechProject = (guild: TGuildDatabaseDocument, type: string): void => {
|
||||
if (type.startsWith("/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/")) {
|
||||
guild.VaultDecoRecipes ??= [];
|
||||
guild.VaultDecoRecipes.push({
|
||||
ItemType: type,
|
||||
ItemCount: 1
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const setGuildTechLogState = (
|
||||
|
@ -64,8 +64,12 @@ export const handleSetShipDecorations = async (
|
||||
throw new Error(`unknown room: ${placedDecoration.Room}`);
|
||||
}
|
||||
|
||||
const [itemType, meta] = Object.entries(ExportResources).find(arr => arr[1].deco == placedDecoration.Type)!;
|
||||
if (!itemType || meta.capacityCost === undefined) {
|
||||
const entry = Object.entries(ExportResources).find(arr => arr[1].deco == placedDecoration.Type);
|
||||
if (!entry) {
|
||||
throw new Error(`unknown deco type: ${placedDecoration.Type}`);
|
||||
}
|
||||
const [itemType, meta] = entry;
|
||||
if (meta.capacityCost === undefined) {
|
||||
throw new Error(`unknown deco type: ${placedDecoration.Type}`);
|
||||
}
|
||||
|
||||
|
@ -92,5 +92,13 @@
|
||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/ThumperTrophySilverRecipe",
|
||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/CorpusPlaceables/GasTurbineConeRecipe",
|
||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NaturalPlaceables/CoralChunkARecipe",
|
||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/TennoPlaceables/TnoBeaconEmitterRecipe"
|
||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/TennoPlaceables/TnoBeaconEmitterRecipe",
|
||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/OstronFemaleSitting",
|
||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/OstronFemaleStanding",
|
||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/OstronMaleStanding",
|
||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/OstronMaleStandingTwo",
|
||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/SolarisForeman",
|
||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/SolarisHazard",
|
||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/SolarisStrikerOne",
|
||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/SolarisStrikerThree"
|
||||
]
|
||||
|
Loading…
x
Reference in New Issue
Block a user