forked from OpenWF/SpaceNinjaServer
		
	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