From c6b9ec6872ed879e58806698f1c90e9a2fcb4827 Mon Sep 17 00:00:00 2001 From: StuckInLimbo Date: Tue, 30 May 2023 19:24:58 -0400 Subject: [PATCH 1/4] Update for AKI 3.5.7 changes --- types/callbacks/DialogueCallbacks.d.ts | 2 + types/callbacks/MatchCallbacks.d.ts | 8 ++- types/controllers/GameController.d.ts | 8 ++- types/controllers/InsuranceController.d.ts | 9 ++++ types/controllers/MatchController.d.ts | 3 +- types/generators/ScavCaseRewardGenerator.d.ts | 2 +- types/helpers/ItemHelper.d.ts | 1 + types/helpers/RagfairOfferHelper.d.ts | 49 ++++++++++++++++++- types/helpers/TradeHelper.d.ts | 6 ++- types/models/eft/common/IGlobals.d.ts | 6 +++ types/models/eft/common/ILocationBase.d.ts | 5 +- types/models/eft/common/tables/IBotBase.d.ts | 3 +- .../eft/common/tables/ITemplateItem.d.ts | 18 +++++++ .../eft/dialog/IAcceptFriendRequestData.d.ts | 3 ++ .../eft/game/ICurrentGroupResponse.d.ts | 17 +++++++ .../eft/match/IGetGroupStatusRequestData.d.ts | 2 +- .../eft/match/IJoinMatchRequestData.d.ts | 5 +- types/models/eft/match/IJoinMatchResult.d.ts | 5 ++ .../eft/match/ITransferGroupRequest.d.ts | 3 ++ types/models/eft/profile/IAkiProfile.d.ts | 2 +- .../ScavCaseRewardCountsAndPrices.d.ts | 6 +-- types/services/InsuranceService.d.ts | 8 --- 22 files changed, 142 insertions(+), 29 deletions(-) create mode 100644 types/models/eft/dialog/IAcceptFriendRequestData.d.ts create mode 100644 types/models/eft/game/ICurrentGroupResponse.d.ts create mode 100644 types/models/eft/match/ITransferGroupRequest.d.ts diff --git a/types/callbacks/DialogueCallbacks.d.ts b/types/callbacks/DialogueCallbacks.d.ts index 5630859..4ed6171 100644 --- a/types/callbacks/DialogueCallbacks.d.ts +++ b/types/callbacks/DialogueCallbacks.d.ts @@ -1,6 +1,7 @@ import { DialogueController } from "../controllers/DialogueController"; import { OnUpdate } from "../di/OnUpdate"; import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IAcceptFriendRequestData } from "../models/eft/dialog/IAcceptFriendRequestData"; import { IChatServer } from "../models/eft/dialog/IChatServer"; import { IClearMailMessageRequest } from "../models/eft/dialog/IClearMailMessageRequest"; import { IDeleteFriendRequest } from "../models/eft/dialog/IDeleteFriendRequest"; @@ -61,6 +62,7 @@ export declare class DialogueCallbacks implements OnUpdate { listOutbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; listInbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; sendFriendRequest(url: string, request: IFriendRequestData, sessionID: string): IGetBodyResponseData; + acceptFriendRequest(url: string, request: IAcceptFriendRequestData, sessionID: string): IGetBodyResponseData; deleteFriend(url: string, request: IDeleteFriendRequest, sessionID: string): INullResponseData; sendMessage(url: string, request: ISendMessageRequest, sessionID: string): IGetBodyResponseData; clearMail(url: string, request: IClearMailMessageRequest, sessionID: string): IGetBodyResponseData; diff --git a/types/callbacks/MatchCallbacks.d.ts b/types/callbacks/MatchCallbacks.d.ts index 70a0d60..b9341fd 100644 --- a/types/callbacks/MatchCallbacks.d.ts +++ b/types/callbacks/MatchCallbacks.d.ts @@ -16,6 +16,7 @@ import { IJoinMatchResult } from "../models/eft/match/IJoinMatchResult"; import { IPutMetricsRequestData } from "../models/eft/match/IPutMetricsRequestData"; import { IRemovePlayerFromGroupRequest } from "../models/eft/match/IRemovePlayerFromGroupRequest"; import { ISendGroupInviteRequest } from "../models/eft/match/ISendGroupInviteRequest"; +import { ITransferGroupRequest } from "../models/eft/match/ITransferGroupRequest"; import { IUpdatePingRequestData } from "../models/eft/match/IUpdatePingRequestData"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; @@ -36,11 +37,13 @@ export declare class MatchCallbacks { acceptGroupInvite(url: string, info: IAcceptGroupInviteRequest, sessionID: string): IGetBodyResponseData; /** Handle client/match/group/invite/cancel */ cancelGroupInvite(url: string, info: ICancelGroupInviteRequest, sessionID: string): IGetBodyResponseData; + /** Handle client/match/group/transfer */ + transferGroup(url: string, info: ITransferGroupRequest, sessionID: string): IGetBodyResponseData; cancelAllGroupInvite(url: string, info: any, sessionID: string): INullResponseData; putMetrics(url: string, info: IPutMetricsRequestData, sessionID: string): INullResponseData; getProfile(url: string, info: IGetProfileRequestData, sessionID: string): IGetBodyResponseData; - serverAvailable(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData | IGetBodyResponseData; - joinMatch(url: string, info: IJoinMatchRequestData, sessionID: string): IGetBodyResponseData; + serverAvailable(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + joinMatch(url: string, info: IJoinMatchRequestData, sessionID: string): IGetBodyResponseData; getMetrics(url: string, info: any, sessionID: string): IGetBodyResponseData; /** * Handle client/match/group/status @@ -49,6 +52,7 @@ export declare class MatchCallbacks { getGroupStatus(url: string, info: IGetGroupStatusRequestData, sessionID: string): IGetBodyResponseData; createGroup(url: string, info: ICreateGroupRequestData, sessionID: string): IGetBodyResponseData; deleteGroup(url: string, info: any, sessionID: string): INullResponseData; + leaveGroup(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; removePlayerFromGroup(url: string, info: IRemovePlayerFromGroupRequest, sessionID: string): INullResponseData; endOfflineRaid(url: string, info: IEndOfflineRaidRequestData, sessionID: string): INullResponseData; getRaidConfiguration(url: string, info: IGetRaidConfigurationRequestData, sessionID: string): INullResponseData; diff --git a/types/controllers/GameController.d.ts b/types/controllers/GameController.d.ts index 739c48b..18c8091 100644 --- a/types/controllers/GameController.d.ts +++ b/types/controllers/GameController.d.ts @@ -6,6 +6,7 @@ import { PreAkiModLoader } from "../loaders/PreAkiModLoader"; import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; import { IPmcData } from "../models/eft/common/IPmcData"; import { ICheckVersionResponse } from "../models/eft/game/ICheckVersionResponse"; +import { ICurrentGroupResponse } from "../models/eft/game/ICurrentGroupResponse"; import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse"; import { IServerDetails } from "../models/eft/game/IServerDetails"; import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; @@ -20,6 +21,7 @@ import { LocalisationService } from "../services/LocalisationService"; import { OpenZoneService } from "../services/OpenZoneService"; import { ProfileFixerService } from "../services/ProfileFixerService"; import { SeasonalEventService } from "../services/SeasonalEventService"; +import { EncodingUtil } from "../utils/EncodingUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class GameController { @@ -29,6 +31,7 @@ export declare class GameController { protected timeUtil: TimeUtil; protected preAkiModLoader: PreAkiModLoader; protected httpServerHelper: HttpServerHelper; + protected encodingUtil: EncodingUtil; protected hideoutHelper: HideoutHelper; protected profileHelper: ProfileHelper; protected profileFixerService: ProfileFixerService; @@ -38,10 +41,11 @@ export declare class GameController { protected seasonalEventService: SeasonalEventService; protected applicationContext: ApplicationContext; protected configServer: ConfigServer; + protected os: any; protected httpConfig: IHttpConfig; protected coreConfig: ICoreConfig; protected locationConfig: ILocationConfig; - constructor(logger: ILogger, databaseServer: DatabaseServer, jsonUtil: JsonUtil, timeUtil: TimeUtil, preAkiModLoader: PreAkiModLoader, httpServerHelper: HttpServerHelper, hideoutHelper: HideoutHelper, profileHelper: ProfileHelper, profileFixerService: ProfileFixerService, localisationService: LocalisationService, customLocationWaveService: CustomLocationWaveService, openZoneService: OpenZoneService, seasonalEventService: SeasonalEventService, applicationContext: ApplicationContext, configServer: ConfigServer); + constructor(logger: ILogger, databaseServer: DatabaseServer, jsonUtil: JsonUtil, timeUtil: TimeUtil, preAkiModLoader: PreAkiModLoader, httpServerHelper: HttpServerHelper, encodingUtil: EncodingUtil, hideoutHelper: HideoutHelper, profileHelper: ProfileHelper, profileFixerService: ProfileFixerService, localisationService: LocalisationService, customLocationWaveService: CustomLocationWaveService, openZoneService: OpenZoneService, seasonalEventService: SeasonalEventService, applicationContext: ApplicationContext, configServer: ConfigServer); gameStart(_url: string, _info: IEmptyRequestData, sessionID: string, startTimeStampMS: number): void; /** * BSG have two values for shotgun dispersion, we make sure both have the same value @@ -91,6 +95,6 @@ export declare class GameController { protected logProfileDetails(fullProfile: IAkiProfile): void; getGameConfig(sessionID: string): IGameConfigResponse; getServer(): IServerDetails[]; - getCurrentGroup(sessionId: any): any; + getCurrentGroup(sessionId: string): ICurrentGroupResponse; getValidGameVersion(): ICheckVersionResponse; } diff --git a/types/controllers/InsuranceController.d.ts b/types/controllers/InsuranceController.d.ts index af6e68d..ccbd0a0 100644 --- a/types/controllers/InsuranceController.d.ts +++ b/types/controllers/InsuranceController.d.ts @@ -2,6 +2,7 @@ import { DialogueHelper } from "../helpers/DialogueHelper"; import { ItemHelper } from "../helpers/ItemHelper"; import { ProfileHelper } from "../helpers/ProfileHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; import { IGetInsuranceCostResponseData } from "../models/eft/insurance/IGetInsuranceCostResponseData"; import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; @@ -35,6 +36,14 @@ export declare class InsuranceController { * Process insurance items prior to being given to player in mail */ processReturn(): void; + /** + * Should the passed in item be removed from player inventory + * @param insuredItem Insurued item to roll to lose + * @param traderId Trader the item was insured by + * @param itemsBeingDeleted All items to remove from player + * @returns True if item should be removed + */ + protected itemShouldBeLost(insuredItem: Item, traderId: string, itemsBeingDeleted: string[]): boolean; /** * Add insurance to an item * @param pmcData Player profile diff --git a/types/controllers/MatchController.d.ts b/types/controllers/MatchController.d.ts index 55e2029..f7418bf 100644 --- a/types/controllers/MatchController.d.ts +++ b/types/controllers/MatchController.d.ts @@ -38,8 +38,7 @@ export declare class MatchController { getProfile(info: IGetProfileRequestData): IPmcData[]; createGroup(sessionID: string, info: ICreateGroupRequestData): any; deleteGroup(info: any): void; - joinMatch(info: IJoinMatchRequestData, sessionID: string): IJoinMatchResult[]; - protected getMatch(location: string): any; + joinMatch(info: IJoinMatchRequestData, sessionId: string): IJoinMatchResult; getGroupStatus(info: IGetGroupStatusRequestData): any; /** * Handle /client/raid/configuration diff --git a/types/generators/ScavCaseRewardGenerator.d.ts b/types/generators/ScavCaseRewardGenerator.d.ts index 394eeb0..a7f4302 100644 --- a/types/generators/ScavCaseRewardGenerator.d.ts +++ b/types/generators/ScavCaseRewardGenerator.d.ts @@ -88,7 +88,7 @@ export declare class ScavCaseRewardGenerator { */ protected getFilteredItemsByPrice(dbItems: ITemplateItem[], itemFilters: RewardCountAndPriceDetails): ITemplateItem[]; /** - * Gathers the reward options from config and scavcase.json into a single object + * Gathers the reward min and max count params for each reward quality level from config and scavcase.json into a single object * @param scavCaseDetails scavcase.json values * @returns ScavCaseRewardCountsAndPrices object */ diff --git a/types/helpers/ItemHelper.d.ts b/types/helpers/ItemHelper.d.ts index ba34062..98fe95e 100644 --- a/types/helpers/ItemHelper.d.ts +++ b/types/helpers/ItemHelper.d.ts @@ -105,6 +105,7 @@ declare class ItemHelper { * @returns bool - is valid + template item object as array */ getItem(tpl: string): [boolean, ITemplateItem]; + isItemInDb(tpl: string): boolean; /** * get normalized value (0-1) based on item condition * @param item diff --git a/types/helpers/RagfairOfferHelper.d.ts b/types/helpers/RagfairOfferHelper.d.ts index 0e92762..41e5f85 100644 --- a/types/helpers/RagfairOfferHelper.d.ts +++ b/types/helpers/RagfairOfferHelper.d.ts @@ -1,6 +1,7 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { ITraderAssort } from "../models/eft/common/tables/ITrader"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; import { IQuestConfig } from "../models/spt/config/IQuestConfig"; @@ -46,6 +47,14 @@ export declare class RagfairOfferHelper { protected ragfairConfig: IRagfairConfig; protected questConfig: IQuestConfig; constructor(logger: ILogger, timeUtil: TimeUtil, hashUtil: HashUtil, eventOutputHolder: EventOutputHolder, databaseServer: DatabaseServer, traderHelper: TraderHelper, saveServer: SaveServer, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, paymentHelper: PaymentHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, ragfairSortHelper: RagfairSortHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, localeService: LocaleService, configServer: ConfigServer); + /** + * Passthrough to ragfairOfferService.getOffers(), get flea offers a player should see + * @param searchRequest + * @param itemsToAdd + * @param traderAssorts Trader assorts + * @param pmcProfile Player profile + * @returns Offers the player should see + */ getValidOffers(searchRequest: ISearchRequestData, itemsToAdd: string[], traderAssorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; /** * Get offers from flea/traders specifically when building weapon preset @@ -53,7 +62,7 @@ export declare class RagfairOfferHelper { * @param itemsToAdd string array of item tpls to search for * @param traderAssorts All trader assorts player can access/buy * @param pmcProfile Player profile - * @returns ITraderAssort + * @returns IRagfairOffer array */ getOffersForBuild(searchRequest: ISearchRequestData, itemsToAdd: string[], traderAssorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; /** @@ -79,11 +88,49 @@ export declare class RagfairOfferHelper { * Get an array of flea offers that are inaccessible to player due to their inadequate loyalty level * @param offers Offers to check * @param pmcProfile Players profile with trader loyalty levels + * @returns array of offer ids player cannot see */ protected getLoyaltyLockedOffers(offers: IRagfairOffer[], pmcProfile: IPmcData): string[]; + /** + * Process all player-listed flea offers for a desired profile + * @param sessionID Session id to process offers for + * @returns true = complete + */ processOffersOnProfile(sessionID: string): boolean; + /** + * Add amount to players ragfair rating + * @param sessionId Profile to update + * @param amountToIncrementBy Raw amount to add to players ragfair rating (excluding the reputation gain multiplier) + */ + increaseProfileRagfairRating(profile: IAkiProfile, amountToIncrementBy: number): void; + /** + * Return all offers a player has listed on a desired profile + * @param sessionID Session id + * @returns Array of ragfair offers + */ protected getProfileOffers(sessionID: string): IRagfairOffer[]; + /** + * Delete an offer from a desired profile + * @param sessionID Session id of profile to delete offer from + * @param offerId Offer id to delete + */ protected deleteOfferByOfferId(sessionID: string, offerId: string): void; + /** + * Complete the selling of players' offer + * @param sessionID Session id + * @param offer Sold offer details + * @param boughtAmount Amount item was purchased for + * @returns Client response + */ protected completeOffer(sessionID: string, offer: IRagfairOffer, boughtAmount: number): IItemEventRouterResponse; + /** + * Should a ragfair offer be visible to the player + * @param info Search request + * @param itemsToAdd ? + * @param traderAssorts Trader assort items + * @param offer The flea offer + * @param pmcProfile Player profile + * @returns True = should be shown to player + */ isDisplayableOffer(info: ISearchRequestData, itemsToAdd: string[], traderAssorts: Record, offer: IRagfairOffer, pmcProfile: IPmcData): boolean; } diff --git a/types/helpers/TradeHelper.d.ts b/types/helpers/TradeHelper.d.ts index 6811dd1..8f82365 100644 --- a/types/helpers/TradeHelper.d.ts +++ b/types/helpers/TradeHelper.d.ts @@ -13,6 +13,7 @@ import { ConfigServer } from "../servers/ConfigServer"; import { RagfairServer } from "../servers/RagfairServer"; import { FenceService } from "../services/FenceService"; import { PaymentService } from "../services/PaymentService"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class TradeHelper { protected logger: ILogger; protected eventOutputHolder: EventOutputHolder; @@ -20,11 +21,12 @@ export declare class TradeHelper { protected itemHelper: ItemHelper; protected paymentService: PaymentService; protected fenceService: FenceService; + protected httpResponse: HttpResponseUtil; protected inventoryHelper: InventoryHelper; protected ragfairServer: RagfairServer; protected configServer: ConfigServer; protected traderConfig: ITraderConfig; - constructor(logger: ILogger, eventOutputHolder: EventOutputHolder, traderHelper: TraderHelper, itemHelper: ItemHelper, paymentService: PaymentService, fenceService: FenceService, inventoryHelper: InventoryHelper, ragfairServer: RagfairServer, configServer: ConfigServer); + constructor(logger: ILogger, eventOutputHolder: EventOutputHolder, traderHelper: TraderHelper, itemHelper: ItemHelper, paymentService: PaymentService, fenceService: FenceService, httpResponse: HttpResponseUtil, inventoryHelper: InventoryHelper, ragfairServer: RagfairServer, configServer: ConfigServer); /** * Buy item from flea or trader * @param pmcData Player profile @@ -38,7 +40,7 @@ export declare class TradeHelper { /** * Sell item to trader * @param pmcData Profile to update - * @param sellRequest request data + * @param sellRequest Request data * @param sessionID Session id * @returns IItemEventRouterResponse */ diff --git a/types/models/eft/common/IGlobals.d.ts b/types/models/eft/common/IGlobals.d.ts index 5790cde..f1845f6 100644 --- a/types/models/eft/common/IGlobals.d.ts +++ b/types/models/eft/common/IGlobals.d.ts @@ -956,9 +956,11 @@ export interface Endurance { MovementAction: number; SprintAction: number; GainPerFatigueStack: number; + DependentSkillRatios: IDependentSkillRatio[]; QTELevelMultipliers: Record>; } export interface Strength { + DependentSkillRatios: IDependentSkillRatio[]; SprintActionMin: number; SprintActionMax: number; MovementActionMin: number; @@ -969,6 +971,10 @@ export interface Strength { FistfightAction: number; ThrowAction: number; } +export interface IDependentSkillRatio { + Ratio: number; + SkillId: string; +} export interface IQTELevelMultiplier { Level: number; Multiplier: number; diff --git a/types/models/eft/common/ILocationBase.d.ts b/types/models/eft/common/ILocationBase.d.ts index 1c3a2fa..54c70ba 100644 --- a/types/models/eft/common/ILocationBase.d.ts +++ b/types/models/eft/common/ILocationBase.d.ts @@ -49,7 +49,10 @@ export interface ILocationBase { OldSpawn: boolean; OpenZones: string; Preview: Preview; - RequiredPlayerLevel: number; + RequiredPlayerLevel?: number; + RequiredPlayerLevelMin?: number; + RequiredPlayerLevelMax?: number; + MinPlayerLvlAccessKeys: number; PmcMaxPlayersInGroup: number; ScavMaxPlayersInGroup: number; Rules: string; diff --git a/types/models/eft/common/tables/IBotBase.d.ts b/types/models/eft/common/tables/IBotBase.d.ts index 1e01efc..cd4169d 100644 --- a/types/models/eft/common/tables/IBotBase.d.ts +++ b/types/models/eft/common/tables/IBotBase.d.ts @@ -258,7 +258,7 @@ export interface LastPlayerStateInfo { Nickname: string; Side: string; Level: number; - MemberCategory: string; + MemberCategory: MemberCategory; } export interface BackendCounter { id: string; @@ -273,6 +273,7 @@ export interface Hideout { Production: Record; Areas: HideoutArea[]; Improvements: Record; + Seed: number; sptUpdateLastRunTimestamp: number; } export interface IHideoutImprovement { diff --git a/types/models/eft/common/tables/ITemplateItem.d.ts b/types/models/eft/common/tables/ITemplateItem.d.ts index 0010ee2..f2dc57f 100644 --- a/types/models/eft/common/tables/ITemplateItem.d.ts +++ b/types/models/eft/common/tables/ITemplateItem.d.ts @@ -256,9 +256,11 @@ export interface Props { CompressorGain?: number; CutoffFreq?: number; Resonance?: number; + RolloffMultiplier?: number; CompressorVolume?: number; AmbientVolume?: number; DryVolume?: number; + HighFrequenciesGain?: number; foodUseTime?: number; foodEffectType?: string; StimulatorBuffs?: string; @@ -375,6 +377,7 @@ export interface Props { ExplosionEffectType?: string; LinkedWeapon?: string; UseAmmoWithoutShell?: boolean; + RandomLootSettings: IRandomLootSettings; } export interface IHealthEffect { type: string; @@ -439,6 +442,21 @@ export interface StackSlot { export interface StackSlotProps { filters: SlotFilter[]; } +export interface IRandomLootSettings { + allowToSpawnIdenticalItems: boolean; + allowToSpawnQuestItems: boolean; + countByRarity: any[]; + excluded: IRandomLootExcluded; + filters: any[]; + findInRaid: boolean; + maxCount: number; + minCount: number; +} +export interface IRandomLootExcluded { + categoryTemplates: any[]; + rarity: string[]; + templates: any[]; +} export interface EffectsHealth { Energy: EffectsHealthProps; Hydration: EffectsHealthProps; diff --git a/types/models/eft/dialog/IAcceptFriendRequestData.d.ts b/types/models/eft/dialog/IAcceptFriendRequestData.d.ts new file mode 100644 index 0000000..190ee69 --- /dev/null +++ b/types/models/eft/dialog/IAcceptFriendRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IAcceptFriendRequestData { + request_id: string; +} diff --git a/types/models/eft/game/ICurrentGroupResponse.d.ts b/types/models/eft/game/ICurrentGroupResponse.d.ts new file mode 100644 index 0000000..1f496fa --- /dev/null +++ b/types/models/eft/game/ICurrentGroupResponse.d.ts @@ -0,0 +1,17 @@ +import { MemberCategory } from "../../../models/enums/MemberCategory"; +export interface ICurrentGroupResponse { + squad: any[]; +} +export interface ICurrentGroupSquadMember { + _id: string; + aid: string; + info: ICurrentGroupMemberInfo; + isLeader: boolean; + isReady: boolean; +} +export interface ICurrentGroupMemberInfo { + Nickname: string; + Side: string; + Level: string; + MemberCategory: MemberCategory; +} diff --git a/types/models/eft/match/IGetGroupStatusRequestData.d.ts b/types/models/eft/match/IGetGroupStatusRequestData.d.ts index 55d7079..911c040 100644 --- a/types/models/eft/match/IGetGroupStatusRequestData.d.ts +++ b/types/models/eft/match/IGetGroupStatusRequestData.d.ts @@ -5,5 +5,5 @@ export interface IGetGroupStatusRequestData { dt: string; keyId: string; raidMode: RaidMode; - startInGroup: boolean; + spawnPlace: string; } diff --git a/types/models/eft/match/IJoinMatchRequestData.d.ts b/types/models/eft/match/IJoinMatchRequestData.d.ts index cd34f7b..b9b7568 100644 --- a/types/models/eft/match/IJoinMatchRequestData.d.ts +++ b/types/models/eft/match/IJoinMatchRequestData.d.ts @@ -1,9 +1,6 @@ export interface IJoinMatchRequestData { - location: string; - savage: boolean; - dt: string; + groupid: string; servers: Server[]; - keyId: string; } export interface Server { ping: number; diff --git a/types/models/eft/match/IJoinMatchResult.d.ts b/types/models/eft/match/IJoinMatchResult.d.ts index 81c9055..e0e867f 100644 --- a/types/models/eft/match/IJoinMatchResult.d.ts +++ b/types/models/eft/match/IJoinMatchResult.d.ts @@ -1,5 +1,10 @@ export interface IJoinMatchResult { + maxPveCountExceeded: boolean; + profiles: IJoinMatchPlayerProfile[]; +} +export interface IJoinMatchPlayerProfile { profileid: string; + profileToken: string; status: string; sid: string; ip: string; diff --git a/types/models/eft/match/ITransferGroupRequest.d.ts b/types/models/eft/match/ITransferGroupRequest.d.ts new file mode 100644 index 0000000..e17c2a8 --- /dev/null +++ b/types/models/eft/match/ITransferGroupRequest.d.ts @@ -0,0 +1,3 @@ +export interface ITransferGroupRequest { + aidToChange: string; +} diff --git a/types/models/eft/profile/IAkiProfile.d.ts b/types/models/eft/profile/IAkiProfile.d.ts index 3840e83..f24a788 100644 --- a/types/models/eft/profile/IAkiProfile.d.ts +++ b/types/models/eft/profile/IAkiProfile.d.ts @@ -104,7 +104,7 @@ export interface IUpdatableChatMember { Nickname: string; Side: string; Level: number; - MemberCategory: string; + MemberCategory: MemberCategory; Ignored: boolean; Banned: boolean; } diff --git a/types/models/spt/hideout/ScavCaseRewardCountsAndPrices.d.ts b/types/models/spt/hideout/ScavCaseRewardCountsAndPrices.d.ts index 1b5af39..ee1893d 100644 --- a/types/models/spt/hideout/ScavCaseRewardCountsAndPrices.d.ts +++ b/types/models/spt/hideout/ScavCaseRewardCountsAndPrices.d.ts @@ -1,7 +1,7 @@ export interface ScavCaseRewardCountsAndPrices { - common: RewardCountAndPriceDetails; - rare: RewardCountAndPriceDetails; - superrare: RewardCountAndPriceDetails; + Common: RewardCountAndPriceDetails; + Rare: RewardCountAndPriceDetails; + Superrare: RewardCountAndPriceDetails; } export interface RewardCountAndPriceDetails { minCount: number; diff --git a/types/services/InsuranceService.d.ts b/types/services/InsuranceService.d.ts index 1605bc9..7ddf679 100644 --- a/types/services/InsuranceService.d.ts +++ b/types/services/InsuranceService.d.ts @@ -73,14 +73,6 @@ export declare class InsuranceService { * @returns Hashtable */ protected createItemHashTable(items: Item[]): Record; - /** - * Store insured items on pmc death inside insurance array in player profile - * @param pmcData Player profile - * @param offraidData Player gear post-raid - * @param preRaidGear Player gear before raid - * @param sessionID Session id - */ - storeInsuredItemsForReturn(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; /** * Add gear item to InsuredItems array in player profile * @param pmcData profile to store item in From 305e4a345d09a6061e168c4c5c924ebbe1341655 Mon Sep 17 00:00:00 2001 From: StuckInLimbo Date: Tue, 30 May 2023 19:25:13 -0400 Subject: [PATCH 2/4] Update version --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2fb98f0..12c63e4 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "name": "clearvision", - "version": "1.4.0", + "version": "1.5.0", "author": "Limbo", "license": "CC BY-NC 4.0", "main": "src/mod.js", - "akiVersion": "3.5.6", + "akiVersion": "3.5.7", "isBundleMod": true, "scripts": { "setup": "npm i", From c48fac93020e6fb772e7913b70f7bf1255c5db85 Mon Sep 17 00:00:00 2001 From: StuckInLimbo Date: Tue, 30 May 2023 19:28:35 -0400 Subject: [PATCH 3/4] Removal of never used files --- _uabe/13.0.4/flir_thermal_2x.txt | 211 ------------------------------- _uabe/13.0.4/flir_thermal_9x.txt | 211 ------------------------------- 2 files changed, 422 deletions(-) delete mode 100644 _uabe/13.0.4/flir_thermal_2x.txt delete mode 100644 _uabe/13.0.4/flir_thermal_9x.txt diff --git a/_uabe/13.0.4/flir_thermal_2x.txt b/_uabe/13.0.4/flir_thermal_2x.txt deleted file mode 100644 index 49deab6..0000000 --- a/_uabe/13.0.4/flir_thermal_2x.txt +++ /dev/null @@ -1,211 +0,0 @@ -0 MonoBehaviour Base - 0 PPtr m_GameObject - 0 int m_FileID = 0 - 0 SInt64 m_PathID = 3541461315383280091 - 1 UInt8 m_Enabled = 1 - 0 PPtr m_Script - 0 int m_FileID = 0 - 0 SInt64 m_PathID = 5565369305611123200 - 1 string m_Name = "" - 1 UInt8 On = 1 - 1 UInt8 IsNoisy = 0 - 1 UInt8 IsFpsStuck = 1 - 1 UInt8 IsMotionBlurred = 1 - 1 UInt8 IsGlitch = 1 - 1 UInt8 IsPixelated = 1 - 0 ThermalVisionUtilities ThermalVisionUtilities - 0 int CurrentRampPalette = 2 - 0 float DepthFade = 0.015 - 0 RampTexPalletteConnector RampTexPalletteConnectors - 0 Array Array (4 items) - 0 int size = 4 - [0] - 0 RampTexPalletteConnector data - 0 int SelectablePalette = 0 - 0 PPtr<$Texture> Texture - 0 int m_FileID = 0 - 0 SInt64 m_PathID = 7508151943853232840 - [1] - 0 RampTexPalletteConnector data - 0 int SelectablePalette = 1 - 0 PPtr<$Texture> Texture - 0 int m_FileID = 0 - 0 SInt64 m_PathID = -5152019446405794523 - [2] - 0 RampTexPalletteConnector data - 0 int SelectablePalette = 2 - 0 PPtr<$Texture> Texture - 0 int m_FileID = 0 - 0 SInt64 m_PathID = -7693852147454652293 - [3] - 0 RampTexPalletteConnector data - 0 int SelectablePalette = 3 - 0 PPtr<$Texture> Texture - 0 int m_FileID = 0 - 0 SInt64 m_PathID = 6653721926322572926 - 0 ValuesCoefs ValuesCoefs - 0 float MainTexColorCoef = 0.7 - 0 float MinimumTemperatureValue = 0.01 - 0 float RampShift = -0.5 - 0 Noise NoiseParameters - 0 PPtr<$Texture> NoiseTex - 0 int m_FileID = 4 - 0 SInt64 m_PathID = 8199788924419820673 - 0 float NoiseIntensity = 2.37 - 0 MaskDescription MaskDescription - 0 PPtr<$Texture> Mask - 0 int m_FileID = 4 - 0 SInt64 m_PathID = -3129771501855889499 - 0 float MaskSize = 1.5 - 0 PPtr<$Texture> ThermalMaskTexture - 0 int m_FileID = 4 - 0 SInt64 m_PathID = -3129771501855889499 - 0 PPtr<$Texture> AnvisMaskTexture - 0 int m_FileID = 5 - 0 SInt64 m_PathID = 7789947214477360350 - 0 PPtr<$Texture> BinocularMaskTexture - 0 int m_FileID = 5 - 0 SInt64 m_PathID = 6747781150766600812 - 0 PPtr<$Texture> GasMaskTexture - 0 int m_FileID = 5 - 0 SInt64 m_PathID = -4504813805791030888 - 0 PPtr<$Texture> OldMonocularMaskTexture - 0 int m_FileID = 5 - 0 SInt64 m_PathID = -4679999331080453473 - 0 StuckFPSUtilities StuckFpsUtilities - 0 int MinFramerate = 21 - 0 int MaxFramerate = 21 - 0 MotionBlurUtilities MotionBlurUtilities - 0 PPtr<$Shader> Shader - 0 int m_FileID = 2 - 0 SInt64 m_PathID = 5808810239059734513 - 0 float BlurAmount = 0.5 - 1 UInt8 ExtraBlur = 0 - 0 GlitchUtilities GlitchUtilities - 0 PPtr<$Shader> Shader - 0 int m_FileID = 2 - 0 SInt64 m_PathID = -7596296163913447224 - 0 PPtr<$Texture2D> DisplacementMap - 0 int m_FileID = 0 - 0 SInt64 m_PathID = 6838258107796826452 - 0 float DigitalMistakeIntensity = 0.052 - 0 float DigitalMistakeFrequency = 1 - 0 float VerticalFlipIntensity = 0.044 - 0 float VerticalFlipFrequency = 1 - 0 float ColorSwitchIntensity = 0 - 0 float ColorSwitchFrequency = 1 - 0 float VerticalJumpCoef = 0.031 - 0 float VerticalJumpFrequency = 1 - 0 float VerticalJumpTimeScale = 11.3 - 0 float ScanLineJitterCoef = 0.088 - 0 float ScanLineJitterFrequency = 1 - 0 float HorizontalShake = 0 - 0 float HorizontalShakeFrequency = 1 - 0 float ColorDriftCoef = 0 - 0 float ColorDriftFrequency = 1 - 0 float MaxColorDrift = 0.06 - 0 PixelationUtilities PixelationUtilities - 0 int Mode = 0 - 0 PPtr<$Shader> PixelationShader - 0 int m_FileID = 2 - 0 SInt64 m_PathID = 2862045551766238708 - 0 float BlockCount = 172 - 0 float Alpha = 0.722 - 0 PPtr<$Texture> PixelationMask - 0 int m_FileID = 0 - 0 SInt64 m_PathID = -3130472411721770974 - 0 PPtr<$TextureMask> TextureMask - 0 int m_FileID = 0 - 0 SInt64 m_PathID = 0 - 0 vector SwitchComponentsOn - 0 Array Array (0 items) - 0 int size = 0 - 0 vector SwitchComponentsOff - 0 Array Array (0 items) - 0 int size = 0 - 0 float ChromaticAberrationThermalShift = 0.013 - 0 AnimationCurve BlackFlashGoingToOn - 0 vector m_Curve - 1 Array Array (4 items) - 0 int size = 4 - [0] - 0 Keyframe data - 0 float time = 0 - 0 float value = 0 - 0 float inSlope = 2.4462957 - 0 float outSlope = -0 - 0 int weightedMode = 0 - 0 float inWeight = 0.33333334 - 0 float outWeight = 0.33333334 - [1] - 0 Keyframe data - 0 float time = 0.76 - 0 float value = 0 - 0 float inSlope = 0.024118533 - 0 float outSlope = 0.024118533 - 0 int weightedMode = 0 - 0 float inWeight = 0.33333334 - 0 float outWeight = 0.33333334 - [2] - 0 Keyframe data - 0 float time = 0.86 - 0 float value = 1.02 - 0 float inSlope = -3.33786E-06 - 0 float outSlope = -3.33786E-06 - 0 int weightedMode = 0 - 0 float inWeight = 0.33333334 - 0 float outWeight = 0.33333334 - [3] - 0 Keyframe data - 0 float time = 0.96 - 0 float value = 0 - 0 float inSlope = 0.030142216 - 0 float outSlope = 0.030142216 - 0 int weightedMode = 0 - 0 float inWeight = 0.33333334 - 0 float outWeight = 0.33333334 - 0 int m_PreInfinity = 2 - 0 int m_PostInfinity = 2 - 0 int m_RotationOrder = 4 - 0 AnimationCurve BlackFlashGoingToOff - 0 vector m_Curve - 1 Array Array (3 items) - 0 int size = 3 - [0] - 0 Keyframe data - 0 float time = 0.59999996 - 0 float value = 0 - 0 float inSlope = 0 - 0 float outSlope = 0 - 0 int weightedMode = 0 - 0 float inWeight = 0.33333334 - 0 float outWeight = 0.33333334 - [1] - 0 Keyframe data - 0 float time = 0.6999999 - 0 float value = 1.02 - 0 float inSlope = 0 - 0 float outSlope = 0 - 0 int weightedMode = 0 - 0 float inWeight = 0.33333334 - 0 float outWeight = 0.33333334 - [2] - 0 Keyframe data - 0 float time = 0.79999995 - 0 float value = 0 - 0 float inSlope = 0 - 0 float outSlope = 0 - 0 int weightedMode = 0 - 0 float inWeight = 0.33333334 - 0 float outWeight = 0.33333334 - 0 int m_PreInfinity = 2 - 0 int m_PostInfinity = 2 - 0 int m_RotationOrder = 4 - 0 PPtr<$AudioClip> SwitchOn - 0 int m_FileID = 4 - 0 SInt64 m_PathID = -6193653337146545632 - 0 PPtr<$AudioClip> SwitchOff - 0 int m_FileID = 4 - 0 SInt64 m_PathID = -3548446952302143892 - 0 float UnsharpRadiusBlur = 5 - 0 float UnsharpBias = 2 diff --git a/_uabe/13.0.4/flir_thermal_9x.txt b/_uabe/13.0.4/flir_thermal_9x.txt deleted file mode 100644 index 19c0c0b..0000000 --- a/_uabe/13.0.4/flir_thermal_9x.txt +++ /dev/null @@ -1,211 +0,0 @@ -0 MonoBehaviour Base - 0 PPtr m_GameObject - 0 int m_FileID = 0 - 0 SInt64 m_PathID = 6844007636776873627 - 1 UInt8 m_Enabled = 1 - 0 PPtr m_Script - 0 int m_FileID = 0 - 0 SInt64 m_PathID = 5565369305611123200 - 1 string m_Name = "" - 1 UInt8 On = 1 - 1 UInt8 IsNoisy = 0 - 1 UInt8 IsFpsStuck = 1 - 1 UInt8 IsMotionBlurred = 1 - 1 UInt8 IsGlitch = 1 - 1 UInt8 IsPixelated = 1 - 0 ThermalVisionUtilities ThermalVisionUtilities - 0 int CurrentRampPalette = 2 - 0 float DepthFade = 0.015 - 0 RampTexPalletteConnector RampTexPalletteConnectors - 0 Array Array (4 items) - 0 int size = 4 - [0] - 0 RampTexPalletteConnector data - 0 int SelectablePalette = 0 - 0 PPtr<$Texture> Texture - 0 int m_FileID = 0 - 0 SInt64 m_PathID = 7508151943853232840 - [1] - 0 RampTexPalletteConnector data - 0 int SelectablePalette = 1 - 0 PPtr<$Texture> Texture - 0 int m_FileID = 0 - 0 SInt64 m_PathID = -5152019446405794523 - [2] - 0 RampTexPalletteConnector data - 0 int SelectablePalette = 2 - 0 PPtr<$Texture> Texture - 0 int m_FileID = 0 - 0 SInt64 m_PathID = -7693852147454652293 - [3] - 0 RampTexPalletteConnector data - 0 int SelectablePalette = 3 - 0 PPtr<$Texture> Texture - 0 int m_FileID = 0 - 0 SInt64 m_PathID = 6653721926322572926 - 0 ValuesCoefs ValuesCoefs - 0 float MainTexColorCoef = 0.7 - 0 float MinimumTemperatureValue = 0.01 - 0 float RampShift = -0.5 - 0 Noise NoiseParameters - 0 PPtr<$Texture> NoiseTex - 0 int m_FileID = 4 - 0 SInt64 m_PathID = 8199788924419820673 - 0 float NoiseIntensity = 2.37 - 0 MaskDescription MaskDescription - 0 PPtr<$Texture> Mask - 0 int m_FileID = 4 - 0 SInt64 m_PathID = -3129771501855889499 - 0 float MaskSize = 1.5 - 0 PPtr<$Texture> ThermalMaskTexture - 0 int m_FileID = 4 - 0 SInt64 m_PathID = -3129771501855889499 - 0 PPtr<$Texture> AnvisMaskTexture - 0 int m_FileID = 5 - 0 SInt64 m_PathID = 7789947214477360350 - 0 PPtr<$Texture> BinocularMaskTexture - 0 int m_FileID = 5 - 0 SInt64 m_PathID = 6747781150766600812 - 0 PPtr<$Texture> GasMaskTexture - 0 int m_FileID = 5 - 0 SInt64 m_PathID = -4504813805791030888 - 0 PPtr<$Texture> OldMonocularMaskTexture - 0 int m_FileID = 5 - 0 SInt64 m_PathID = -4679999331080453473 - 0 StuckFPSUtilities StuckFpsUtilities - 0 int MinFramerate = 21 - 0 int MaxFramerate = 21 - 0 MotionBlurUtilities MotionBlurUtilities - 0 PPtr<$Shader> Shader - 0 int m_FileID = 2 - 0 SInt64 m_PathID = 5808810239059734513 - 0 float BlurAmount = 0.5 - 1 UInt8 ExtraBlur = 0 - 0 GlitchUtilities GlitchUtilities - 0 PPtr<$Shader> Shader - 0 int m_FileID = 2 - 0 SInt64 m_PathID = -7596296163913447224 - 0 PPtr<$Texture2D> DisplacementMap - 0 int m_FileID = 0 - 0 SInt64 m_PathID = 6838258107796826452 - 0 float DigitalMistakeIntensity = 0.052 - 0 float DigitalMistakeFrequency = 1 - 0 float VerticalFlipIntensity = 0.044 - 0 float VerticalFlipFrequency = 1 - 0 float ColorSwitchIntensity = 0 - 0 float ColorSwitchFrequency = 1 - 0 float VerticalJumpCoef = 0.031 - 0 float VerticalJumpFrequency = 1 - 0 float VerticalJumpTimeScale = 11.3 - 0 float ScanLineJitterCoef = 0.088 - 0 float ScanLineJitterFrequency = 1 - 0 float HorizontalShake = 0 - 0 float HorizontalShakeFrequency = 1 - 0 float ColorDriftCoef = 0 - 0 float ColorDriftFrequency = 1 - 0 float MaxColorDrift = 0.06 - 0 PixelationUtilities PixelationUtilities - 0 int Mode = 0 - 0 PPtr<$Shader> PixelationShader - 0 int m_FileID = 2 - 0 SInt64 m_PathID = 2862045551766238708 - 0 float BlockCount = 172 - 0 float Alpha = 0.722 - 0 PPtr<$Texture> PixelationMask - 0 int m_FileID = 0 - 0 SInt64 m_PathID = -3130472411721770974 - 0 PPtr<$TextureMask> TextureMask - 0 int m_FileID = 0 - 0 SInt64 m_PathID = 0 - 0 vector SwitchComponentsOn - 0 Array Array (0 items) - 0 int size = 0 - 0 vector SwitchComponentsOff - 0 Array Array (0 items) - 0 int size = 0 - 0 float ChromaticAberrationThermalShift = 0.013 - 0 AnimationCurve BlackFlashGoingToOn - 0 vector m_Curve - 1 Array Array (4 items) - 0 int size = 4 - [0] - 0 Keyframe data - 0 float time = 0 - 0 float value = 0 - 0 float inSlope = 2.4462957 - 0 float outSlope = -0 - 0 int weightedMode = 0 - 0 float inWeight = 0.33333334 - 0 float outWeight = 0.33333334 - [1] - 0 Keyframe data - 0 float time = 0.76 - 0 float value = 0 - 0 float inSlope = 0.024118533 - 0 float outSlope = 0.024118533 - 0 int weightedMode = 0 - 0 float inWeight = 0.33333334 - 0 float outWeight = 0.33333334 - [2] - 0 Keyframe data - 0 float time = 0.86 - 0 float value = 1.02 - 0 float inSlope = -3.33786E-06 - 0 float outSlope = -3.33786E-06 - 0 int weightedMode = 0 - 0 float inWeight = 0.33333334 - 0 float outWeight = 0.33333334 - [3] - 0 Keyframe data - 0 float time = 0.96 - 0 float value = 0 - 0 float inSlope = 0.030142216 - 0 float outSlope = 0.030142216 - 0 int weightedMode = 0 - 0 float inWeight = 0.33333334 - 0 float outWeight = 0.33333334 - 0 int m_PreInfinity = 2 - 0 int m_PostInfinity = 2 - 0 int m_RotationOrder = 4 - 0 AnimationCurve BlackFlashGoingToOff - 0 vector m_Curve - 1 Array Array (3 items) - 0 int size = 3 - [0] - 0 Keyframe data - 0 float time = 0.59999996 - 0 float value = 0 - 0 float inSlope = 0 - 0 float outSlope = 0 - 0 int weightedMode = 0 - 0 float inWeight = 0.33333334 - 0 float outWeight = 0.33333334 - [1] - 0 Keyframe data - 0 float time = 0.6999999 - 0 float value = 1.02 - 0 float inSlope = 0 - 0 float outSlope = 0 - 0 int weightedMode = 0 - 0 float inWeight = 0.33333334 - 0 float outWeight = 0.33333334 - [2] - 0 Keyframe data - 0 float time = 0.79999995 - 0 float value = 0 - 0 float inSlope = 0 - 0 float outSlope = 0 - 0 int weightedMode = 0 - 0 float inWeight = 0.33333334 - 0 float outWeight = 0.33333334 - 0 int m_PreInfinity = 2 - 0 int m_PostInfinity = 2 - 0 int m_RotationOrder = 4 - 0 PPtr<$AudioClip> SwitchOn - 0 int m_FileID = 4 - 0 SInt64 m_PathID = -6193653337146545632 - 0 PPtr<$AudioClip> SwitchOff - 0 int m_FileID = 4 - 0 SInt64 m_PathID = -3548446952302143892 - 0 float UnsharpRadiusBlur = 5 - 0 float UnsharpBias = 2 From 86fe8d774abb1ed01e8702555aff8086532b38ea Mon Sep 17 00:00:00 2001 From: StuckInLimbo Date: Tue, 30 May 2023 19:32:04 -0400 Subject: [PATCH 4/4] Update to EFT 0.13.0.4.23043 bundles --- .../scope_all_flir_rs32_225_9x_35_60hz.bundle | Bin 4917661 -> 4918045 bytes ...e_all_torrey_pines_logic_t12_w_30hz.bundle | Bin 4066009 -> 4066393 bytes .../scopes/scope_base_trijicon_reap-ir.bundle | Bin 15309621 -> 15309989 bytes ...5_kalashnikov_ultima_camera_thermal.bundle | Bin 433749 -> 434133 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bundles/assets/content/items/mods/scopes/scope_all_flir_rs32_225_9x_35_60hz.bundle b/bundles/assets/content/items/mods/scopes/scope_all_flir_rs32_225_9x_35_60hz.bundle index 0ce43f1f405c789c5954b7dafb92c62bc6db0b0b..fe2b289b9b1f4a05274fbae9e31bf5494f2f6ebc 100644 GIT binary patch delta 4912 zcmaJ_3s{uJ8lInJ!XM;sgzRBJG1{TnLX!!c;SEF`R1GXzWHY6*SG0j zlegd4Yf|B5GSIzpSb(QhG?@Z~6GBXY{zv$+5yY(WfR{usLa5xSw)ylS(Kk5~a>BFW zN53GaBImwz`xJ}5lGhI=mMwho%A4qrY_7XpxksQEMs1Z&17~=Q$AJb~DW5nl@S?9HOc+7h7}k zIh6UPL~D(|uGHRMChdeB2p??_&4c2Pb{3K);6@WL;sv}huwL%;tW+l5j$T*5*c?5K z${kTr8Wk%+Z{x{lE(dc3*t}HShRtUL6y|v_kK(e*nx-{4&@V%5XfgiY3bBxk6uk`P zULwI5rlQX(q7-~+XNW?QEP5DWw4W#1`x@+N@j?Bl?;LcnHRYKq z5N-U8Hl3o)Bcn~JXcK6(3DfEQr0EQPYDAk+1{)!m%}q5L5eWM9p6g}&sbh9SHajyjN|OK$U><-R_YNLgFV{E)7!Q(sRQcR6JR+H}`=vui2MHa`| zU6I9eW@f4%A%QbjktK2#AhIORqD1yQXQ?8a!P!e9n@KAxoGnF?%$umlQW&E%!dz_y zau^ze7ebrOm-4h|m1<09I~10rIZq{NE>BXLF-e!jzAy0cZi;Lk_r$hcujncLDNpmc zrv<#&9>dB3xn^T#(7;VfA(JNHcNTBGfTO|#t?VdTNW;RFLN@b8x2dd!Mci*7TG>&= z`oCx_=a+anFE;v!5q&J-K5~pcmOkYp*XSdU`^e`$SfS2_5B!hp<20GpjFyWQzSjioS%T4e!y2RXe?rKQkQqOmk4y#C=~n>%9OQLYO}*U>~tMA>2#c-2^Qg zoIQ6vBJwAnA6@5dOGqvH4kScFrtO~4X20)HT{EuOXc$=lzn{F^qxdamubo5xWPXZ0 zwtkrXoxS1Em_ueaaZURc%b}C@*Fkdz9{{ZTZq2C3)`Wvi&^CaxXYZ*NuilkC|BA)A z76*>8$)-y})h^}5M^ogOAwpwCQZ{#D+M0_?j@?&a=YX@$ z``t~wuI2T7;*C+m!KHwmD&Ozg4+D>9Lo)=j@`HPguWx(wX+5+I*dQ6?JG&36CS1^d z;p{@lW(@>ngUs`5-TR?=URyoHUgVDrymJ2VtNRlkwAXs|4?MWTC$~GP{Hrt2PQu0v zczM@@2iom*Usa>X4e76Khz&35Uf1D0OrHhz&3Lgzu{<4Qw;G{EqyBgy`R0`0_5Wh+ZDwT{xXtgUrRqi6Un`)M zq9aOzQ1b4r-L_%(or4Lv3eE;r6!-Sh;_3$k-=l00c4PGIUb|7YJiAW~jZNAS2z{&c zo55 z*#3xD6|cKtJwD&M2^#CnCNn^leCENPBx&8G{zzsAJ}i{C%Wb-#orH}Uu-h~!LwHE+ z>L&LW*Ve079$%SC?V6w&c2lbMPT3Xj7Q1=Vd2kvY-Qw`wwWFME-0L733hw1^H=S}# z>`+?9^=D!D3`yaG^|q>bXbUkYD>$dOBFhUtbM$J2h5)%1q9E3%E{^mj@%`)WGI_@7 z=EW;UsG()Rjy(>aYqD1D$?fs2g%}Qj?c)^{eLtHHaR}^!77fnQe<>pPm1(U*1HBUn z*#^!AZV2|dpHs3hs2SQ-aF&G&r56i!?72UtK2e_;XJ{Jt>sxl5D2*sgLKe^wryl7v zKNFljuQke9Gm{W@UowYTS-nwB693p(Xc$}nj6G9*%_nqPHMA5_T74+sV~fSralO!3 zaj_k7Q-pTy~2Zt_NmGhr1$-U4Ff%r!LF=292*labN@yQK9=PvD)Yqqn@ zQ{zREX~okIv|c%wY4m0h(ir;)Ak1T?Eo38fve1f88z6#a+;D zh??r!``?;vnZBeM|NJe5#-3F+ej8km`sBtB5{&8Znee{P$N`)4)NXt71G+~NfCF^)WTi`m*_)tub_Ls9Ku!FX0Tn)($4W+bk(9MV6C zwlil;*ulazz0hLCgQmi#DQCgpa~id-@7QkxQ`=gnhKWP*l?5NqI6GX~W7xUu-Eexd zcftFL$J+*(R3*mP~ftQguA delta 4726 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 E4_oEcSpWb4 delta 4052 zcmZ`+2~<=^7Ol_TNV7H25SFG9kye3bQv_KA7j#fTREXmO1_&r9iyA^q8dqG9KuQEP zQPdobniz9XVPrHoagKP#i8*RCI)fS~8ZbJejtfalGPkO$Keid`aDVr^_1>*lua^E? zY3`G*H1b~`#RK}Qcqdec1#ZXvGdnomge zAbdJ8-D>tQHi=jfJ-#Lb4uCT)jnYUiR3D|$vN-8EXXcv$u2A@@xUU=Y^+IC5^Q{E8 zp6*EWvb84H*r@b#{yo%^R4eH9L@y^R(t_`eJeCkIs*l#T9*&+8?h#+KGPd%`xxo*; z6a2~&P9E6?mj%|XCwA5qRzzno z1O2thTgiqyC_Fvr*&>akrgaW#D{pAh2P-^~6?0(~bH=9^W~r9C==NqWCu?#Q%se=< zT6xpr`5MWG*5c_)wJ9oPFIWcF>ql?wS6e(LG;xcklOl zP=E~?06gC$V#xdJx~@N7{L@#Wi0nA-&U_M3o-+-3~BHi z{Jc1iGwK%z{a{&NXVM=%GsL8+4gEiwtiUxQCQOde%Q4|E ziD?!w5pqnV9251Dm`_AZv>Y>Bjv4Wim_Lh{7&&I7DMpH=qp=At!s9kz2ZcDk6Z>GX z8ja$XHO@S<;_0_ocUM>pE?^P>Qq3O5CgFMrLSGcX);*C{?^E-efyF0LheaA`G~akT z5f=w9#wWA=#81dLFc_Mo@Dq{_iy<4#81D1D_ET zEQc4%;167#<+MdGX)^PfU?$1TX~9gEnQp;Mk(q~rNtYR0OXFA>GUF+jsWO9$hUb$h zGh+lZO=hwLGhJpD31)`O7zC3gGtGj@W(-X%_j^xgqv#OiOt!GfGq4x}QIJ2vO|9q_ z{j<0XEB;L|tgN%m$~uRab*^02|BARAdH7!ilgk-)WUNqkrZmq?={2sD$G4>l9znt@ zA8{I~03&Fm*Lm;PxYHug%dXEt`c;HRDq>31F~ClXo6xMW>u4-|*$v6YTp%BXV)-bP z$f`4i>O!u%NLDR1(_|afT(wMAEtgd*m}&^ySPP+wKeG4*6$|L7&|fD;T|z%zqM^q# z(_Jj#zY8qO+6Pf@(hq#qiUUHYid%<-^%l2|3Tqj+P6+F5nvkYeoEFwQyzip04BYA# zRyCchR4cw0)^ct=7S;-8>8z}cvsj6I*g-Wl(=6Q3&sJm=n}xKR`lV{5HMAvEqpgAK z^ARu3ZY|HmG`n@&GRqP`(>C@!iI$`ofCB-15??xp_rPDq8nedBwJ#JnSqP(h$wA=<1b;QNx>$or*y!cg49n z>0bYHeq?-CFn*2i!p9c)`|b}jH)YKD(i1mzEo>ZLlGXcqd(qYj7d`?v1~$8!1HRFf z-pj1Jcpuy;*etfCwq5npBZq74c%@=*PiO{08=oo9{ZMkvAN!U4LfHdfM?T7^m|b~2 z8=Pt24eMe9?H{z=PIWWh-7I>wcXCesO`q>uz?lYq>QcUBj&}PGJ>X`+X8>OhOOkdsz{=j^s_A9M(uX`Q?# zPCwIC{Kk+jaCz`!?X9Hzmgv>nLiBII4;!8dUb)$6QFvx)Wa_g11Rr1ZjPm@?r4jYu zHo*tmiFEAUR=o1)jZwjGvuYWPGC64ky-Z$_iZWdOl6Hd&jsW*iSgD zUp3#-jhd7Mj=eyzmQ<`E2|3HBG=pR1XS=^W=-K64b+glhp>L{I&k4so-xa&3mV)aP zr!>m2>0hqHD|=?>R~t7R_88fGbohhQeL2~M;PkLPm}o>rQ}nC5vYWx(h0TuBJCi>> zd+F4SS!>r|V+t!;r?*fwB1yeUe{mM%=S-qE%&`t)&dR{WQT;1dR^zj*8+AgD|6pwo;-qwE=NJF+tjS1|01LnpumY?B8^9K@0~CNg zFaU4>lz=1P1ULgOfGeN^+yHmL15g8=fEVxz;0^cyzJMQ~0sH|i5C9AW0)at55HJ`B v26Vs>U??yQ2mwNYFhCE40}((Z5Cud7!+{Y%3@{Ri1>%5FZ5e6tcAftNbn9~0 diff --git a/bundles/assets/content/items/mods/scopes/scope_base_trijicon_reap-ir.bundle b/bundles/assets/content/items/mods/scopes/scope_base_trijicon_reap-ir.bundle index e5a501916603e8176a5d3c824bc9e37d004909f2..1cc9c3033c833fc17ca13a92a3c30b4c55a91565 100644 GIT binary patch delta 5011 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 Tci=AEgZuE)@x%!a!e{;$O<-a@ diff --git a/bundles/assets/content/items/mods/tactical/tactical_mp155_kalashnikov_ultima_camera_thermal.bundle b/bundles/assets/content/items/mods/tactical/tactical_mp155_kalashnikov_ultima_camera_thermal.bundle index 79eb831ad2f30012873d6e4d30f5572b2fabdfe8..fe48a32382a8059eb1260b0bedf62016e4c0aed9 100644 GIT binary patch delta 3622 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 S7ZOMT@&GB1B)?Ft*!_R1z7+KU