Mod Details

Less Restricting Headwear

Less Restricting Headwear 2.3.0

Created by MusicManiac

70.6K Downloads

SPT 3.11.4 Compatible

Removes some restrictions regarding wearing headwear: helmets, headsets, facemasks, faceshields, eyewear

Latest Version 2.3.0
SPT 3.11.4

Updated Apr 14, 6:53 PM

Version Notes

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

This download is externally hosted.
Always scan for viruses.

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

61e11d5cf697cee7ca5b65d9_Button-p-500.png

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.

Version 2.3.0
Download Mod Version
SPT 3.11.4
Latest Compatible SPT Version

25.2K Downloads

Created Apr 14, 6:53 PM

Updated Apr 14, 6:53 PM

Virus Total Results

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

Version 2.2.0
Download Mod Version
SPT 3.10.5
Latest Compatible SPT Version

15.2K Downloads

Created Dec 6, 2024 at 10:43 PM

Updated Dec 6, 2024 at 10:43 PM

Virus Total Results

SPT-3.10.X

Download MusicManiac-LessRestrictingHeadwear.rar and extract it into /user/mods

Version 2.1.0
Download Mod Version
SPT 3.9.8
Latest Compatible SPT Version

15.8K Downloads

Created Jul 12, 2024 at 3:59 PM

Updated Jul 12, 2024 at 3:59 PM

Virus Total Results

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

Version 2.0.0
Download Mod Version
Unknown SPT Version
Latest Compatible SPT Version

6.8K Downloads

Created May 9, 2024 at 7:30 PM

Updated May 9, 2024 at 7:30 PM

Virus Total Results

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

Version 1.5.1
Download Mod Version
Unknown SPT Version
Latest Compatible SPT Version

897 Downloads

Created Apr 30, 2024 at 11:40 AM

Updated Apr 30, 2024 at 11:40 AM

Virus Total Results

Fixed facemasks + shields

Download MusicManiac-LessRestrictingHeadwear.rar and extract it into /user/mods

Version 1.5.0
Download Mod Version
Unknown SPT Version
Latest Compatible SPT Version

1.3K Downloads

Created Apr 13, 2024 at 1:10 AM

Updated Apr 13, 2024 at 1:10 AM

Virus Total Results

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

usolame

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

0 Likes
Tinhead_Ausf_B

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.

0 Likes
ThePhantomArc

Is there a way to allow like the smoke to be worn in the eye wear spot. I wanna drip or drown.

0 Likes
MOTAN

Hi, nice mod.

0 Likes
434f4445j0k3r

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() }

5 Likes
AMethyst_VT

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

0 Likes
Wowfe

Can confirm mod doesn’t work at all can’t put on headsets with helmets and eararmor

0 Likes
SPTisBettrThanLive

doesnt seem to be working, not really sure why, cant put fast MT with ear armor on with headsets

0 Likes
crabbycallahan72

legend as always

0 Likes
Drill#0596

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

1 Like

Details