MusicManiac added a new version:
QuoteRemoved debug console spam.
No changes in functional part of the loader.
Dependencies are included
Installation: put folders into your user/mods folder.
MusicManiac added a new version:
QuoteRemoved debug console spam.
No changes in functional part of the loader.
Dependencies are included
Installation: put folders into your user/mods folder.
MusicManiac added a new version:
QuoteRemoved debug console spam.
No changes in functional part of the loader.
Dependencies are included
Installation: put folders into your user/mods folder.
MusicManiac added a new file:
QuoteDisplay MoreRegarding SPT 3.9.X
If you're a user:
I do not have SPT 3.9.X installed and not sure if I will in nearest future.If you're a modder:
Do not reupload my 3.8.X mods, thank you. If you want to fix compatibility, please ping @MusicManiac on SPT discord and I can add you to authors so you can update the mod if it requires an update.50round mag for 9x39mm
If someone wanna make custom bundle for it hit me up, currently it's cloned from existing item.
Can be bought of flea or mechanic LL2.
Recommended to be ran with Two Slot Extended Mags
Drum mag can be found here: Tron's The Little Drummer Boy (Fixed)
To use good pistol grips for VAL:andre1337's Expansion Pack
If you wanna be true homie or say thanks for time I've spent modding the game, feel free to send me a coffee on kofi
MusicManiac added a new version:
QuoteAdded goons and zryachi to list of bosses that can count of kill bosses quests
Added quest for stims
All dependencies are included
Installation: put folders into your user/mods folder. Preferably delete old version of MusicManiac-Erika folder.
MusicManiac added a new version:
QuoteRefractured code, now has a dependency.
Added quest fog high capacity mags.
Don't forget to install dependency: MusicManiac's Custom Quest Loader (MMCQL)
Installation: put folders into your user/mods folder.
MusicManiac added a new file:
QuoteDisplay MoreI'll look into updating my mods when website stops fking dying
THIS DOES NOT HAVE ANY CONTENT, IT'S A DEPENDENCY FOR MODDERS TO USE
This tool is similar to Virtual's Custom Quest Loader in regards of functionality, but it has a couple of QOL features in it:
- Automatic ID generation
- Automatic arrays formating
- Equipment and weapons categories to use in quests
- Which in turn makes your quests automatically support modded items
- Quests configuration on user-side via config file (so they don't have to go dig inside quests jsons to change values).
Mods developed for Virtual's Custom Quest Loader will work with this loader, this is why folders structure is preserved. My guenia pig for testing this was Guiding Light (85%), which has well over 50 quests with different conditions, counter, etc.
However, it's one-way compatibility. If you use QOL features in this loader, your quests will NOT load correctly in Virtual's Custom Quest Loader. They will most likely load, you'll get no errors, but they will most definitely be broken in-game.
QnA:
Q: Can I run this alongside Virtual's Custom Quest Loader?
A: Yes.
Q: Do I need to move my custom traders that I installed from Virtual's Custom Quest Loader to this mod?
A: No, unless they get updated and their dependency changes from Virtual's Custom Quest Loader to this.
Q: Can I delete Virtual's Custom Quest Loader and use this instead?
A: Yes but you don't need to + you'll need to dig in mod files. Just use VCQL. All the QOL in this mod is for MODDERS (with exception of ability to painlessly configure quests by users). You only EVER need this if you run a mod that has a dependency on this.Installation is simple, download this mod, put the mod inside SPT/user/mods folder.
This mod has a dependency on it's own, Weapon Categories Fixer because to use some features of this loader, we first gotta fix BSG inconsistent database.
It's included in the download.
Resources for developing quests:
- Resources: Quest Values Reference Tool
- https://db.sp-tarkov.com/search
- Any trader that adds quests
- Vanilla quests that can be found in Aki_Data/server/database/templates/quests.json
Following things are needed to add your quests into the game:
Traders (Optional)
If you want to have trader + quests, this mod can handle quests side of trader. Loading the trader himself you'll have to do on your own. As a good example to look at how you can load a trader (with pretty much changing a couple of values here and there), check out Guiding Light (85%) or Erika. I'm sure there are more mods that do same thing but these are the only 2 that I use, therefore I looked at their code (or in case of Erika, wrote one) and know that it can be easily adjusted to make your own trader. Or use templates from https://dev.sp-tarkov.com/chomp/ModExamples.
Configs (Optional)
You can add config files for your quests so users can adjust quests as they like. Read more on it in next tab.
Quests (Mandatory)
Quest files can have any name but must follow the format in Aki_Data/server/database/templates/quests.json. For more examples of how quests can look you can check Guiding Light (85%) or Erika, for example.
Side specific quests are supported. The "side" value of a quest can either be "Pmc" (for both sides), "Bear" or "Usec".
Locales (Mandatory)
Language files must also follow a particular format. You can check how exisiting locales file look in Aki_Data/server/database/locales/global/en.
Locales files can also have any name.
Every unique locale, located in any of the language files, will be added to every other place where the same key is not present.
Images (Optional)
All images need to be 314 x 177 and MUST be either a .png or .jpg.
To use custom images, place the image into the 'res/quests' directory and reference the name of the image in your quest file. For example, if you place testImg.png in the folder you can reference it in your quests like "image": "/files/quest/icon/testImg.png",
All Tarkov quest images can be found in Aki_Data/server/images/quests, feel free to use them or load your own.
Now this is where we shine.
This section assumes you're capable browsing AKI_DATA/server/database/templates/quests.json to see how vanilla quests look like or you have used VCQL before.
1. Automatic ID generation
CodeDisplay More"QM_45_AP": { "_id": "QM_45_AP", ... "conditions": { "AvailableForFinish": [ { "_parent": "CounterCreator", "_props": { "counter": { "conditions": [ { "_parent": "Kills", "_props": { ... "id": "thisIsRandomizedInCode", ... } }, { "_parent": "Location", "_props": { "id": "thisIsRandomizedInCode", "target": [ "bigmap" ] } } ], "id": "thisIsSetInCode" }, ... "id": "QM_45_AP Kills_0", "type": "Elimination", ... }, "dynamicLocale": false } ], "AvailableForStart": [ { "_parent": "Level", "_props": { ... "id": "thisIsRandomizedInCode", ... }, "dynamicLocale": false }, { "_parent": "Quest", "_props": { ... "id": "thisIsRandomizedInCode", ... }, "dynamicLocale": false } ], ... }, ... }
What can we see in this snippet:
- Counter conditions ID's no longer need to be set. You don't have to generate new ID for any of your Kill Counter conditions. If you want to generate them, you still can, loader will randomize only ones that are set to "thisIsRandomizedInCode". Attention: this randomizes IDs of conditions use ONLY in "type": "Elimination," counters ("_parent": "CounterCreator",). Why? Because those ID's are unimportant from modding perspective.
- "AvailableForStart" level and quest conditions ("_parent": "Level" and "_parent": "Quest") also can be randomized, they are unimportant to modder.
- Counter itself has an ID, and this one is important. To save progress on quest, information is written in save file, and counterID needs to be same between player sessions. That's why you can see it's not "thisIsRandomizedInCode" but it's "id": "thisIsSetInCode". It set's counter id to quest _id + " counterId". As usual, this only works if you don't set counter id yourself. If it's anything else than "id": "thisIsSetInCode", loader will not touch it.
For example, in snippet above, counter id would be set to "QM_45_AP Kills_0 counterId". And it would be set to it every time loader runs, as long as you keep the same "id": "QM_45_AP Kills_0", which you shouldn't be changing anyway.Example How Above snippet looks without skipping lines:
CodeDisplay More"QM_45_AP": { "QuestName": "Getting that .45 ACP AP", "_id": "QM_45_AP", "acceptPlayerMessage": "QM_45_AP description", "canShowNotificationsInGame": true, "changeQuestMessageText": "QM_45_AP changeQuestMessageText", "completePlayerMessage": "QM_45_AP successMessageText", "conditions": { "AvailableForFinish": [ { "_parent": "CounterCreator", "_props": { "counter": { "conditions": [ { "_parent": "Kills", "_props": { "compareMethod": ">=", "id": "thisIsRandomizedInCode", "target": "Any", "value": "1" } }, { "_parent": "Location", "_props": { "id": "thisIsRandomizedInCode", "target": [ "bigmap" ] } } ], "id": "thisIsSetInCode" }, "doNotResetIfCounterCompleted": false, "dynamicLocale": false, "id": "QM_45_AP Kills_0", "index": 0, "oneSessionOnly": false, "parentId": "", "type": "Elimination", "value": "20", "visibilityConditions": [] }, "dynamicLocale": false } ], "AvailableForStart": [ { "_parent": "Level", "_props": { "compareMethod": ">=", "dynamicLocale": false, "id": "thisIsRandomizedInCode", "index": 0, "parentId": "", "value": 40, "visibilityConditions": [] }, "dynamicLocale": false }, { "_parent": "Quest", "_props": { "availableAfter": 0, "dispersion": 0, "dynamicLocale": false, "id": "thisIsRandomizedInCode", "index": 0, "parentId": "", "status": [ 4 ], "target": "GL_4M", "visibilityConditions": [] }, "dynamicLocale": false } ], "Fail": [] }, "description": "QM_45_AP description", "failMessageText": "QM_45_AP failMessageText", "image": "/files/quest/icon/596b453b86f77457c827bf44.jpg", "instantComplete": false, "isKey": false, "location": "any", "name": "QM_45_AP name", "note": "QM_45_AP note", "questStatus": {}, "restartable": false, "rewards": { "Fail": [], "Started": [], "Success": [] } }, "secretQuest": false, "side": "Pmc", "startedMessageText": "QM_45_AP description", "successMessageText": "QM_45_AP successMessageText", "templateId": "QM_45_AP", "traderId": "Erika_Temporal_Id", "type": "Skill" }
If you ever made a quest that excludes or includes weapon parts or equipment you hate yourself, BSG, earth, sky, heaven and life.
If you make a killcounter that has "equipmentInclusive":, "equipmentExclusive", "weaponModsExclusive' or "weaponModsInclusive" you know that each equipment id has to be in a separate array. Loader implements QOL feature that puts the ids into correct format.
Example:
CodeDisplay More"QM_30mm_scopes": { "QuestName": "Getting those 30mm riflescopes", "_id": "QM_30mm_scopes", ... "conditions": { "AvailableForFinish": [ { "_parent": "CounterCreator", "_props": { "counter": { "conditions": [ { "_parent": "Kills", "_props": { ... "weaponModsInclusive": ["asdb234nj24j32324", "324jnbkj213jbkjb", "21kj31kj32jbfkj"], "weaponModsEclusive": ["324jn324j23n4rfe", "fjn3i4023409fj203jj"], "equipmentInclusive": ["5c0558060db834001b735271"], "equipmentExclusive": ["348945978ghn934htg374htr", "3278hf7fh37fh78f4g72fg"], "value": "1" } } ], "id": "thisIsSetInCode" }, ... }, "dynamicLocale": false }
As you can see, "weaponModsInclusive": ["asdb234nj24j32324", "324jnbkj213jbkjb", "21kj31kj32jbfkj"], is an array with depth of 1, not an array of arrays (as BSG does it for some reason). To clarify, usually any of weaponModsInclusive, weaponModsEclusive, equipmentInclusive, equipmentExclusive has to follow format of [["id1"], ["id2"], ["id3"], ...].
This is optional to use, if you put your ids into array of arrays (as BSG quests do), loader will not touch them. So:
- "weaponModsInclusive": ["asdb234nj24j32324", "324jnbkj213jbkjb", "21kj31kj32jbfkj"], - this will work
- "weaponModsInclusive": [["asdb234nj24j32324"], ["324jnbkj213jbkjb"], ["21kj31kj32jbfkj"]], - this will work
- However, do not combine them inside one property. Loader checks if property (such as "weaponModsInclusive" is an array of arrays, and if it's not, it wraps each element into array)
"weaponModsInclusive": [["asdb234nj24j32324"], "324jnbkj213jbkjb", "21kj31kj32jbfkj"], - this will not workFor next QOL feature to work, these properties must be in 1-depth array. It's made this way to provide compatibility with OLD quests written for Virtual's Custom Quest Loader.
Example How Above snippet looks without skipping lines and applying 2 features previously described:
CodeDisplay More"QM_45_AP": { "QuestName": "Getting that .45 ACP AP", "_id": "QM_45_AP", "acceptPlayerMessage": "QM_45_AP description", "canShowNotificationsInGame": true, "changeQuestMessageText": "QM_45_AP changeQuestMessageText", "completePlayerMessage": "QM_45_AP successMessageText", "conditions": { "AvailableForFinish": [ { "_parent": "CounterCreator", "_props": { "counter": { "conditions": [ { "_parent": "Kills", "_props": { "compareMethod": ">=", "id": "thisIsRandomizedInCode", "target": "Any", "weaponModsInclusive": ["asdb234nj24j32324", "324jnbkj213jbkjb", "21kj31kj32jbfkj"], "weaponModsEclusive": ["324jn324j23n4rfe", "fjn3i4023409fj203jj"], "equipmentInclusive": ["5c0558060db834001b735271"], "equipmentExclusive": ["348945978ghn934htg374htr", "3278hf7fh37fh78f4g72fg"], "value": "1" } }, { "_parent": "Location", "_props": { "id": "thisIsRandomizedInCode", "target": [ "bigmap" ] } } ], "id": "thisIsSetInCode" }, "doNotResetIfCounterCompleted": false, "dynamicLocale": false, "id": "QM_45_AP Kills_0", "index": 0, "oneSessionOnly": false, "parentId": "", "type": "Elimination", "value": "20", "visibilityConditions": [] }, "dynamicLocale": false } ], "AvailableForStart": [ { "_parent": "Level", "_props": { "compareMethod": ">=", "dynamicLocale": false, "id": "thisIsRandomizedInCode", "index": 0, "parentId": "", "value": 40, "visibilityConditions": [] }, "dynamicLocale": false }, { "_parent": "Quest", "_props": { "availableAfter": 0, "dispersion": 0, "dynamicLocale": false, "id": "thisIsRandomizedInCode", "index": 0, "parentId": "", "status": [ 4 ], "target": "GL_4M", "visibilityConditions": [] }, "dynamicLocale": false } ], "Fail": [] }, "description": "QM_45_AP description", "failMessageText": "QM_45_AP failMessageText", "image": "/files/quest/icon/596b453b86f77457c827bf44.jpg", "instantComplete": false, "isKey": false, "location": "any", "name": "QM_45_AP name", "note": "QM_45_AP note", "questStatus": {}, "restartable": false, "rewards": { "Fail": [], "Started": [], "Success": [] } }, "secretQuest": false, "side": "Pmc", "startedMessageText": "QM_45_AP description", "successMessageText": "QM_45_AP successMessageText", "templateId": "QM_45_AP", "traderId": "Erika_Temporal_Id", "type": "Skill" }
Ever wanted to make the quest that requires kills with pistols only and realized you have to put every goddamn pistol id in the quest? This loader features loading categories of weapons/equipment/attachments/barter items/etc. Currently implemented categories can be viewed in mod.ts in public configureCategories(itemDB) function. It parses the database before adding quests. This means that these categories support modded items. For example, if you have a mod that adds brand new sniper rifle that shoots 7,62x51mm rounds, it will automatically count for all the quests that have either "sniperRifles762x51" or "sniperRifles" listed in their weapons.
So you could do something like
CodeDisplay More"QM_45_AP": { "_id": "QM_45_AP", ... "conditions": { "AvailableForFinish": [ { "_parent": "HandoverItem", "_props": { ... "target": ["scopes30mm", "23h123ubuidh1u23ghiu1", "sniperRifles"], "value": "5", "visibilityConditions": [] }, "dynamicLocale": false }, { "_parent": "CounterCreator", "_props": { "counter": { "conditions": [ { "_parent": "Kills", "_props": { ... "weapon": ["SMGs45", "pistols45", "23h3jkhb2hj3bhb12h3gb12h"], "weaponModsInclusive": ["scopes30mm", "324jnbkj213jbkjb", "21kj31kj32jbfkj"], "weaponModsEclusive": ["flashlights", "tacticalComboDevices"], "equipmentInclusive": ["5c0558060db834001b735271", "backpacks (not implemented category, just an example)"], "equipmentExclusive": ["348945978ghn934htg374htr", "helmets (not implemented category, just an example)"], ... } } ], "id": "thisIsSetInCode" }, ... "type": "Elimination", ... }, "dynamicLocale": false } ... }
As you can see, instead of listing every damn id inside "weapon" property we can just list some categories. You can mix in normal ids there too. Note that list of categories available to be used is limited and needs to be expanded manually. If you want to have a category created, you will have to ask for it and wait for it. Providing a code snippet that can be added to public parseItemsDatabase(itemDB) function will accelerate the process.
Categories work in:
- In "_parent": "CounterCreator", of "type": "Elimination", inside "_parent": "Kills", conditions properties: "weapon": ,"equipmentInclusive":, "equipmentExclusive", "weaponModsExclusive' or "weaponModsInclusive"
- In "_parent": "HandoverItem", properties "_props": inside "target": property
For this QOL feature to work, these properties must be in 1-depth array. It's made this way to provide compatibility with OLD quests written for Virtual's Custom Quest Loader, as I don't expect people to convert old quests into better format since they will load anyway.
- These will work:
- "weapon": ["SMGs45", "pistols45", "23h3jkhb2hj3bhb12h3gb12h"],
- "weaponModsInclusive": ["scopes30mm", "324jnbkj213jbkjb", "21kj31kj32jbfkj"],
- "weaponModsEclusive": ["flashlights", "tacticalComboDevices"],
- "equipmentInclusive": ["5c0558060db834001b735271", "backpacks"],
- "equipmentExclusive": ["348945978ghn934htg374htr", "helmets"],
- These will NOT work:
- "weaponModsInclusive": [["scopes30mm"], ["324jnbkj213jbkjb"], ["21kj31kj32jbfkj"]],
- "weaponModsEclusive": ["flashlights", "tacticalComboDevices", ["djk234jkb32423h4gk34h"]],
- "equipmentInclusive": [["5c0558060db834001b735271"], ["backpacks"]],
- "equipmentExclusive": ["348945978ghn934htg374htr", ["helmets"]],
Example How Above snippet looks without skipping lines and applying 3 features previously described:
CodeDisplay More"QM_45_AP": { "QuestName": "Getting that .45 ACP AP", "_id": "QM_45_AP", "acceptPlayerMessage": "QM_45_AP description", "canShowNotificationsInGame": true, "changeQuestMessageText": "QM_45_AP changeQuestMessageText", "completePlayerMessage": "QM_45_AP successMessageText", "conditions": { "AvailableForFinish": [ { "_parent": "HandoverItem", "_props": { "countInRaid": false, "dogtagLevel": 0, "dynamicLocale": false, "id": "QM_45_AP HandoverItem_0", "index": 0, "isEncoded": false, "maxDurability": 100, "minDurability": 0, "onlyFoundInRaid": false, "parentId": "", "target": [ "5efb0cabfb3e451d70735af5", "scopes30mm" ], "value": "600", "visibilityConditions": [] }, "dynamicLocale": false }, { "_parent": "CounterCreator", "_props": { "counter": { "conditions": [ { "_parent": "Kills", "_props": { "compareMethod": ">=", "id": "thisIsRandomizedInCode", "target": "Any", "weapon": ["SMGs45", "pistols45"], "weaponModsInclusive": ["scopes30mm", "324jnbkj213jbkjb", "21kj31kj32jbfkj"], "weaponModsEclusive": ["flashlights", "tacticalComboDevices"], "equipmentInclusive": ["5c0558060db834001b735271"], "equipmentExclusive": ["348945978ghn934htg374htr"], "value": "1" } }, { "_parent": "Location", "_props": { "id": "thisIsRandomizedInCode", "target": [ "bigmap" ] } } ], "id": "thisIsSetInCode" }, "doNotResetIfCounterCompleted": false, "dynamicLocale": false, "id": "QM_45_AP Kills_0", "index": 0, "oneSessionOnly": false, "parentId": "", "type": "Elimination", "value": "20", "visibilityConditions": [] }, "dynamicLocale": false } ] "AvailableForStart": [ { "_parent": "Level", "_props": { "compareMethod": ">=", "dynamicLocale": false, "id": "thisIsRandomizedInCode", "index": 0, "parentId": "", "value": 40, "visibilityConditions": [] }, "dynamicLocale": false } ], "Fail": [] }, "description": "QM_45_AP description", "failMessageText": "QM_45_AP failMessageText", "image": "/files/quest/icon/596b453b86f77457c827bf44.jpg", "instantComplete": false, "isKey": false, "location": "any", "name": "QM_45_AP name", "note": "QM_45_AP note", "questStatus": {}, "restartable": false, "rewards": { "Fail": [], "Started": [], "Success": [ { "target": "Erika_Temporal_Id QM_45_AP Trade", "id": "QM_45_AP Erika_Temporal_Id QM_45_AP Trade", "type": "AssortmentUnlock", "index": 3, "loyaltyLevel": 1, "traderId": "Erika_Temporal_Id", "items": [ { "_id": "Erika_Temporal_Id QM_45_AP Trade", "_tpl": "5efb0cabfb3e451d70735af5", "parentId": "hideout", "slotId": "hideout" } ] } ] }, "secretQuest": false, "side": "Pmc", "startedMessageText": "QM_45_AP description", "successMessageText": "QM_45_AP successMessageText", "templateId": "QM_45_AP", "traderId": "Erika_Temporal_Id", "type": "Skill" }
Balancing quests is annoying cuz people always complain about balance anyway? This loader allows configs for your quests. Users no longer have to go browse jsons of quests to find what they want. Simply add config file in configs folder with following structure:
CodeDisplay More{ "questsItemCounterMultipliers" : { "QM_46x30_AP" : 1, }, "questsKillsCounterMultipliers" : { "QM_46x30_AP" : 1, "QM_9x19_AP" : 1, "QM_9x19_PBP" : 2 }, "questsCultistsKillsCounterMultipliers" : { "QM_46x30_AP" : 1 "QM_GPNVG_18_NVGs" : 1 }, "questsLevelRequirements" : { "QM_46x30_AP" : 35 } }
Idea is very simple, you provide quest ID and number. Make sure your quest IDs are readable by user or else this will not help much and will not make it in any way easier for user to configure quests, which is endgoal.
- questsItemCounterMultipliers - multiplier for your HandoverItem subconditions. So user can make quest require to turn in only 50% of items for quest to complete if they set it to 0.5, for example
- questsKillsCounterMultipliers - multiplier for your kill counters.
- questsCultistsKillsCounterMultipliers - multiplier for your kill counters that have sectantWarrior in list of targets. This take precedence over questsKillsCounterMultipliers. Aka if condition has cultists in it, questsCultistsKillsCounterMultipliers will be applied, NOT questsKillsCounterMultipliers.
- questsLevelRequirements - if quest has level requirement, users can change it here.
You don't have to have this config file, it can be half-empty, it can have only half of your quest Ids, it can have only questsLevelRequirements if you wish. It's however important that IF you have config category that it's named either questsItemCounterMultipliers or questsKillsCounterMultipliers or questsLevelRequirements questsCultistsKillsCounterMultipliers
- I used these QOL to develop Erika and it made my life 10 times simpler. 10/10 recommend. If you need help, take a glance at her files.
- DO NOT include this into your mod, use this as dependency. You can structure your mod so it extracts into appropriate places.
- Please use naming convention I used in Erika files so its easier later (assuming people will be interested in using this loader)
- Ping me on discord in mod-dev channel if you have a question and need semi-fast reply
test
MusicManiac added a new file:
QuoteDisplay More
Gym for real gigachads
Features:
- More gym reps (get swole bro)
- Make all skillchecks (circles) same as first one
- Disable fracture on fail (not tested but should work)
- Normalized exp (now if your Str is lvl 30 you won't be getting shitty exp, it's same regardless of level)
- Extra exp multiplier
- Change duration of muscle pain
Everything is configurable in config.
If you wanna be true homie or say thanks for time I've spent modding the game, feel free to send me a coffee on kofi
MusicManiac added a new version:
QuoteFixed .45 ACP quest a bit
Installation: put folders into your user/mods folder.
MusicManiac added a new version:
QuoteDisplay MoreAdded kill cultist part in all quests
Added cultist boss to list of bosses
Added config option to set multiplier for cultists kills on per quest basis (if someone is terrified of cultists)
Or just use Normalized Bots to make them make footsteps
Installation: put folders into your user/mods folder.
MusicManiac added a new version:
QuoteAdded quest for NVGs,
New picture
I think I also fixed something somewhere? Not sure.
Installation: put folders into your user/mods folder.
MusicManiac added a new version:
QuoteAdded lasers
Installation: put folder into your user/mods folder.
MusicManiac added a new file:
QuoteDisplay MoreI'll look into updating my mods when website stops fking dying
Fixes _parent value of some guns and items.
for example, _parent of AG 545 is assault rifle instead of assault carbineThis fixes internal inconsistencies in BSG database.
check mod.ts if you wanna see full list of parent ids that got fixed
MusicManiac added a new file:
QuoteDisplay MoreI'll look into updating my mods when website stops fking dying
First of all, always use this mod: Lua's Auto Profile Backup (Updated) or don't complain later about something going terribly wrong.
Erika is fresh addition to other 654 trader mods on the workshop, what an amazing and unique mod!!!
Why she's cool:
- She's beautiful AI-generated girl (now I'm in love frfr no cap on god )
- Features a bunch of quests
- 30+ for unlocking good ammo (optionally including modded ammo from Extra Ammo For Everyone or D.U.D.S. or ShAK-12 Kit)
- 2 for unlocking gun parts/attachments
- 1 for unlocking good NVGs
- 2 for cases
- more coming probably later? big pogchamp?!!!
- The quests have enough conditions in them to fill quench of most quest-thirsty maniacs (between 17 to 28 or so conditions to fulfill on every quest)
- CONFIGURATION???
- Configure multipliers for amount of items you have to turn in on per-quest basis
- Kills too?
- And starting level too???
- SUPPORTS MODDED WEAPONS??!!
- If you have mod that adds, for example, new sniper rifle, chambered in some caliber, it WILL be counted for all quests, so you will be able to do quests with it. Make sure this mod loads after custom weapon one tho.
By default this is mid-late game trader that will make you work for access to good stuff. Good news is that in general stuff you can buy is cheaper, compared to vanilla traders by 20-50% (if they even sell it).
I built her in prep for my no-flea playthrough for 3.8.0 so I'll be adding more quests while waiting for it.
Installation:
1) put all folders **EXCEPT** [ADDON] folders into your user/mods folder.
2) if you use any of the addon mods, drag content of selected addon folder into user/mods/MusicManiac-MusicManiacsAdvancedQuestLoader folder (each of addon folders have "database" folder inside, the "database" supposed to go into user/mods/MusicManiac-MusicManiacsAdvancedQuestLoader)
3) Addons are meant to be ran with Modded Ammo Balancing Patch (MABP) that makes high-tier modded ammo not easily available so quests make sense, otherwise quests are usless.
This has dependency : Weapon Categories Fixer and MusicManiac's Custom Quest Loader (MMCQL) which are already included in release, you don't have to download them separately.
Config also simple af, it has a couple of true/false toggles. It also has 4 arrays: questsItemCounterMultipliers, questsKillsCounterMultipliers, questsCultistsKillsCounterMultipliers, questsLevelRequirements
Inside those array you can see quest id and value, for example: "QM_9x19_PBP" : 2, this is very clearly indicates that this is quest for 9x19mm PBP ammo. Setting multiplier applies to all items/kills in the quest. Default multipliers are setup based on ammo quality and whatever other reasons I had.
Config location: /user/mods/MusicManiac-MusicManiacCustomQuestLoader/configs/Erika_config.json
All quest conditions follow same template (can be found inside mod folder):
When you turn in ammo for the quest, it can sometimes grab ammo from mags in your inventory, and that in turn can slightly corrupt your profile. Just take ur ammo out of mags, and run Lua's Auto Profile Backup. I'm not responsible for any profile issues. I've only noticed this so far with modded ammo. Also, this profile corruption is not the end of the world, you can manually edit the items out of your profile. You'll lose few items but small price to pay.
If your profile gets corrupted via ammo stuff, you will get error msg as you load into game, something like "Magazine abc (id: "adsujh43krhhh231") expected cartrige at position 1" or some shit like that. Keep game open. Open your profile with notepad++ or any IDE (if you don't know what IDE stands for just download notepad++). Ctrl+f for id in error msg. Close game. Close server. Backup your profile somewhere. Go back to notepad++. Delete every code block (item) that has the id in error. By deleting id I mean delete whole block. What I mean is that your inventory items look something like this:
CodeDisplay More{ "_id": "4492a7d2ff55107ac17f62d4", "_tpl": "5c0d5e4486f77478390952fe", "parentId": "05a1b7dcd951970a52294cc0", "slotId": "main", "location": { "x": 7, "y": 2, "r": "Horizontal", "isSearched": true }, "upd": { "StackObjectsCount": 60, "SpawnedInSession": true } },
Your job is to delete this whole block, from { to }, (notice that I included , at the end, it's important to preserve file structure). There most likely will be multiple entries like that, and they can look slightly different. Save the profile changes. Try loading the game. There's very big chance you'll be able to load the game. Ofc you'll lose couple of mags/ammo stacks.
Q: Can you add xyz?
A: No, I make this trader for myself, I only add stuff that I want her to have.
Q: Wow those are big quests!
A: Yes.
Q: Omg I have to kill cultists? Fuck those guys, I hate them!
A: Use Normalized Bots to disable silent footsteps and you can fight them like normal people now. Or set cultists kills in config to 0.
Q: I don't get any quests, broken mod?
A: By default first quests start appearing at level 20.
Q: She's empty? No items? Broken mod?
A: All assortment is unlocked via quests. This trader will not be selling random junk just to fill inventory. Only finest merchandise. And it's all locked behind quests.
Q: You sure? I don't know if I installed it correctly.
A: If you haven't changed config file, first quest appears at level 20. If they don't, something is wrong.Big thanks to Andrudis for Andrudis-QuestManiac as it was foundation to make my trader work and allowed me to make a lot of cool things in code.
Also real gigachads living in #mods-development in discord. Cj is big bro, he even allows me to call him step-bro.
MusicManiac added a new version:
QuoteStuff was broken, yo
For existing users: All configs are unchanged, make sure to save them somewhere before overwriting folder or just extract everything EXCEPT config folder in existing mod folder.
For new users: Extract MusicManiac-PrestigeSystemHelper.zip into your mod folder (yes it's a tool, but it need to be in mod folder so it can find all the files needed, aka your save and SPT data)
MusicManiac added a new file:
QuoteDisplay MoreThis mod is inspired by BUMA (Bosses Use Meta Ammo) . Shredder didn't really see a point in adding config so I did. And also added things to make it mod-compatible. And better.
What the mod does: makes bosses and their followers use one of the best ammo that's available for the caliber. What bosses and followers? By default, all bosses/followers/raiders/cultist/rogues. Adjustable in config:CodeDisplay More"botsToReplaceAmmoFor" : [ "arenafighterevent", "bossbully", "bossgluhar", "bosskilla", "bossknight", "bosskojaniy", "bosskolontay", "bosssanitar", "bosstagilla", "bosszryachiy", "exusec", "followerbigpipe", "followerbirdeye", "followerbully", "followergluharassault", "followergluharsecurity", "followerkojaniy", "followerkolontayassault", "followerkolontaysecurity", "followersanitar", "followerzryachiy", "pmcbot", "sectantpriest", "sectantwarrior", "bossboar", "bossboarsniper", "followerboar" ],
What ammo they will be using now? Generally speaking best one. And it's also configurable in config. Here's the cool part: it supports modded calibers and ammo.
For vanilla ammo you can use https://db.sp-tarkov.com/search , for modded items you have to look inside mod that adds ammo.Innate support provided for Extra Ammo For Everyone andD.U.D.S.(They are not updated to 3.8.0 yet and simple package edit doesn't work and I cba updating them).CodeDisplay More"ammoToUse" : { "intentionallyIncorrectCaliberEntry" : { }, "Caliber9x19PARA": { "intentionallyIncorrectCartridgeEntry": 1, "5efb0da7a29a85116f6ea05f": 1, "5c925fa22e221601da359b7b": 1, "ExtraAmmo_9x19_7n31M": 1, "ExtraAmmo_9x19_7n30": 1, "ExtraAmmo_9x19_VBR": 1 }, "Caliber1143x23ACP": { "5efb0cabfb3e451d70735af5": 1 }, "Caliber762x35": { "5fd20ff893a8961fc660a954": 1, "ExtraAmmo_762x35_Blackfang": 1, "ExtraAmmo_762x35_MAI_AP": 1 }, "Caliber9x21": { "5a26ac0ec4a28200741e1e18": 1, "ExtraAmmo_9x21_7n42": 1, "ExtraAmmo_9x21_7BT3_01": 1 }, ... }
You can add new calibers for your modded calibers and ammo in here. If a bot uses caliber, it'll be replaced with ammo from config. Example: if bot uses 5.45x39, it'll be updated with my mod, if bot does not have ammo entry for 9x21, mod won't do anything about it. This means that mod is very cross-mod and cross-version compatible. you most likely can run this on like 3.5.x if not even older versions of SPT.
If you wanna be true homie or say thanks for time I've spent modding the game, feel free to send me a coffee on kofi
Cool part: I made config validation. If you add non-existent bot type, caliber or cartridge itself, it'll just skip it and inform you about it: