Implement Place of face
hideout area
Implement adding/removing favorite items
This commit is contained in:
parent
d1b9cbbfc5
commit
ca7958afed
@ -20,6 +20,7 @@ import { IInventoryToggleRequestData } from "@spt-aki/models/eft/inventory/IInve
|
|||||||
import { IInventoryTransferRequestData } from "@spt-aki/models/eft/inventory/IInventoryTransferRequestData";
|
import { IInventoryTransferRequestData } from "@spt-aki/models/eft/inventory/IInventoryTransferRequestData";
|
||||||
import { IOpenRandomLootContainerRequestData } from "@spt-aki/models/eft/inventory/IOpenRandomLootContainerRequestData";
|
import { IOpenRandomLootContainerRequestData } from "@spt-aki/models/eft/inventory/IOpenRandomLootContainerRequestData";
|
||||||
import { IRedeemProfileRequestData } from "@spt-aki/models/eft/inventory/IRedeemProfileRequestData";
|
import { IRedeemProfileRequestData } from "@spt-aki/models/eft/inventory/IRedeemProfileRequestData";
|
||||||
|
import { ISetFavoriteItems } from "@spt-aki/models/eft/inventory/ISetFavoriteItems";
|
||||||
import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse";
|
import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse";
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
@ -165,4 +166,11 @@ export class InventoryCallbacks
|
|||||||
{
|
{
|
||||||
return this.inventoryController.redeemProfileReward(pmcData, body, sessionId)
|
return this.inventoryController.redeemProfileReward(pmcData, body, sessionId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public setFavoriteItem(pmcData: IPmcData,
|
||||||
|
body: ISetFavoriteItems,
|
||||||
|
sessionId: string): IItemEventRouterResponse
|
||||||
|
{
|
||||||
|
return this.inventoryController.setFavoriteItem(pmcData, body, sessionId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ import { IInventoryToggleRequestData } from "@spt-aki/models/eft/inventory/IInve
|
|||||||
import { IInventoryTransferRequestData } from "@spt-aki/models/eft/inventory/IInventoryTransferRequestData";
|
import { IInventoryTransferRequestData } from "@spt-aki/models/eft/inventory/IInventoryTransferRequestData";
|
||||||
import { IOpenRandomLootContainerRequestData } from "@spt-aki/models/eft/inventory/IOpenRandomLootContainerRequestData";
|
import { IOpenRandomLootContainerRequestData } from "@spt-aki/models/eft/inventory/IOpenRandomLootContainerRequestData";
|
||||||
import { IRedeemProfileRequestData } from "@spt-aki/models/eft/inventory/IRedeemProfileRequestData";
|
import { IRedeemProfileRequestData } from "@spt-aki/models/eft/inventory/IRedeemProfileRequestData";
|
||||||
|
import { ISetFavoriteItems } from "@spt-aki/models/eft/inventory/ISetFavoriteItems";
|
||||||
import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse";
|
import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse";
|
||||||
import { BackendErrorCodes } from "@spt-aki/models/enums/BackendErrorCodes";
|
import { BackendErrorCodes } from "@spt-aki/models/enums/BackendErrorCodes";
|
||||||
import { SkillTypes } from "@spt-aki/models/enums/SkillTypes";
|
import { SkillTypes } from "@spt-aki/models/enums/SkillTypes";
|
||||||
@ -987,4 +988,30 @@ export class InventoryController
|
|||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public setFavoriteItem(pmcData: IPmcData, request: ISetFavoriteItems, sessionId: string): IItemEventRouterResponse
|
||||||
|
{
|
||||||
|
const output = this.eventOutputHolder.getOutput(sessionId);
|
||||||
|
|
||||||
|
if (!pmcData.Inventory.favoriteItems)
|
||||||
|
{
|
||||||
|
pmcData.Inventory.favoriteItems = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const itemId of request.items)
|
||||||
|
{
|
||||||
|
// If id already exists in array, we're removing it
|
||||||
|
const indexOfItemAlreadyFavorited = pmcData.Inventory.favoriteItems.findIndex(x => x === itemId);
|
||||||
|
if (indexOfItemAlreadyFavorited > -1)
|
||||||
|
{
|
||||||
|
pmcData.Inventory.favoriteItems.splice(indexOfItemAlreadyFavorited, 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pmcData.Inventory.favoriteItems.push(itemId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
export enum HideoutAreas
|
export enum HideoutAreas {
|
||||||
{
|
|
||||||
NOTSET = -1,
|
NOTSET = -1,
|
||||||
VENTS = 0,
|
VENTS = 0,
|
||||||
SECURITY = 1,
|
SECURITY = 1,
|
||||||
@ -26,5 +25,5 @@ export enum HideoutAreas
|
|||||||
EMERGENCY_WALL = 22,
|
EMERGENCY_WALL = 22,
|
||||||
GYM = 23,
|
GYM = 23,
|
||||||
WEAPON_STAND = 24,
|
WEAPON_STAND = 24,
|
||||||
WEAPON_STAND_SECONDARY = 25,
|
WEAPON_STAND_SECONDARY = 25
|
||||||
}
|
}
|
||||||
|
@ -23,5 +23,6 @@ export enum ItemEventActions {
|
|||||||
REMOVE_BUILD = "RemoveBuild",
|
REMOVE_BUILD = "RemoveBuild",
|
||||||
SAVE_EQUIPMENT_BUILD = "SaveEquipmentBuild",
|
SAVE_EQUIPMENT_BUILD = "SaveEquipmentBuild",
|
||||||
REMOVE_EQUIPMENT_BUILD = "RemoveEquipmentBuild",
|
REMOVE_EQUIPMENT_BUILD = "RemoveEquipmentBuild",
|
||||||
REDEEM_PROFILE_REWARD = "RedeemProfileReward"
|
REDEEM_PROFILE_REWARD = "RedeemProfileReward",
|
||||||
|
SET_FAVORITE_ITEMS = "SetFavoriteItems"
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,7 @@ export class InventoryItemEventRouter extends ItemEventRouterDefinition
|
|||||||
new HandledRoute(ItemEventActions.OPEN_RANDOM_LOOT_CONTAINER, false),
|
new HandledRoute(ItemEventActions.OPEN_RANDOM_LOOT_CONTAINER, false),
|
||||||
new HandledRoute(ItemEventActions.HIDEOUT_QTE_EVENT, false),
|
new HandledRoute(ItemEventActions.HIDEOUT_QTE_EVENT, false),
|
||||||
new HandledRoute(ItemEventActions.REDEEM_PROFILE_REWARD, false),
|
new HandledRoute(ItemEventActions.REDEEM_PROFILE_REWARD, false),
|
||||||
|
new HandledRoute(ItemEventActions.SET_FAVORITE_ITEMS, false),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,6 +94,8 @@ export class InventoryItemEventRouter extends ItemEventRouterDefinition
|
|||||||
return this.hideoutCallbacks.handleQTEEvent(pmcData, body, sessionID);
|
return this.hideoutCallbacks.handleQTEEvent(pmcData, body, sessionID);
|
||||||
case ItemEventActions.REDEEM_PROFILE_REWARD:
|
case ItemEventActions.REDEEM_PROFILE_REWARD:
|
||||||
return this.inventoryCallbacks.redeemProfileReward(pmcData, body, sessionID);
|
return this.inventoryCallbacks.redeemProfileReward(pmcData, body, sessionID);
|
||||||
|
case ItemEventActions.SET_FAVORITE_ITEMS:
|
||||||
|
return this.inventoryCallbacks.setFavoriteItem(pmcData, body, sessionID);
|
||||||
default:
|
default:
|
||||||
throw new Error(`Unhandled event ${url}`);
|
throw new Error(`Unhandled event ${url}`);
|
||||||
}
|
}
|
||||||
|
@ -76,6 +76,7 @@ export class ProfileFixerService
|
|||||||
this.addMissingWallImprovements(pmcProfile);
|
this.addMissingWallImprovements(pmcProfile);
|
||||||
this.addMissingHideoutWallAreas(pmcProfile);
|
this.addMissingHideoutWallAreas(pmcProfile);
|
||||||
this.addMissingGunStandContainerImprovements(pmcProfile);
|
this.addMissingGunStandContainerImprovements(pmcProfile);
|
||||||
|
this.addMissingHallOfFameContainerImprovements(pmcProfile);
|
||||||
this.ensureGunStandLevelsMatch(pmcProfile);
|
this.ensureGunStandLevelsMatch(pmcProfile);
|
||||||
|
|
||||||
this.removeResourcesFromSlotsInHideoutWithoutLocationIndexValue(pmcProfile);
|
this.removeResourcesFromSlotsInHideoutWithoutLocationIndexValue(pmcProfile);
|
||||||
@ -284,6 +285,70 @@ export class ProfileFixerService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected addMissingHallOfFameContainerImprovements(pmcProfile: IPmcData): void
|
||||||
|
{
|
||||||
|
const placeOfFameArea = pmcProfile.Hideout.Areas.find((x) => x.type === HideoutAreas.PLACE_OF_FAME);
|
||||||
|
if (!placeOfFameArea || placeOfFameArea.level === 0)
|
||||||
|
{
|
||||||
|
// No place of fame in profile or its level 0, skip
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const db = this.databaseServer.getTables();
|
||||||
|
const placeOfFameAreaDb = db.hideout.areas.find((x) => x.type === HideoutAreas.PLACE_OF_FAME);
|
||||||
|
const stageCurrentlyAt = placeOfFameAreaDb.stages[placeOfFameArea.level];
|
||||||
|
const placeOfFameStashId = pmcProfile.Inventory.hideoutAreaStashes[HideoutAreas.PLACE_OF_FAME];
|
||||||
|
|
||||||
|
// `hideoutAreaStashes` empty but profile has built gun stand
|
||||||
|
if (!placeOfFameStashId && stageCurrentlyAt)
|
||||||
|
{
|
||||||
|
// Value is missing, add it
|
||||||
|
pmcProfile.Inventory.hideoutAreaStashes[HideoutAreas.PLACE_OF_FAME] = placeOfFameAreaDb._id;
|
||||||
|
|
||||||
|
// Add stash item to profile
|
||||||
|
const placeOfFameStashItem = pmcProfile.Inventory.items.find((x) => x._id === placeOfFameAreaDb._id);
|
||||||
|
if (placeOfFameStashItem)
|
||||||
|
{
|
||||||
|
placeOfFameStashItem._tpl = stageCurrentlyAt.container;
|
||||||
|
this.logger.debug(
|
||||||
|
`Updated existing place of fame inventory stash: ${placeOfFameStashItem._id} tpl to ${stageCurrentlyAt.container}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pmcProfile.Inventory.items.push({ _id: placeOfFameAreaDb._id, _tpl: stageCurrentlyAt.container });
|
||||||
|
this.logger.debug(
|
||||||
|
`Added missing place of fame inventory stash: ${placeOfFameAreaDb._id} tpl to ${stageCurrentlyAt.container}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let stashItem = pmcProfile.Inventory.items?.find((x) => x._id === placeOfFameAreaDb._id);
|
||||||
|
if (!stashItem)
|
||||||
|
{
|
||||||
|
// Stand inventory stash item doesnt exist, add it
|
||||||
|
pmcProfile.Inventory.items.push(
|
||||||
|
{
|
||||||
|
_id: placeOfFameAreaDb._id,
|
||||||
|
_tpl: stageCurrentlyAt.container
|
||||||
|
}
|
||||||
|
)
|
||||||
|
stashItem = pmcProfile.Inventory.items?.find((x) => x._id === placeOfFameAreaDb._id)
|
||||||
|
}
|
||||||
|
|
||||||
|
// `hideoutAreaStashes` has value related stash inventory items tpl doesnt match what's expected
|
||||||
|
if (placeOfFameStashId && stashItem._tpl !== stageCurrentlyAt.container)
|
||||||
|
{
|
||||||
|
this.logger.debug(
|
||||||
|
`primary Stash tpl was: ${stashItem._tpl}, but should be ${stageCurrentlyAt.container}, updating`,
|
||||||
|
);
|
||||||
|
// The id inside the profile does not match what the hideout db value is, out of sync, adjust
|
||||||
|
stashItem._tpl = stageCurrentlyAt.container;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected ensureGunStandLevelsMatch(pmcProfile: IPmcData): void
|
protected ensureGunStandLevelsMatch(pmcProfile: IPmcData): void
|
||||||
{
|
{
|
||||||
// only proceed if stand is level 1 or above
|
// only proceed if stand is level 1 or above
|
||||||
|
Loading…
Reference in New Issue
Block a user