feat: modular weapon crafting (#317)
This commit is contained in:
parent
e8d7e17611
commit
aec6a96495
55
src/controllers/api/modularWeaponCraftingController.ts
Normal file
55
src/controllers/api/modularWeaponCraftingController.ts
Normal file
@ -0,0 +1,55 @@
|
||||
import { RequestHandler } from "express";
|
||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||
import { WeaponTypeInternal } from "@/src/services/itemDataService";
|
||||
import { getInventory, updateCurrency, addWeapon, addMiscItems } from "@/src/services/inventoryService";
|
||||
|
||||
const modularWeaponTypes: Record<string, WeaponTypeInternal> = {
|
||||
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryBeam": "LongGuns",
|
||||
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary": "Pistols",
|
||||
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryBeam": "Pistols",
|
||||
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryShotgun": "Pistols",
|
||||
"/Lotus/Weapons/Ostron/Melee/LotusModularWeapon": "Melee",
|
||||
"/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon": "OperatorAmps"
|
||||
};
|
||||
|
||||
interface IModularCraftRequest {
|
||||
WeaponType: string;
|
||||
Parts: string[];
|
||||
}
|
||||
|
||||
export const modularWeaponCraftingController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const data: IModularCraftRequest = getJSONfromString(req.body.toString());
|
||||
if (!(data.WeaponType in modularWeaponTypes)) {
|
||||
throw new Error(`unknown modular weapon type: ${data.WeaponType}`);
|
||||
}
|
||||
const category = modularWeaponTypes[data.WeaponType];
|
||||
|
||||
// Give weapon
|
||||
const weapon = await addWeapon(category, data.WeaponType, accountId, data.Parts);
|
||||
|
||||
// Remove 4000 credits
|
||||
const currencyChanges = await updateCurrency(4000, false, accountId);
|
||||
|
||||
// Remove parts
|
||||
const miscItemChanges = [];
|
||||
for (const part of data.Parts) {
|
||||
miscItemChanges.push({
|
||||
ItemType: part,
|
||||
ItemCount: -1
|
||||
});
|
||||
}
|
||||
const inventory = await getInventory(accountId);
|
||||
addMiscItems(inventory, miscItemChanges);
|
||||
await inventory.save();
|
||||
|
||||
// Tell client what we did
|
||||
res.json({
|
||||
InventoryChanges: {
|
||||
...currencyChanges,
|
||||
[category]: [weapon],
|
||||
MiscItems: miscItemChanges
|
||||
}
|
||||
});
|
||||
};
|
@ -43,7 +43,9 @@ const getItemListsController: RequestHandler = (_req, res) => {
|
||||
item.category == "Misc" ||
|
||||
item.category == "Resources" ||
|
||||
item.category == "Fish" ||
|
||||
((item as any).productCategory == "Pistols" && (item as MinWeapon).totalDamage == 0)
|
||||
((item as any).productCategory == "Pistols" &&
|
||||
(item as MinWeapon).totalDamage == 0 &&
|
||||
!item.excludeFromCodex) // exclude Zaw Strike PvP variant
|
||||
)
|
||||
),
|
||||
mods,
|
||||
|
@ -921,6 +921,7 @@ type InventoryDocumentProps = {
|
||||
LongGuns: Types.DocumentArray<IEquipmentDatabase>;
|
||||
Pistols: Types.DocumentArray<IEquipmentDatabase>;
|
||||
Melee: Types.DocumentArray<IEquipmentDatabase>;
|
||||
OperatorAmps: Types.DocumentArray<IEquipmentDatabase>;
|
||||
FlavourItems: Types.DocumentArray<IFlavourItem>;
|
||||
RawUpgrades: Types.DocumentArray<IRawUpgrade>;
|
||||
Upgrades: Types.DocumentArray<ICrewShipSalvagedWeaponSkin>;
|
||||
|
@ -56,6 +56,7 @@ import { syndicateSacrificeController } from "../controllers/api/syndicateSacrif
|
||||
import { startDojoRecipeController } from "@/src/controllers/api/startDojoRecipeController";
|
||||
import { queueDojoComponentDestructionController } from "@/src/controllers/api/queueDojoComponentDestructionController";
|
||||
import { nameWeaponController } from "@/src/controllers/api/nameWeaponController";
|
||||
import { modularWeaponCraftingController } from "@/src/controllers/api/modularWeaponCraftingController";
|
||||
|
||||
const apiRouter = express.Router();
|
||||
|
||||
@ -122,5 +123,6 @@ apiRouter.post("/guildTech.php", guildTechController);
|
||||
apiRouter.post("/syndicateSacrifice.php", syndicateSacrificeController);
|
||||
apiRouter.post("/startDojoRecipe.php", startDojoRecipeController);
|
||||
apiRouter.post("/nameWeapon.php", nameWeaponController);
|
||||
apiRouter.post("/modularWeaponCrafting.php", modularWeaponCraftingController);
|
||||
|
||||
export { apiRouter };
|
||||
|
@ -386,20 +386,23 @@ export const syndicateSacrifice = async (
|
||||
export const addWeapon = async (
|
||||
weaponType: WeaponTypeInternal,
|
||||
weaponName: string,
|
||||
accountId: string
|
||||
accountId: string,
|
||||
modularParts: string[] | undefined = undefined
|
||||
): Promise<IEquipmentClient> => {
|
||||
const inventory = await getInventory(accountId);
|
||||
|
||||
let weaponIndex;
|
||||
switch (weaponType) {
|
||||
case "LongGuns":
|
||||
weaponIndex = inventory.LongGuns.push({ ItemType: weaponName, Configs: [], XP: 0 });
|
||||
break;
|
||||
case "Pistols":
|
||||
weaponIndex = inventory.Pistols.push({ ItemType: weaponName, Configs: [], XP: 0 });
|
||||
break;
|
||||
case "Melee":
|
||||
weaponIndex = inventory.Melee.push({ ItemType: weaponName, Configs: [], XP: 0 });
|
||||
case "OperatorAmps":
|
||||
weaponIndex = inventory[weaponType].push({
|
||||
ItemType: weaponName,
|
||||
Configs: [],
|
||||
XP: 0,
|
||||
ModularParts: modularParts
|
||||
});
|
||||
break;
|
||||
default:
|
||||
throw new Error("unknown weapon type: " + weaponType);
|
||||
|
@ -96,6 +96,10 @@ window.itemListPromise = new Promise(resolve => {
|
||||
"/Lotus/Weapons/Tenno/Rifle/LotusRifle": { name: "Rifle" },
|
||||
"/Lotus/Weapons/Tenno/Shotgun/LotusShotgun": { name: "Shotgun" },
|
||||
// Modular weapons
|
||||
"/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryBeam": { name: "Kitgun" },
|
||||
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary": { name: "Kitgun" },
|
||||
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryBeam": { name: "Kitgun" },
|
||||
"/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryShotgun": { name: "Kitgun" },
|
||||
"/Lotus/Weapons/Ostron/Melee/LotusModularWeapon": { name: "Zaw" },
|
||||
// Missing in data sources
|
||||
"/Lotus/Upgrades/CosmeticEnhancers/Peculiars/CyoteMod": { name: "Traumatic Peculiar" }
|
||||
@ -524,7 +528,7 @@ function doAcquireMiscItems() {
|
||||
MiscItems: [
|
||||
{
|
||||
ItemType: uniqueName,
|
||||
ItemCount: $("#miscitem-count").val()
|
||||
ItemCount: parseInt($("#miscitem-count").val())
|
||||
}
|
||||
]
|
||||
})
|
||||
|
Loading…
x
Reference in New Issue
Block a user