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 == "Misc" ||
|
||||||
item.category == "Resources" ||
|
item.category == "Resources" ||
|
||||||
item.category == "Fish" ||
|
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,
|
mods,
|
||||||
|
@ -921,6 +921,7 @@ type InventoryDocumentProps = {
|
|||||||
LongGuns: Types.DocumentArray<IEquipmentDatabase>;
|
LongGuns: Types.DocumentArray<IEquipmentDatabase>;
|
||||||
Pistols: Types.DocumentArray<IEquipmentDatabase>;
|
Pistols: Types.DocumentArray<IEquipmentDatabase>;
|
||||||
Melee: Types.DocumentArray<IEquipmentDatabase>;
|
Melee: Types.DocumentArray<IEquipmentDatabase>;
|
||||||
|
OperatorAmps: Types.DocumentArray<IEquipmentDatabase>;
|
||||||
FlavourItems: Types.DocumentArray<IFlavourItem>;
|
FlavourItems: Types.DocumentArray<IFlavourItem>;
|
||||||
RawUpgrades: Types.DocumentArray<IRawUpgrade>;
|
RawUpgrades: Types.DocumentArray<IRawUpgrade>;
|
||||||
Upgrades: Types.DocumentArray<ICrewShipSalvagedWeaponSkin>;
|
Upgrades: Types.DocumentArray<ICrewShipSalvagedWeaponSkin>;
|
||||||
|
@ -56,6 +56,7 @@ import { syndicateSacrificeController } from "../controllers/api/syndicateSacrif
|
|||||||
import { startDojoRecipeController } from "@/src/controllers/api/startDojoRecipeController";
|
import { startDojoRecipeController } from "@/src/controllers/api/startDojoRecipeController";
|
||||||
import { queueDojoComponentDestructionController } from "@/src/controllers/api/queueDojoComponentDestructionController";
|
import { queueDojoComponentDestructionController } from "@/src/controllers/api/queueDojoComponentDestructionController";
|
||||||
import { nameWeaponController } from "@/src/controllers/api/nameWeaponController";
|
import { nameWeaponController } from "@/src/controllers/api/nameWeaponController";
|
||||||
|
import { modularWeaponCraftingController } from "@/src/controllers/api/modularWeaponCraftingController";
|
||||||
|
|
||||||
const apiRouter = express.Router();
|
const apiRouter = express.Router();
|
||||||
|
|
||||||
@ -122,5 +123,6 @@ apiRouter.post("/guildTech.php", guildTechController);
|
|||||||
apiRouter.post("/syndicateSacrifice.php", syndicateSacrificeController);
|
apiRouter.post("/syndicateSacrifice.php", syndicateSacrificeController);
|
||||||
apiRouter.post("/startDojoRecipe.php", startDojoRecipeController);
|
apiRouter.post("/startDojoRecipe.php", startDojoRecipeController);
|
||||||
apiRouter.post("/nameWeapon.php", nameWeaponController);
|
apiRouter.post("/nameWeapon.php", nameWeaponController);
|
||||||
|
apiRouter.post("/modularWeaponCrafting.php", modularWeaponCraftingController);
|
||||||
|
|
||||||
export { apiRouter };
|
export { apiRouter };
|
||||||
|
@ -386,20 +386,23 @@ export const syndicateSacrifice = async (
|
|||||||
export const addWeapon = async (
|
export const addWeapon = async (
|
||||||
weaponType: WeaponTypeInternal,
|
weaponType: WeaponTypeInternal,
|
||||||
weaponName: string,
|
weaponName: string,
|
||||||
accountId: string
|
accountId: string,
|
||||||
|
modularParts: string[] | undefined = undefined
|
||||||
): Promise<IEquipmentClient> => {
|
): Promise<IEquipmentClient> => {
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(accountId);
|
||||||
|
|
||||||
let weaponIndex;
|
let weaponIndex;
|
||||||
switch (weaponType) {
|
switch (weaponType) {
|
||||||
case "LongGuns":
|
case "LongGuns":
|
||||||
weaponIndex = inventory.LongGuns.push({ ItemType: weaponName, Configs: [], XP: 0 });
|
|
||||||
break;
|
|
||||||
case "Pistols":
|
case "Pistols":
|
||||||
weaponIndex = inventory.Pistols.push({ ItemType: weaponName, Configs: [], XP: 0 });
|
|
||||||
break;
|
|
||||||
case "Melee":
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new Error("unknown weapon type: " + weaponType);
|
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/Rifle/LotusRifle": { name: "Rifle" },
|
||||||
"/Lotus/Weapons/Tenno/Shotgun/LotusShotgun": { name: "Shotgun" },
|
"/Lotus/Weapons/Tenno/Shotgun/LotusShotgun": { name: "Shotgun" },
|
||||||
// Modular weapons
|
// 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" },
|
"/Lotus/Weapons/Ostron/Melee/LotusModularWeapon": { name: "Zaw" },
|
||||||
// Missing in data sources
|
// Missing in data sources
|
||||||
"/Lotus/Upgrades/CosmeticEnhancers/Peculiars/CyoteMod": { name: "Traumatic Peculiar" }
|
"/Lotus/Upgrades/CosmeticEnhancers/Peculiars/CyoteMod": { name: "Traumatic Peculiar" }
|
||||||
@ -524,7 +528,7 @@ function doAcquireMiscItems() {
|
|||||||
MiscItems: [
|
MiscItems: [
|
||||||
{
|
{
|
||||||
ItemType: uniqueName,
|
ItemType: uniqueName,
|
||||||
ItemCount: $("#miscitem-count").val()
|
ItemCount: parseInt($("#miscitem-count").val())
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user