
Removes some restrictions regarding wearing headwear: helmets, headsets, facemasks, faceshields, eyewear
Allows you (and bots) to wear headwear with less restrictions.
There are a lot of options, including removing blocks between following categories in any combination:
- Helmets
- Headsets
- Facecovers
- Eyewear
- Face Shields
Check config for details.
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
I effectively stopped playing SPT in favor of PvE since I can play with friends there (and no I don’t care about coop SPT mods).
I will be keeping this mod up-to-date as best as I can, however I do not follow SPT dev cycle anymore so might take some time for updates since I literally miss new SPT releases. My 3.9.X and 3.10.X updates were put up literally because someone tipped me on ko-fi and it send email to me so I was like “oh, new SPT version is up”
Do not repost updates of my mods without reaching me first on SPT discord.
25.2K Downloads
SPT 3.11.X
While I also have you here, please rate this up (if you like it):
https://tarkov.community/posts/2612/point-based-prestige-rewards
You don’t need an account, you log in through discord.
Download mod_name.rar and extract it into /user/mods
15.2K Downloads
SPT-3.10.X
Download MusicManiac-LessRestrictingHeadwear.rar and extract it into /user/mods
15.8K Downloads
SPT-3.9.X
Download MusicManiac-LessRestrictingHeadwear.rar and extract it into /user/mods
I wasn’t even planning to update these in some time but someone was nice to me on ko-fi so here ya go
6.8K Downloads
Fully rewrote the code, now it’s better. Config is much more clearer now too.
Added options to configure eyewear
If updating from previous versions, delete old version.
Download MusicManiac-LessRestrictingHeadwear.rar and extract it into /user/mods
897 Downloads
Fixed facemasks + shields
Download MusicManiac-LessRestrictingHeadwear.rar and extract it into /user/mods
1.3K Downloads
Added faceshields. Since they cant be easily identified in code it has to be on id basis. Check config.
Download MusicManiac-LessRestrictingHeadwear.rar and extract it into /user/mods
Details
-
GUID
Not Available
-
License
-
Source Code
does the mod not let you wear fast ears with a headset? just want to make sure thats supposed to happen since we can wear tank helmet with a headset
I ran into an error with the latest SPT version. VFS is not used anymore, so I changed the config parser in the mod.ts file (old lines commented out with //, can be deleted):
//const vfs = container.resolve<VFS>(“VFS”);
const fileSystem = container.resolve<FileSystemSync>(“FileSystemSync”);
//const config = jsonc.parse(vfs.readFile(path.resolve(__dirname, “../config.jsonc”)));
const config = jsonc.parse(fileSystem.read(path.resolve(__dirname, “../config.jsonc”)));
Thanks for the mod, MusicManiac! Cheers.
Is there a way to allow like the smoke to be worn in the eye wear spot. I wanna drip or drown.
Hi, nice mod.
Hi, great mod and really appreciate the work you’ve done for this, however this mod doesn’t seem to work with the Ops-Core FAST MT Super High Cut helmet equipped with Ops-Core FAST Side Armor (Ear Armor) are their plans to add this compatibility in the future? I made a dirty edit to your source. IDK if their is any fallout of this but here is the edited TS File to allow earpros to the helmets. I pulled the config values for the helmet rather than creating a new config entry, (cause I just wanted a poc and didn’t care about formality) I’ve tested this and it works. However like I said it is a dirty edit and changes waaay to many items because it looks at the baseclass of Equipment.
I’ve made an edit to the mod.ts & config to give a configurable section for EarArmor similar to all other items in the mod & added to the mod.ts to do a fuzzy match based on the name & parentID
To use my edits:
1. Replace the mod.ts in <SPT Install Directory>\user\mods\MusicManiac-LessRestrictingHeadwear\src
2. Replace config.jsonc in <SPT Install Directory>\user\mods\MusicManiac-LessRestrictingHeadwear
I’ve made Edits to the code to add new section to the config & fuzzy match based on name & parentID the existing Ops-Core & other ear protection armors. import { DependencyContainer } from “tsyringe”; import { Ilogger } from “@spt/models/spt/utils/Ilogger”; import { IPostDBLoadMod } from “@spt/models/external/IPostDBLoadMod”; import { DatabaseServer } from “@spt/servers/DatabaseServer”; import { ItemHelper } from “@spt/helpers/ItemHelper”; import { BaseClasses } from “@spt/models/enums/BaseClasses”; import { VFS } from “@spt/utils/VFS”; import { jsonc } from “jsonc”; import path from “path”; class LessRestrictingHeadwear implements IPostDBLoadMod { public mod: string; public modShortName: string; constructor() { this.mod = “MusicManiac - Less Restricting Headwear”; this.modShortName = “LessRestrictingHeadwear”; } public postDBLoad(container: DependencyContainer): void { const logger = container.resolve<Ilogger>(“WinstonLogger”); const db = container.resolve<DatabaseServer>(“DatabaseServer”); const tables = db.getTables(); const itemDB = tables.templates.items; const itemHelper = container.resolve<ItemHelper>(“ItemHelper”); const vfs = container.resolve<VFS>(“VFS”); const config = jsonc.parse(vfs.readFile(path.resolve(__dirname, “../config.jsonc”))); for (let item in itemDB) { if (itemDB[item]._type !== “Node”) { const itemId = itemDB[item]._id if (itemHelper.isOfBaseclass(itemId, BaseClasses.HEADWEAR)) { if (config.debug) { logger.info(
\[${this.modShortName}\] adjusting item ${itemDB\[item\].\_name} (id ${itemId} ) to match config values
); } itemDB[item]._props.BlocksHeadwear = config.Headwear.removeBlocksHeadwear ? false : itemDB[item]._props.BlocksHeadwear; itemDB[item]._props.BlocksEarpiece = config.Headwear.removeBlocksEarpiece ? false : itemDB[item]._props.BlocksEarpiece; itemDB[item]._props.BlocksFaceCover = config.Headwear.removeBlocksFaceCover ? false : itemDB[item]._props.BlocksFaceCover; itemDB[item]._props.BlocksEyewear = config.Headwear.removeBlocksEyewear ? false : itemDB[item]._props.BlocksEyewear; itemDB[item]._props.ConflictingItems = config.Headwear.clearConflictingItems ? [] : itemDB[item]._props.ConflictingItems; } else if (itemHelper.isOfBaseclass(itemId, BaseClasses.HEADPHONES)) { if (config.debug) { logger.info(\[${this.modShortName}\] adjusting item ${itemDB\[item\].\_name} (id ${itemId} ) to match config values
); } itemDB[item]._props.BlocksHeadwear = config.Earpiece.removeBlocksHeadwear ? false : itemDB[item]._props.BlocksHeadwear; itemDB[item]._props.BlocksEarpiece = config.Earpiece.removeBlocksEarpiece ? false : itemDB[item]._props.BlocksEarpiece; itemDB[item]._props.BlocksFaceCover = config.Earpiece.removeBlocksFaceCover ? false : itemDB[item]._props.BlocksFaceCover; itemDB[item]._props.BlocksEyewear = config.Earpiece.removeBlocksEyewear ? false : itemDB[item]._props.BlocksEyewear; itemDB[item]._props.ConflictingItems = config.Earpiece.clearConflictingItems ? [] : itemDB[item]._props.ConflictingItems; } else if (itemHelper.isOfBaseclass(itemId, BaseClasses.FACECOVER)) { if (config.debug) { logger.info(\[${this.modShortName}\] adjusting item ${itemDB\[item\].\_name} (id ${itemId} ) to match config values
); } itemDB[item]._props.BlocksHeadwear = config.FaceCover.removeBlocksHeadwear ? false : itemDB[item]._props.BlocksHeadwear; itemDB[item]._props.BlocksEarpiece = config.FaceCover.removeBlocksEarpiece ? false : itemDB[item]._props.BlocksEarpiece; itemDB[item]._props.BlocksFaceCover = config.FaceCover.removeBlocksFaceCover ? false : itemDB[item]._props.BlocksFaceCover; itemDB[item]._props.BlocksEyewear = config.FaceCover.removeBlocksEyewear ? false : itemDB[item]._props.BlocksEyewear; itemDB[item]._props.ConflictingItems = config.FaceCover.clearConflictingItems ? [] : itemDB[item]._props.ConflictingItems; } else if (itemHelper.isOfBaseclass(itemId, BaseClasses.VISORS)) { if (config.debug) { logger.info(\[${this.modShortName}\] adjusting item ${itemDB\[item\].\_name} (id ${itemId} ) to match config values
); } itemDB[item]._props.BlocksHeadwear = config.Eyewear.removeBlocksHeadwear ? false : itemDB[item]._props.BlocksHeadwear; itemDB[item]._props.BlocksEarpiece = config.Eyewear.removeBlocksEarpiece ? false : itemDB[item]._props.BlocksEarpiece; itemDB[item]._props.BlocksFaceCover = config.Eyewear.removeBlocksFaceCover ? false : itemDB[item]._props.BlocksFaceCover; itemDB[item]._props.BlocksEyewear = config.Eyewear.removeBlocksEyewear ? false : itemDB[item]._props.BlocksEyewear; itemDB[item]._props.ConflictingItems = config.Eyewear.clearConflictingItems ? [] : itemDB[item]._props.ConflictingItems; } else if (config.faceShields.includes(itemId)) { if (config.debug) { logger.info(\[${this.modShortName}\] adjusting item ${itemDB\[item\].\_name} (id ${itemId} ) to match config values
); } itemDB[item]._props.BlocksHeadwear = config.FaceShields.removeBlocksHeadwear ? false : itemDB[item]._props.BlocksHeadwear; itemDB[item]._props.BlocksEarpiece = config.FaceShields.removeBlocksEarpiece ? false : itemDB[item]._props.BlocksEarpiece; itemDB[item]._props.BlocksFaceCover = config.FaceShields.removeBlocksFaceCover ? false : itemDB[item]._props.BlocksFaceCover; itemDB[item]._props.BlocksEyewear = config.FaceShields.removeBlocksEyewear ? false : itemDB[item]._props.BlocksEyewear; itemDB[item]._props.ConflictingItems = config.FaceShields.clearConflictingItems ? [] : itemDB[item]._props.ConflictingItems; } //else if ((itemDB[item]._name.includes(‘side_armor’))||(itemDB[item]._name.includes(’_ears’))||(itemDB[item]._name.includes(‘ears_’))) else if (((itemDB[item]._name.includes(‘side_armor’)) || (itemDB[item]._name.includes(‘ear’))) && (itemDB[item]._parent == “57bef4c42459772e8d35a53b”)) { if (config.debug) { logger.info(\[${this.modShortName}\] adjusting item ${itemDB\[item\].\_name} (id ${itemId} ) to match config values:
); } itemDB[item]._props.BlocksHeadwear = config.EarArmor.removeBlocksHeadwear ? false : itemDB[item]._props.BlocksHeadwear; itemDB[item]._props.BlocksEarpiece = config.EarArmor.removeBlocksEarpiece ? false : itemDB[item]._props.BlocksEarpiece; itemDB[item]._props.BlocksFaceCover = config.EarArmor.removeBlocksFaceCover ? false : itemDB[item]._props.BlocksFaceCover; itemDB[item]._props.BlocksEyewear = config.EarArmor.removeBlocksEyewear ? false : itemDB[item]._props.BlocksEyewear; itemDB[item]._props.ConflictingItems = config.EarArmor.clearConflictingItems ? [] : itemDB[item]._props.ConflictingItems; } } } logger.info(\[${this.modShortName}\] ${this.mod} Loaded
); } } module.exports = { mod: new LessRestrictingHeadwear() } To use this just replace the code in <SPT Install folder>/user/mods/MusicManiac-LessRestrictingHeadwear/mod.ts Make sure you remove the mod.js file and mod.js.map prior to starting your server (I’m not sure if this will cause any issue if they exist as I’m sure it will just write over them, however it’s always best to remove artifacts) { “debug” : false, // some items instead of blocking category block specific items, clearConflictingItems can clear those conflicting items “Headwear” : { “removeBlocksHeadwear” : true, “removeBlocksEarpiece” : true, “removeBlocksFaceCover” : true, “removeBlocksEyewear” : true, “clearConflictingItems” : true }, “Earpiece” : { “removeBlocksHeadwear” : true, “removeBlocksEarpiece” : true, “removeBlocksFaceCover” : true, “removeBlocksEyewear” : true, “clearConflictingItems” : true }, “FaceCover” : { “removeBlocksHeadwear” : true, “removeBlocksEarpiece” : true, “removeBlocksFaceCover” : true, “removeBlocksEyewear” : true, “clearConflictingItems” : true }, “Eyewear” : { “removeBlocksHeadwear” : true, “removeBlocksEarpiece” : true, “removeBlocksFaceCover” : true, “removeBlocksEyewear” : false, “clearConflictingItems” : true }, “EarArmor” : { “removeBlocksHeadwear” : true, “removeBlocksEarpiece” : true, “removeBlocksFaceCover” : true, “removeBlocksEyewear” : true, “clearConflictingItems” : true }, “FaceShields” : { “removeBlocksHeadwear” : true, “removeBlocksEarpiece” : true, “removeBlocksFaceCover” : true, “removeBlocksEyewear” : true, “clearConflictingItems” : true }, // face shields can’t be found easily code-wise so here’s list of all faceshields (unless I missed some). Use https://db.sp-tarkov.com/search to find item IDs to add them here. // THIS LIST WAS LAST UPDATED IN SPT 3.8.X, I will not be updating this “faceShields”: [ “5c0e842486f77443a74d2976”, “5f60c85b58eff926626a60f7”, “5b46238386f7741a693bcf9c”, “5ca2113f86f7740b2547e1d2”, “5d6d3829a4b9361bc8618943”, “5aa7e3abe5b5b000171d064d”, “65719f9ef392ad76c50a2ec8”, “5a16b7e1fcdbcb00165aa6c9”, “658188edf026a90c1708c827”, “65818e4e566d2de69901b1b1”, “5e00cdd986f7747473332240”, “5ac4c50d5acfc40019262e87”, “5e01f37686f774773c6f6c15”, “5c0919b50db834001b7ce3b9”, “5aa7e373e5b5b000137b76f0”, “5a16ba61fcdbcb098008728a”, “5f60c076f2bcbb675b00dac2”, “6570a88c8f221f3b210353b7” ] }import { DependencyContainer } from “tsyringe”; import { Ilogger } from “@spt/models/spt/utils/Ilogger”; import { IPostDBLoadMod } from “@spt/models/external/IPostDBLoadMod”; import { DatabaseServer } from “@spt/servers/DatabaseServer”; import { ItemHelper } from “@spt/helpers/ItemHelper”; import { BaseClasses } from “@spt/models/enums/BaseClasses”; import { VFS } from “@spt/utils/VFS”; import { jsonc } from “jsonc”; import path from “path”; class LessRestrictingHeadwear implements IPostDBLoadMod { public mod: string; public modShortName: string; constructor() { this.mod = “MusicManiac - Less Restricting Headwear”; this.modShortName = “LessRestrictingHeadwear”; } public postDBLoad(container: DependencyContainer): void { const logger = container.resolve<Ilogger>(“WinstonLogger”); const db = container.resolve<DatabaseServer>(“DatabaseServer”); const tables = db.getTables(); const itemDB = tables.templates.items; const itemHelper = container.resolve<ItemHelper>(“ItemHelper”); const vfs = container.resolve<VFS>(“VFS”); const config = jsonc.parse(vfs.readFile(path.resolve(__dirname, “../config.jsonc”))); for (let item in itemDB) { if (itemDB[item]._type !== “Node”) { const itemId = itemDB[item]._id if (itemHelper.isOfBaseclass(itemId, BaseClasses.HEADWEAR)) { if (config.debug) { logger.info(
\[${this.modShortName}\] adjusting item ${itemDB\[item\].\_name} (id ${itemId} ) to match config values
); } itemDB[item]._props.BlocksHeadwear = config.Headwear.removeBlocksHeadwear ? false : itemDB[item]._props.BlocksHeadwear; itemDB[item]._props.BlocksEarpiece = config.Headwear.removeBlocksEarpiece ? false : itemDB[item]._props.BlocksEarpiece; itemDB[item]._props.BlocksFaceCover = config.Headwear.removeBlocksFaceCover ? false : itemDB[item]._props.BlocksFaceCover; itemDB[item]._props.BlocksEyewear = config.Headwear.removeBlocksEyewear ? false : itemDB[item]._props.BlocksEyewear; itemDB[item]._props.ConflictingItems = config.Headwear.clearConflictingItems ? [] : itemDB[item]._props.ConflictingItems; } else if (itemHelper.isOfBaseclass(itemId, BaseClasses.HEADPHONES)) { if (config.debug) { logger.info(\[${this.modShortName}\] adjusting item ${itemDB\[item\].\_name} (id ${itemId} ) to match config values
); } itemDB[item]._props.BlocksHeadwear = config.Earpiece.removeBlocksHeadwear ? false : itemDB[item]._props.BlocksHeadwear; itemDB[item]._props.BlocksEarpiece = config.Earpiece.removeBlocksEarpiece ? false : itemDB[item]._props.BlocksEarpiece; itemDB[item]._props.BlocksFaceCover = config.Earpiece.removeBlocksFaceCover ? false : itemDB[item]._props.BlocksFaceCover; itemDB[item]._props.BlocksEyewear = config.Earpiece.removeBlocksEyewear ? false : itemDB[item]._props.BlocksEyewear; itemDB[item]._props.ConflictingItems = config.Earpiece.clearConflictingItems ? [] : itemDB[item]._props.ConflictingItems; } else if (itemHelper.isOfBaseclass(itemId, BaseClasses.FACECOVER)) { if (config.debug) { logger.info(\[${this.modShortName}\] adjusting item ${itemDB\[item\].\_name} (id ${itemId} ) to match config values
); } itemDB[item]._props.BlocksHeadwear = config.FaceCover.removeBlocksHeadwear ? false : itemDB[item]._props.BlocksHeadwear; itemDB[item]._props.BlocksEarpiece = config.FaceCover.removeBlocksEarpiece ? false : itemDB[item]._props.BlocksEarpiece; itemDB[item]._props.BlocksFaceCover = config.FaceCover.removeBlocksFaceCover ? false : itemDB[item]._props.BlocksFaceCover; itemDB[item]._props.BlocksEyewear = config.FaceCover.removeBlocksEyewear ? false : itemDB[item]._props.BlocksEyewear; itemDB[item]._props.ConflictingItems = config.FaceCover.clearConflictingItems ? [] : itemDB[item]._props.ConflictingItems; } else if (itemHelper.isOfBaseclass(itemId, BaseClasses.VISORS)) { if (config.debug) { logger.info(\[${this.modShortName}\] adjusting item ${itemDB\[item\].\_name} (id ${itemId} ) to match config values
); } itemDB[item]._props.BlocksHeadwear = config.Eyewear.removeBlocksHeadwear ? false : itemDB[item]._props.BlocksHeadwear; itemDB[item]._props.BlocksEarpiece = config.Eyewear.removeBlocksEarpiece ? false : itemDB[item]._props.BlocksEarpiece; itemDB[item]._props.BlocksFaceCover = config.Eyewear.removeBlocksFaceCover ? false : itemDB[item]._props.BlocksFaceCover; itemDB[item]._props.BlocksEyewear = config.Eyewear.removeBlocksEyewear ? false : itemDB[item]._props.BlocksEyewear; itemDB[item]._props.ConflictingItems = config.Eyewear.clearConflictingItems ? [] : itemDB[item]._props.ConflictingItems; } else if (config.faceShields.includes(itemId)) { if (config.debug) { logger.info(\[${this.modShortName}\] adjusting item ${itemDB\[item\].\_name} (id ${itemId} ) to match config values
); } itemDB[item]._props.BlocksHeadwear = config.FaceShields.removeBlocksHeadwear ? false : itemDB[item]._props.BlocksHeadwear; itemDB[item]._props.BlocksEarpiece = config.FaceShields.removeBlocksEarpiece ? false : itemDB[item]._props.BlocksEarpiece; itemDB[item]._props.BlocksFaceCover = config.FaceShields.removeBlocksFaceCover ? false : itemDB[item]._props.BlocksFaceCover; itemDB[item]._props.BlocksEyewear = config.FaceShields.removeBlocksEyewear ? false : itemDB[item]._props.BlocksEyewear; itemDB[item]._props.ConflictingItems = config.FaceShields.clearConflictingItems ? [] : itemDB[item]._props.ConflictingItems; } else if (itemHelper.isOfBaseclass(itemId, BaseClasses.EQUIPMENT)) { itemDB[item]._props.BlocksHeadwear = config.Headwear.removeBlocksHeadwear ? false : itemDB[item]._props.BlocksHeadwear; itemDB[item]._props.BlocksEarpiece = config.Headwear.removeBlocksEarpiece ? false : itemDB[item]._props.BlocksEarpiece; itemDB[item]._props.BlocksFaceCover = config.Headwear.removeBlocksFaceCover ? false : itemDB[item]._props.BlocksFaceCover; itemDB[item]._props.BlocksEyewear = config.Headwear.removeBlocksEyewear ? false : itemDB[item]._props.BlocksEyewear; itemDB[item]._props.ConflictingItems = config.Headwear.clearConflictingItems ? [] : itemDB[item]._props.ConflictingItems; } } } logger.info(\[${this.modShortName}\] ${this.mod} Loaded
); } } module.exports = { mod: new LessRestrictingHeadwear() }What would i need to change so i can wear the Altyn with faceshield and a headset? ive trieds setting everything to false except “Clear Conflicting Items” and still wouldnt work
Can confirm mod doesn’t work at all can’t put on headsets with helmets and eararmor
doesnt seem to be working, not really sure why, cant put fast MT with ear armor on with headsets
legend as always
Totally OK if you don’t want to keep up with the mod dude but thank you very much for updating it for 3.10