
For when Jaeger isn't interesting enough
Quests Extended is a client mod, originally authored by CJ, that expands the list of conditions that can be used within quests, with the goal of allowing for more unique / interesting quest designs. There are currently32 additional conditions, including things like activating power switches, restoring health, and searching containers.
Please install this mod before installing a trader that utilizes this mod.
Flea market quests: Flea Market Quests
I will create a proper wiki on GitHub eventually, but for now, here’s a speedrun of the absolute basics:
When creating a quest. create a CounterCreator condition that looks something like the following (expand image):
What’s most important is that the condition itself is impossible to complete; in this case, you are required to kill a pmc from 5555 meters away. This prevents accidental progress on quests. The bottom ‘value’ just under the ‘type’ is important, however, as that will determine how many times your custom condition needs to be met. For example, if you want the player to heal 300 health, set that value to 300.
Keep the id that’s highlighted in mind when we go to the next step. The id in that spot (and only that spot, of the three ids that exist per counter creator) is important.
Create a new .json file and place it in ../BepInEx/plugins/QuestsExtended/Quests. If this new json is anywhere else, it will not be registered. Within this .json, you want something akin to this for each quest (expand image):
The id outside the brackets and the id next to “QuestId” should be the same, and are the id of the quest itself. For each CounterCreator task you have in your quest, create the condition like you see in the image. Remember that highlighted id I mentioned earlier? Place it in the “ConditionId” spot. Check the “Conditions List” tab to see a full list of all custom conditions currently in the mod. The “Locations” can be multiple locations; if you want to have a quest that tracks on Interchange and Customs, but nowhere else, that will work.
Certain quest conditions have additional features. For example, most of the health-related quests can utilize “IncludeBodyParts” (See image below)
When you are creating a release of your mod, I highly recommend you pre-include the .json in its correct path in your download, as that will minimize work on the end user and should prevent complications if the end user downloads your mod first and this one second.
The following is a list of conditions currently in a mod. Some extra comments might be on conditions if they need more explaining. They are separated into multiple catagories for sorting purposes, but implementing any of them is the exact same: Simply copy the Exact Spelling And Capitalization into the “ConditionType”.
General:
EncumberedTimeInSeconds //If the weight indicator in the inventory is yellow or orange, this will increase.
OverEncumberedTimeInSeconds //If the weight indicator in the inventory is red, this will increase.
MoveDistance //None of the “MoveDistance” tasks are mutually exclusive. If the player is moving quietly while crouched, all three of the conditions will increase
MoveDistanceWhileRunning
MoveDistanceWhileCrouched
MoveDistanceWhileProne
MoveDistanceWhileSilent //‘Moving Silently’ means the player is moving slow enough to gain CovertMovement experience. Roughly speaking, if the sound icon in the bottom left is in the left third of the bar, this should increase.
SearchContainer
LootItem
ActivatePowerSwitch
UseKey
CompleteWorkout//WILL BE ADDED IN 2.0.3
CompleteOptionals //See the dedicated “Quests with optional tasks” tab
Combat:
DamageWithAny
DamageWithAR
DamageWithDMR
DamageWithGL
DamageWithLMG
DamageWithMelee
DamageWithPistols
DamageWithRevolvers
DamageWithShotguns
DamageWithSMG
DamageWithSnipers
DamageWithThrowables
DamageToArmour //This tracks the amount of durability lost on the enemy armour.
DestroyEnemyBodyParts //Blacking any body part, including the head or thorax.
KillsWhileADS
KillsWhileCrouched
KillsWhileProne
KillsWhileMounted
KillsWhileSilent //See comment on “MoveDistanceWhileSilent”
KillsWhileBlindFiring
MountedKillsWithLMG
DestroyLegsWithSMG
RevolverKillsWithoutADS //AKA hipfire kills with Revolvers
DamageToArmourWithShotguns
TotalShotDistanceWithSnipers //Every time damage with a sniper rifle is dealt, the distance between the player and the target will be added to this condition. If I hit one bot at 30m and a second at 50m, this condition will be at 80/x. If I then hit someone at 65 m next raid, this task will be at 145/x.
Medical:
FixLightBleed
FixHeavyBleed
FixAnyBleed
FixFracture
HealthLoss
HealthGain
DestroyBodyPart //This means the PLAYER gets a blacked limb, this is not a “destroy limbs on the enemy”. That is in Combat
RestoreBodyPart //Fun fact: A ‘UseItem’ task set to trigger on the use of either surgical kit will accomplish the same thing.
Hideout:
CraftItem
CraftCyclicItem (Water filter, bitcoin farm, booze generator)
CollectScavCase
CollectCultistOffering
CompleteWorkout
Trading:
CompleteAnyTransaction (Use subconditions to modify this!)
SpendMoneyOnTransaction (Buying items)
EarnMoneyOnTransaction (Selling items)
Misc:
FixAnyMalfunction
FixARMalfunction
FixDMRMalfunction
FixLMGMalfunction
FixPistolMalfunction
FixShotgunMalfunction
FixSMGMalfunction
FixSniperMalfunction
Below is a list of all of the “Subconditions” you can put on a QE condition. Think of theses like your “distance”, “equipment”, “found in raid only” type things in normal EFT conditions. I will include a range of values if there’s a limited amount, or examples of what you would put if there is a theoretically infinite range of values (such as specific ids)
It is important to note that ALL of these can be null; in other words, you will only need to add these to your conditions if you are using them. If not, save yourself the time.
Bools (true/false):
IsFail (Is your QE condition for a Fail condition instead of a “complete” condition? If so, mark this as true!)
Lists (make sure values are in brackets! []) Locations[]: Identical to normal quest crafting, be sure to utilize the correct name. “any” also works as a condition, though since this can be null, you don’t need it. Useable for any quest.
Include/ExcludeBodyParts: [“Head”, “Chest”, “Stomach”, “LeftArm”, “RightArm”, “LeftLeg”, “RightLeg”]. Identical to normal quest crafting. Used in combat-related quests.
Workstations (Try to be case sensitive): [“IntelligenceCenter”, “Kitchen”, “MedStation”, “WaterCloset”(Lavatory), “Workbench”]. Used in CraftAnyItem.
CyclicWorkstations (Try to be case sensitive): [“BitcoinFarm”, “WaterCollector”, “BoozeGenerator”]. Used in CraftCyclicItem.
TraderIds[]: You can place any vanilla trader id or any custom trader id to specify which trader(s) you wish the player to trade with. Used in Trading quests.
CurrencyTypes: [“EUR”, “RUB”, “USD”]. Used to specify if trades must be done with the specific type of currency. Used in Trading quests.
IT IS IMPORTANT TO NOTE: CurrencyTypes is a UNIQUE subcondition in that the primary condition actually changed based off of the existence of this subcondition. If you do NOT specify a CurrencyType, then all transactions will convert to the rouble value and increment the quest based off that. For example, a condition to spend 2 million of no specified currency will increment on any currency type, whereas the same condition with the specification of “RUB” will only increment when roubles are used.
EnemyTypes: [“USEC”, “BEAR”, “SCAV” or “SAVAGE”]. Currently there is no “pmc” option: You must put both “USEC” and “BEAR” if you want to replicate a “pmc” option. I will probably add “pmc” in the next patch, I didn’t notice it was missing until I was writing this lol. Used in most Combat quests
KeyIds[]: The item id for the key(s) needs to be placed inside the []. Keys and Keycards work here. If you don’t know how to find an item id, you probably aren’t ready to be making quests with QE yet. Used in UseKey
QuestsToStart[]: Please see “Multiple Choice Quests” for more information. Any quest ID you place into this list will become AVAILABLE FOR START, as if you had just completed the quest that would naturally unlock the one you place here. Used on any quest
1.7.5 introduces the “CompleteOptionals” condition, which allows you to create a list of ‘optional’ conditions under one main condition and have the player complete X amount of the ‘optional’s. To create an optional task , you simply add the id of the parent condition to the “parentId” spot when creating the ‘optional’ condition (this is a vanilla feature in Tarkov). The optional tasks may be vanilla conditions or QE conditions, both work. When the player completes an optional objective, only the quest that the completed optional objective is in will increase. In the future, I might add a “CompleteAnyOptionals”, but for now it is only per-quest.
While I have tested this condition a fair amount, it is still experimental. Use with caution.
Create an impossible “AvailableForStart” task (similar to creating an impossible “AvailableForFinish” condition). I recommend a simple “level 99” condition:
Within your custom conditions json, you will need to add some things (click to enlarge):
You will notice that this quest has an extra line defined BEFORE the “condition:[]”: “IsMultipleChoiceStarter”: true. You only need this line if the quest is actually an MCS, it’s assumed false for other quests. Additionally, *most* conditions have an additional thing: “QuestsToStart”: [““]. You made add one or more QUEST Ids to this list, and those quests will automatically be started as soon as the quest is finished (happens before the quest is technically turned in, btw). You will notice that the “CompleteOptionals” itself doesn’t have a QuestsToStart; this is because that condition will always be completed, so any ids you might put there will always be triggered (so if you want a certain quest after this one no matter what, have it unlock normally upon quest completion.) You need to place every condition in a quest that is marked as “IsMultipleChoiceStarter” into this .json. If a specific condition does not start a task, leave QuestsToStart empty for that condition.
You will additionally notice that there is an “EmptyWithQuestStarter” condition type. Use “EmptyWithQuestStarter” if the task is a vanilla condition, and not a QE condition. The reason you need to include the condition in the json is so that your multiple choice quest will actually work.
I am not currently planning on making this mod 100% compatible with FIKA. I would need to re-write 95% of the code in the mod to handle multiple players. The mod is currently extremely set on there being one player. If you use FIKA for the performance increase or other features but you still play solo, you should be able to use this mod without issues. I have tried to make that specific case functional. If QE ever becomes fully FIKA compatible in the future, it will be a separate download: Singleplayer and Multiplayer would simply be too different for this mod to try and handle in one.
0.0 MB
113 Downloads
I packaged 3.3.1 incorrectly like a complete idiot. This fixes that. Enough people have downloaded 3.3.1 that I decided to push a new version instead of just editing the download so that people know.
0.0 MB
110 Downloads
-Changed “CraftItem” to be “CraftAnyItem” (matches published documentation) -Backend work to prevent a possible softlock in which a quest that was started “the QE way” is not accepted before the game is closed, therefore preventing them from ever seeing the quest.
0.0 MB
108 Downloads
NEW FEATURES: -The mod is now “semi-compatible” with FIKA. See the new description tab, but the short version is this: If you “solo-play” FIKA, you should be totally good. If you actually play FIKA with multiple people (y’know, like you’re meant to), its uh… it’s better than last version.
NEW QUEST CONDITIONS: “UseKey” (Works with keys and keycards)
NEW SUBCONDITIONS: KeyId Zones (Technically existed but wasn’t utilized until now)
Should be fairly bug-free. Massive appreciation to Austib once again for being the perfect tester. Every developer needs someone like him.
This is the version that Guiding Light is planning to release with.
631 Downloads
-Fixed an error caused by vibe coding at 1am (I’m going to sleep…)
43 Downloads
-Fixed “EnemyTypes” checking the player’s side (usec / bear / scav) instead of the enemy’s side (thanks Austib for the report!)
330 Downloads
INTO THE OUTER DARKNESS WITH THAT GLITCH
THERE WILL BE WEEPING AND GNASHING OF TEETH. IT WILL SUFFER.
Ahem.
-Fixed QE’s contribution to the issue where bots could become unlootable / freeze / glitch after death.
THIS HAS BEEN TESTED. THE BUG HAS BEEN REPORTED WITHOUT THE PRESCENCE OF QE AND EVEN IN LIVE TARKOV. IT IS NO LONGER QE’S FAULT.
A massive thank you to TheGoldenaxe001 (TheGoldenAxe001 / Raptor) for testing this with me, providing logs, and just generally being helpful. He will remember this.
Details
-
GUID
com.dirtbikercjandlotw.questsextended
-
Category
-
License
-
Source Code
-
Latest Version VirusTotal Result
Good job much obliged for the hard work!
lol, it reminds me BSG bug 2024 end, after zombie event was finished. There was literally same bug when last killed for achievement unit stuck lagging
Could I get you to DM me in discord, by chance? Same username as here.
It’s picking up achievements… I see. Let me try to fix that.
This is still causing issues with AI freezing on death. I can send logs if needed. It seems to be a degrading issue where more and more bots are affected the more you play
Still a few issues with bots becoming unlootable and animation stuck mostly with bosses but happens in general sometimes, but not always as it was before.
Why change the file name from QuestsExtended to GuidingLight?
It’s confusing when looking for this mod in the folder, as it’s named differently.
Heads up, I ran into conflicts with this mod and FIKA that cause bots to freeze on death repeating their last action.
Sup bro, after I’ve installed QE and passed first week i have now issues with weekly tasks. Suppose there is something wrong with generation. Here is the part of the log:
[2025-07-18T21:51:25.968Z] error: TypeError: Cannot read properties of undefined (reading ‘min’) at RepeatableQuestGenerator.generateCompletionAvailableForFinish (C:\snapshot\project\obj\generators\RepeatableQuestGenerator.js) at RepeatableQuestGenerator.generateCompletionQuest (C:\snapshot\project\obj\generators\RepeatableQuestGenerator.js) at RepeatableQuestGenerator.generateRepeatableQuest (C:\snapshot\project\obj\generators\RepeatableQuestGenerator.js) at RepeatableQuestController.getClientRepeatableQuests (C:\snapshot\project\obj\controllers\RepeatableQuestController.js) at QuestCallbacks.activityPeriods (C:\snapshot\project\obj\callbacks\QuestCallbacks.js) at RouteAction.action (C:\snapshot\project\obj\routers\static\QuestStaticRouter.js) at QuestStaticRouter.handleStatic (C:\snapshot\project\obj\di\Router.js) at HttpRouter.handleRoute (C:\snapshot\project\obj\routers\HttpRouter.js) at HttpRouter.getResponse (C:\snapshot\project\obj\routers\HttpRouter.js) at HttpRouter.result.getResponse (E:\spt3113\user\mods\fika-server\src\overrides\routers\HttpRouter.ts:27:63) [2025-07-18T21:51:25.809Z] debug: Adding: 0.04 58330581ace78e27b8b10cee trader reputation reward [2025-07-18T21:51:25.822Z] debug: Generating: Daily quest for: 5935c25fb3acc3127c3d8cd9 with budget: 5982 totalling: 4 items [2025-07-18T21:51:25.823Z] debug: Added item: 648067db042be0705c0b3009 with price: 9975 [2025-07-18T21:51:25.823Z] debug: Adding: 0.02 5935c25fb3acc3127c3d8cd9 trader reputation reward [2025-07-18T21:51:25.837Z] debug: Generating: Daily quest for: 5c0647fdd443bc2504c2d371 with budget: 33586 totalling: 3 items [2025-07-18T21:51:25.838Z] debug: Added item: 6389c70ca33d8c4cdf4932c6 with price: 18000 [2025-07-18T21:51:25.838Z] debug: Reward pool empty with: 15586 roubles of budget remaining [2025-07-18T21:51:25.838Z] debug: Adding: 0.01 5c0647fdd443bc2504c2d371 trader reputation reward [2025-07-18T21:51:25.855Z] debug: Added weapon: 6718817435e3cfd9550d2c27 with price: 88235 [2025-07-18T21:51:25.867Z] debug: Generating: Daily quest for: 6617beeaa9cfa777ca915b7c with budget: 6687 totalling: 4 items [2025-07-18T21:51:25.867Z] debug: Added item: 5e340dcdcb6d5863cc5e5efb with price: 4700 [2025-07-18T21:51:25.867Z] debug: Reward pool empty with: 1987 roubles of budget remaining [2025-07-18T21:51:25.867Z] debug: Adding: 0.04 6617beeaa9cfa777ca915b7c trader reputation reward [2025-07-18T21:51:25.881Z] debug: Generating: Daily quest for: 58330581ace78e27b8b10cee with budget: 28935 totalling: 1 items [2025-07-18T21:51:25.882Z] debug: Added item: 6284bd5f95250a29bc628a30 with price: 21000 [2025-07-18T21:51:25.882Z] debug: Reward pool empty with: 7935 roubles of budget remaining [2025-07-18T21:51:25.882Z] debug: Adding: 0.01 58330581ace78e27b8b10cee trader reputation reward [2025-07-18T21:51:25.882Z] debug: Generating new weekly [2025-07-18T21:51:25.895Z] debug: Generating: Weekly quest for: 54cb50c76803fa8b248b4571 with budget: 559836 totalling: 5 items [2025-07-18T21:51:25.895Z] debug: Added item: 6cc7d60178706926401b7c8d with price: 70000 [2025-07-18T21:51:25.895Z] debug: Adding: 0.04 54cb50c76803fa8b248b4571 trader reputation reward [2025-07-18T21:51:25.931Z] debug: Generating: Weekly quest for: 5935c25fb3acc3127c3d8cd9 with budget: 798907 totalling: 7 items [2025-07-18T21:51:25.933Z] debug: Added item: 5c12620d86f7743f8b198b72 with price: 120000 [2025-07-18T21:51:25.968Z] error: TypeError: Cannot read properties of undefined (reading ‘min’) [2025-07-18T21:51:25.968Z] error: TypeError: Cannot read properties of undefined (reading ‘min’) at RepeatableQuestGenerator.generateCompletionAvailableForFinish (C:\snapshot\project\obj\generators\RepeatableQuestGenerator.js) at RepeatableQuestGenerator.generateCompletionQuest (C:\snapshot\project\obj\generators\RepeatableQuestGenerator.js) at RepeatableQuestGenerator.generateRepeatableQuest (C:\snapshot\project\obj\generators\RepeatableQuestGenerator.js) at RepeatableQuestController.getClientRepeatableQuests (C:\snapshot\project\obj\controllers\RepeatableQuestController.js) at QuestCallbacks.activityPeriods (C:\snapshot\project\obj\callbacks\QuestCallbacks.js) at RouteAction.action (C:\snapshot\project\obj\routers\static\QuestStaticRouter.js) at QuestStaticRouter.handleStatic (C:\snapshot\project\obj\di\Router.js) at HttpRouter.handleRoute (C:\snapshot\project\obj\routers\HttpRouter.js) at HttpRouter.getResponse (C:\snapshot\project\obj\routers\HttpRouter.js) at HttpRouter.result.getResponse (E:\spt3113\user\mods\fika-server\src\overrides\routers\HttpRouter.ts:27:63)