github sp-tarkov/build v3.5.0
SPT 3.5.0 (21734)

latest releases: 3.11.4, 3.11.3, 3.11.2...
9 months ago

DO NOT INSTALL THESE FILES INTO YOUR LIVE EFT FOLDER

Requires EFT 0.13.0.21734 (released January 2022)

If this is your first time installing SPT consider using the SPT installer, you can find it here

A guide to installing SPT manually can be found here

Release notes

A LOT of changes, make sure to read below and be prepared for some bugs!

Big thanks to everyone who submitted a bug report and provided logs/profiles. It made fixing issues so much easier.

3.5.0 files CANNOT be extracted on top of an existing 3.4.1 install. it MUST be installed into a fresh copy of EFT.

Mod compatibility

Mods made for 3.4.1 are NOT compatible with 3.5.0

Profile compatibility

HIGHLY RECOMMENDED TO MAKE A NEW ACCOUNT
3.4.1 - Compatible under the following conditions:

  • No crafts running when migrating your profile to 3.5.0
  • No bitcoins ready to collect
  • No fuel in generator
  • Profile has never used an item mod

Automatic install instructions

  • Download Escape from Tarkov from https://www.escapefromtarkov.com/
  • Make a new folder somewhere (not your desktop or program files)
  • Download the SPT-INSTALLER tool and copy the contents into the folder you've created
  • Run SPT_AKI_Installer.exe and let it complete
  • Run Aki.Server.exe and wait for it to start
  • Start Aki.Launcher.exe
  • Enter any username into the username box (NOT the same details as your live account)
  • Click login - choose the edition you want (EoD, Standard etc)
  • Click 'Start game'

Manual install instructions

  • Download Escape from Tarkov from https://www.escapefromtarkov.com/
  • Copy the live Tarkov folder to another location, call it something like "spt341" (Do NOT copy to a protected location, e.g. your Desktop)
  • Do not remove the live Tarkov folder, it must remain in the original install location for SPT to function
  • Copy contents of RELEASE-SPT-3.5.0-21734 (found at the bottom of this post) into your newly created 'spt350' folder using 7Zip
  • Run Aki.Server.exe and wait for it to start
  • Start Aki.Launcher.exe
  • Enter any username into the username box (NOT the same details as your live account)
  • Click login - choose the edition you want (EoD, Standard, etc)
  • Click 'Start game'

Migrating existing profiles to SPT 3.5.0

  • Install SPT 3.5.0 into a fresh folder, copy the user/profiles from your SPT 3.4.1 folder into your new SPT 3.5.0 folder

Known SPT issues

  • Server exe has a different icon (green shape) compared to the launcher
  • RARE: Sometimes you'll start a map with no extracts, the only way to escape is to press alt+f4
  • Some quests need PMCs to spawn in map locations with no bot spawns, making them impossible to complete (e.g. kill x PMCs in scav fortress/base)
  • Selecting the overview tab as a scav can break your client - workaround: alt+f4 to escape
  • Your active flea offers are marked as expired when the server is offline and items are returned in the mail
  • Flea categories don't always show the correct number of offers when filtering by item
  • Extracts are not the same as live, scavs can spawn in PMC spots
  • The server will not load when placed in a folder path containing Unicode characters (Japanese and Korean characters especially)
  • Looting a PMC dogtag doesn't always show their name on the post-raid kill screen
  • Some high level items unlocked through quests are missing from traders' assorts, these will be added as we unlock them on live and dump the data
  • Insured quest items that are consumed in a quest can be returned to the player
  • Traders can sometimes appear in the wrong order
  • Message ModLoader: Mod X is missing from order.json shows on server start
  • Primorsky 46-48 Skybridge Key isnt guaranteed to spawn
  • Adding quote marks to a map marker corrupts the profile

Known NON-SPT issues

  • BSG have blacklisted a lot of high-level items from the flea. You can disable this blacklist by using a mod/editing configs/ragfair.json/dynamic/blacklist/enableBsgList/false
  • Rogues are insanely difficult, this is by BSG's design
  • Tagging items in raid with special characters, e.g. , or " can corrupt the profile on exiting the raid
  • Using horde mode on maps like Customs will cause large numbers of sniper scavs to spawn together in clumps, avoid using horde mode on all maps except factory
  • Receive All shows when nothing can be collected from mail
  • Moving items around in the inventory is very quiet

ADDED

  • Assault scavs have a small chance to be named like player scavs. scav name (pmc name)
  • Added streets map
  • Added custom bot waves to Streets as BSGs waves would only spawn bots in the north-west of the map
  • Added support for Gym
  • Added code to handle Quick Time Events in gym area of hideout
  • Added support for the wall (becomes interactable 24 hours after profile creation)
  • Added support for shooting range + storing high score
  • Added support for quest-unlockable hideout crafts
  • Added new quests (including lighthouse keeper questline)
  • Added new .13 items to game
  • Added new .13 items to flea market
  • Added new boss and his followers: Zryachiy, zryachiyFollower
  • Added a lot of additional PMC weapon mods (90 primary weapons + 16 sidearms)
  • Added new clothing to Ragman
  • Added images for new quests
  • Added streets to various SPT configs
  • Added repair kit buff system when repairing weapons/armor with repair kit
  • Added additional items to PMC equipment pool (e.g. TK heavy trooper mask)
  • Added support for new lighthouse DSP item, can be encoded and used to visit Lighthouse Keeper trader
  • Added support for quest items that can have multiple possible spawn positions
  • PMCs can have different game editions / account (EoD/Standard + Sherpa/Emissary)
  • Added fence bonus tab with cheaper items when player reaches max fence rep
  • Added code to fix empty bot waves on maps (non-marksman bots only)
  • Added spanish translation to launcher
  • Added support for quests that unlock hideout crafts on quest completion
  • Added support for quests that unlock items/crafts on quest start
  • Added scav dailies
  • Added a chance labs access card spawns in pscav inventory (higher chance with more scav rep)
  • Added Troubleshooting skill to profile templates
  • Added underbarrel grenade launchers to PMCs (20% chance) + add system to load them with grenades
  • Added HP regeneration when server is offline
  • Added hydration/energy regeneration when server is offline
  • Added time-locked quest system support to server, quests with time-gates now show
  • Added Streets car extract to scav extract rep gain code
  • Added JSON file validation to server
  • Added crafted hideout improvements to player profile
  • Added developer profile to launcher, each side has different mechanics:
    • Usec - All quests ready to start
    • Bear - All quests ready to hand in

UPDATED

  • Updated to EFT 21734
  • Updated PMC difficulty to pose a greater challenge (hide less/seek out player more)
  • Updated existing quest requirements to match live
  • Updated hideout crafts
  • Updated exit spawn chances
  • Updated boss sawn chances
  • Filter out seasonal loot from bots/maps when not inside season
  • Updated forced quest loot to include streets items
  • Updated daily quest reward pool - blacklist m32a1 40mm cylinder magazine
  • Updated airdrop reward pool - blacklist golden TT
  • Adjust scavcase ammo rewards to not give unstackable ammo
  • Updated trader assorts
  • Updated quests
  • Updated bot equipment/loot
  • Updated flea prices
  • Adjusted assault scav 12g ammo weightings
  • Reworked the missing infiltration point patch to find the closest infil point and use that, should give more live-accurate exfils for scavs
  • Updated map loot
  • Updated loading of server files to be faster
  • Reduced average ragfair sell time when listed item is below average price
  • Limited assault scavs to a max of 1 sight and 2 lights/lasers
  • Disabled scavwars checkbox in pre-raid menu (broken in live - scavs spin and shoot ground)
  • Updated Spanish server locales
  • Adjusted PMC behavior to provide a better challenge (more agressive / dont hide in cover as much)
  • Adjusted water filter drain rate code to be closer in accuracy to live
  • Improved flea offer code listing items for a price below trader price
  • Made half-masks more common on scavs when player is between levels 1-6
  • For bots, force stock spawn chance to 100% if a stock that can take a sub-stock mod is added to a weapon
  • Rewrote scav exfiltration patch code to be easier to modify
  • Blacklisted 357 Speedloader from game as it's not implemented yet
  • Blacklisted Superfors DB 2020 Dead Blow Hammer from flea/airdrops/scavcase rewards
  • Blacklisted lighthouse keeper radio transmitter quest item from fence
  • Blacklisted b-32 from scavcase/airdrop rewards pool
  • Blacklisted new shrapnel item from appearing in SPT via flea/scav case/airdrops
  • Blacklisted some armguards from scavcase rewards list
  • Backlisted DSP from scavcase rewards
  • Adjusted daily quests to not give ammo rewards that stack below 15
  • Adjusted Lighthouse Rogue spawns to start 180 seconds after raid start instead of instantly, allowing normal scavs a chance to spawn
  • Updated scavcase to generate rewards on collection instead of on start
  • Reduced max allowed alive bots cap default value from 25 from 15
  • When processing insurance items prior to returning to player, only remove mods if it could be taken off in raid
  • Updated Russian server translations
  • Made scavs wearing higher level armor less common
  • Updated Sanitar and his followers to have more stims as loot
  • Updated scav weapon durability values to better match live
  • Updated Italian server locale
  • Rounded the hp healing when using post-raid healing, should reduce the off-by-one problems on limbs
  • Removed Letters event quest
  • Updated fence reputation to go to a max of 15 instead of 6
  • Airdrop improvements (flares/turning)
  • Adjusted PMC level 1-14 gear:
    • High level equipment is less common
    • Ears are more common
    • Face shields are much less common

FIXED

  • Fixed hideout water collector assuming power was on since the last time a water filter was inserted
  • Fixed revolvers not showing compatible ammo on flea when choosing linked search
  • Fixed UI disappearing UI problem caused by bots standing in extraction zones too long
  • Fixed Textile part1 and 2 quests being for the wrong side
  • Fixed errors with crafting scav cases
  • Fixed hideout crafts treating the generator as if it's always on when server is offline
  • Fixed an active Halloween event breaking server on game start
  • Fixed errors with buying items from fences' bonus tab
  • Fixed bug in sell chance code when listing an item for much higher than the average price would change sell chance from 0% to 50%
  • Fixed forced loot not being filtered by seasonal check code (Christmas baubles are finally gone)
  • Fixed Repairing a rig not giving armor skill points
  • Fixed scav cases not taking into account fence standing on return time
  • Fixed repair kit not repairing the correct amout of durability
  • Fixed Quests not updating trader rep until after a client reload
  • Fixed jaeger not unlocked after completing quest until after a client reload
  • Fixed orphaned cartridges left over in some profile templates
  • Fixed a bug that caused CustomLocationWaveService to not work, custom PMC spawns should appear again
  • Fixed a persistent JsonUtilityClass error that would fill up the error log
  • Fixed buying multiple items at once and using one of them would alter the properties of all items
  • Fixed completing repeatable quests not updating trader standing until game restart
  • Fixed a bug that caused bots common skills min and max values to be the same
  • Fixed Loyalty buyout/Trust regain quests not appearing correctly
  • Fixed a locale error in itemHelper code
  • Fixed bug when crafting 2 scav cases with the Elite Crafting skill enabled where collecting the second case caused a server error
  • Fixed issue where money inside a container inside the secure container would be used prior to money inside a container inside the stash
  • Fixed missing handguard piece to m4s in starter profiles
  • Fixed mismatch between traders assorts on trader page and on flea page
  • Fixed Items with armor level 0 will no longer have durability loss on flea market
  • Fixed santa spawning on maps outside of the christmas event
  • Fixed PMC weapon generation errors that would cause the code to give bots a generic preset instead
  • Fixed bug that caused PMC count to gradually increase until you had 10+ spawning inside scavFortress on customs over multiple raids
  • Fixed an issue that was causing bot loot to be not as varied as it could be (e.g. Reshala guards not having meds)
  • Fixed 120 cartridge ammo boxes giving one stack of 120 cartridges when opened
  • Fixed post-raid healing causing limbs to have -1 hp than their possible max
  • Fixed buying a 0 count item from the flea when constructing a preset
  • Fixed error that would occur when buying the last remaining item of a category on flea
  • Fixed bug with out out of stock trader items being purchasable when buying items for a weapon preset
  • Fixed buying one item on flea would cause sellers item count to drop by 2
  • Fixed fence weapon preset price being multiplied by config value twice

Modders

  • Calling server endpoints with API tools like Postman will return deobfuscated responses when header debug:1 is set

  • Added bossZryachiy to bot.json/presetBatch

  • Added followerzryachiy to bot.json/presetBatch

  • Added bossZryachiy to bot.json/bosses

  • Added bossZryachiy to bot.json/itemSpawnLimits

  • Added followerzryachiy to bot.json/ equipment

  • Added bossZryachiy to bot.json/equipment

  • Added followerzryachiy to bot.json/equipment

  • Updated akiVersion to 3.5.0

  • Updated compatibleTarkovVersion: 0.13.0.21469

  • Added new bot difficulty values to bots

    • WAIT_INT_COVER_FINDING_ENEMY
    • SHALL_CHANGE_COVER_IF_CAN_SHOOT
  • Updated bots/BossKilla.json/appearance/voice to BossKilla

  • Updated bots/bossknight.json/appearance/voice to bossKnight

  • Updated bots/bosstagilla.json/appearance/voice to bossTagilla

  • Updated bots/followerbirdeye.json/appearance/voice to followerBirdeye

  • Added bosszryachiy.json to bots/types folder

  • Added followerzryachiy.json to bots/types folder

  • Updated gifter.json data

  • Updated database/traders/5ac3b934156ae10c4430e83c/suits.json with new ragman clothing items

  • Updated database/locales with data dumps

  • Updated database/templates with data dumps

  • Updated database/locations/x/base.json files with data from live

  • Added new properties availableInRaid, items_buy items_buy_prohibited to database/traders/xxxx/base.json

  • Added base.json to database\traders\638f541a29ffd1183d187f57 (LighthouseKeeper)

  • Added looseLoot.json to database/locations/tarkovstreets `

  • New endpoint client/hideout/qte/list handed by method DataCallbacks.getQteList()

  • Removed endpoint client/match/offline/start and method MatchCallbacks.startOfflineRaid()

  • Added endpoint client/raid/configuration and method matchCallbacks.getRaidConfiguration()

  • Added endpoint client/items/prices/ and method DataCallbacks.getItemPrices()

  • Removed applicationContext usage of MATCH_INFO (IStartOfflineRaidRequestData)

  • Added applicationContext usage of RAID_CONFIGURATION (IGetRaidConfigurationRequestData)

  • Added profileFixerService.addMissingUpgradesPropertyToHideout()

  • Added RagfairController.getStaticPrices()

  • Added RagfairPriceService.getAllStaticPrices()

  • Added property disabled to TradersInfo

  • Added properties TradingSetting, TradingSettings, BufferZone, MildMusclePain, SevereMusclePain, QTELevelMultipliers, DependentSkillRatios and more to IGlobals

  • Added property UnlockedInfo to profile object

  • Added property Improvements to profile object

  • Added property price to IProcessSellTradeRequestData

  • Removed property RepairKitSettings from Globals

  • Added properties IsUnremovable, IsSpecialSlotOnly, QuestStashMaxCount, ArmorType, LinkedWeapon, UseAmmoWithoutShell to Items object

  • Added STREETS to ELocationName enum

  • Added LIGHTHOUSEKEEPER to Trader enum

  • Removed IStartOffineRaidRequestData interface

  • Removed IMatchCallbacks interface

  • Added ProfileFixerService.addLighthouseKeeperIfMissing()

  • Added ProfileFixerService.addMissingUpgradesPropertyToHideout()

  • Adjusted TradeHelper.sellItem() to use price value passed in as part of request object instead of calculating price of items

Further modding changes

  1. Classes OnLoad and OnUpdate were changed into interfaces. This means you will need to change you extends for implements on your mods.
  2. Class OnLoadOnUpdate was removed, if you need to use that, implement both interfaces on your class:
<span class="kr">export</span> <span class="kr">class</span> <span class="nx">MyMod</span> <span class="kr">implements</span> <span class="nx">OnLoad</span><span class="p">,</span> <span class="nx">OnUpdate</span>
<span class="p">{</span>
    <span class="kr">public</span> <span class="kr">async</span> <span class="nx">onLoad</span><span class="p">()</span><span class="o">:</span> <span class="nx">Promise</span><span class="p"><</span><span class="nt">void</span><span class="p">></span>
    <span class="p">{</span>
        <span class="c1">// my onload
</span><span class="c1"></span>    <span class="p">}</span>
    
    <span class="kr">public</span> <span class="nx">getRoute</span><span class="p">()</span><span class="o">:</span> <span class="kt">string</span>
    <span class="p">{</span>
        <span class="c1">// name for your mod 
</span><span class="c1"></span>    <span class="p">}</span>
    
    <span class="kr">public</span> <span class="kr">async</span> <span class="nx">onUpdate</span><span class="p">(</span><span class="nx">secondsSinceLastRun</span>: <span class="kt">number</span><span class="p">)</span><span class="o">:</span> <span class="nx">Promise</span><span class="p"><</span><span class="nt">boolean</span><span class="p">></span>
    <span class="p">{</span>
        <span class="c1">// on update process
</span><span class="c1"></span>    <span class="p">}</span>
<span class="p">}</span>
  1. DatabaseImporter refactored:
    DatabaseImporter was being used by modders to dynamically load resources from a directory with json files.
    We've extracted this functionality into a utils class for practical use.
    The new importer has a few new tricks up its sleeves and should be faster if using the async calls.
    Both loadRecursive and loadRecursiveAsync were moved inside the ImporterUtil class, which can be injected as normal on the constructor.

Migration example:

<span class="c1">// old:
</span><span class="c1"></span><span class="kd">@inject</span><span class="p">(</span><span class="s2">"DatabaseImporter"</span><span class="p">)</span> <span class="kr">protected</span> <span class="nx">databaseImporter</span>: <span class="kt">DatabaseImporter</span>
<span class="c1">// new:
</span><span class="c1"></span><span class="kd">@inject</span><span class="p">(</span><span class="s2">"ImporterUtil"</span><span class="p">)</span> <span class="kr">protected</span> <span class="nx">importerUtil</span>: <span class="kt">ImporterUtil</span>

Additionally, we've added 2 new features to each of those methods. They now have a callback function that can be used to receive a call for each file that was read with its contents in plain text, and another call for each of the files that were read with the deserialized data:

<span class="c1">// Raw text contents of the file callback
</span><span class="c1"></span><span class="nx">onReadCallback</span><span class="o">:</span> <span class="p">(</span><span class="nx">fileWithPath</span>: <span class="kt">string</span><span class="p">,</span> <span class="nx">data</span>: <span class="kt">string</span><span class="p">)</span> <span class="o">=></span> <span class="k">void</span><span class="p">;</span>
<span class="c1">// deserialized objects of the file callback
</span><span class="c1"></span><span class="nx">onObjectDeserialized</span><span class="o">:</span> <span class="p">(</span><span class="nx">fileWithPath</span>: <span class="kt">string</span><span class="p">,</span> <span class="kt">object</span><span class="o">:</span> <span class="kt">any</span><span class="p">)</span> <span class="o">=></span> <span class="k">void</span><span class="p">;</span>

To use any of these two you can simply do something like this:

<span class="nx">importer</span><span class="p">.</span><span class="nx">loadRecursive</span><span class="p">(</span>
    <span class="s2">"myPath"</span><span class="p">,</span> 
    <span class="p">(</span><span class="nx">pathWithFile</span><span class="p">,</span> <span class="nx">data</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="sb">`Read file: </span><span class="si">${</span><span class="nx">pathWithFile</span><span class="si">}</span><span class="err">\</span><span class="sb">nData: </span><span class="si">${</span><span class="nx">data</span><span class="si">}</span><span class="sb">`</span><span class="p">),</span>
    <span class="p">(</span><span class="nx">pathWithFile</span><span class="p">,</span> <span class="kt">object</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="sb">`Read file: </span><span class="si">${</span><span class="nx">pathWithFile</span><span class="si">}</span><span class="err">\</span><span class="sb">nObject: </span><span class="si">${</span><span class="nx">data</span><span class="si">}</span><span class="sb">`</span><span class="p">),</span>
<span class="p">);</span>

To do some dynamic work on load for each of the objects, this is now a possibility. If using the async version of loadRecursive this would potentially be even faster than using the normal accessor.
Finally, there's a new very powerful version of the loader methods called loadAsync. This new method is 100% asynchronous and about 15% faster than loadRecursiveAsync Ideally you want to use this to load any data that is big enough to cause stutters on load.

  1. New async interfaces
    There is a new set of interfaces that will allow modders to use asynchronous tools when utilizing them. These new interfaces are:
  • IPreAkiLoadModAsync
  • IPostDBLoadModAsync
  • IPostAkiLoadModAsync

As their names suggest they are used in exactly the same fashion as their non-async counterparts.
We've added a mod example that shows both dependency loading and the async tools: 17AsyncImporterWithDependency (1 and 2)

Take into account that async mods get loaded at the end of the life cycle implemented, so all IPreAkiLoadMod will get loaded before any IPreAkiLoadModAsync. The order in which they will be loaded is still respected.
This is important to know, as any dependencies you have may be asynchronous, if thats the case you will need to make your mod asynchronous as well.

On a final note, it is totally possible to implement both IPreAkiLoadMod and IPreAkiLoadModAsync (same with the other interfaces). Just take into account that the selection is not exclusive, both methods will be triggered.

Modder guidance

A short guide can be found here

The example mods have been updated for 3.5.0

  • All resolvable classes can be found here
  • Code documentation can be found here

Thanks

DannyR
tarkov-changes.com
SamSWAT
Murdock101
RaiRai
Kaeno
Clodan
CWX
CZPZ
Ninjaweb
PhantomInTime
ThatGuyXIV
Baliston
Kiobu
Terk
VForValens
BySempron

Don't miss a new build release

NewReleases is sending notifications on new releases.