PAYDAY 2

PAYDAY 2

View Stats:
PAYDAY 2 > Bug Reporting > Topic Details
Hoxi Jan 30 @ 2:43pm
[WIP] Fixes for tons of issues in tweak_data, units and similar paths
This will get long so I'll separate the issues and their fixes in the comments. Why not make separate threads? Because I don't want this to be ignored/forgotten while also being completely separated in multiple threads (I'll bump and leave a link in existent reports when applicable).

For any moderators, if doing it this way is too much of a problem, let me know.

Shortcuts

Headless Bulldozers use the wrong melee animation

Medics can be suppressed, for a duration of 0.1 to 0.15 seconds, causing buggy behavior

Movement speed multipliers aren't applied and many enemies are missing from the intended list

Bulldozers always run and never walk

Enemies have a 90% chance of surrendering after taking any damage

Scripted spawns rarely scale correctly / Missing spawns

Bots crouch all the time / Bots take too long to move around due to two unnecessary animations

Hiding the masks from the Completely OVERKILL Pack, which cannot be purchased anymore

Incorrect tactics and some typos that prevent some of them from working

Slow-motion issues and exploits

Captain Winters won't retreat if conditions for retreat are met before he gets in position

Hostage pathing issues

Shotgun pellets don't prioritize a Dozer's visor or Turret's weak point over other parts

If a player enters the fatal state while firing an automatic weapon, they'll keep firing their weapon for other players until they actually fire again

Enemies cannot dodge forward or backward, only to the sides

High Value Target ace issues

Fully Loaded ace's calculation to obtain throwables is incorrect

Close By ace's hip-fire rate of fire bonus doesn't apply to shotguns that benefit from the magazine size increase from the same skill

Presets, weapons and scaling - weapontweakdata

Small and/or quick-to-fix issues in weapontweakdata

Presets, weapons and scaling - charactertweakdata

Phalanx units can use melee attacks (not intended)

Infiltrator's OVERDOG melee damage bonus lasts longer than intended

Ambidexterity grants only +25% ammo when not combined with Akimbo ace

Optical Illusions ace further increases concealment for suppressors with positive concealment

Specialist Knives and Nova's Shank are unequipped upon restarting the game - Nova's Shank can also stay locked until playing a heist or restarting the game

Duck and Cover ace doesn't grant dodge when using a zip-line, contrary to what's mentioned in the description

KSP 58's magazine and the JP36's Speed Pull Magazine are unable to (visually) deplete

Corpses and smoke don't despawn due to ammo bags are not emptied correctly

Crime Spree heavy SWAT modifier replaces the wrong enemies with the wrong variants

Crime Spree no hurt animations modifier completely negates Counterstrike, Dire Need and Heavy Impact, along with melee knockdown

Enemies that are supposed to be immune to tase attacks are still affected by them

Dire Need and Heavy Impact cause clipping issues on Shields due to the heavy_hurt animation

Winters' Shields ignore the Shield spawn cap and negate skills that would work against normal Shields

NPCs can't reload their weapons while moving

Bulldozers can use recoil animations when not moving

Cloakers never stop beating their victims when doing a sprint-kick

If Bulldozers are intended to not be stunned by ECM Feedback and Counterstrike (like the loading tip still explains), that's not the case when playing

Two relatively small but noticeable issues with team AI secondaries

Team AI will stop reviving clients/player husks when they shouldn't + one inconsistency with the intervals

Team AI issues when it comes to marking enemies

Team AI won't remove the "stay put" command even if there are no players alive

Team AI will drop light bags when they receive the objective to revive a player

Hurt animations looping, overlapping or being applied when they shouldn't

NPCs wielding shotguns can't launch bodies from the perspective of the host

NPC weapon accuracy is unused in single shot in NPC vs NPC scenarios

Team AI sniper rifles all have the same rate of fire of 1 (60 in-game)

Team AI Piercing ability can't go through body armor + adding penetration capabilities for _npc weapons and Sentries
Last edited by Hoxi; Aug 5 @ 2:39pm
< >
Showing 1-15 of 87 comments
Hoxi Jan 30 @ 2:55pm 
Headless Bulldozers use the punching animation with their TITAN staff

In lib/tweak_data/charactertweakdata, inside function CharacterTweakData:_init_tank(presets):
self.tank.melee_weapon = "fists" self.tank.melee_weapon_dmg_multiplier = 2.5 self.tank.melee_anims = {"cbt_std_melee"}

Remove self.tank.melee_anims = {"cbt_std_melee"}.
Last edited by Hoxi; Feb 2 @ 7:38am
Hoxi Jan 30 @ 2:58pm 
Medics can be suppressed, for a duration of 0.1 to 0.15 seconds, causing buggy behavior

In lib/tweak_data/charactertweakdata, inside function CharacterTweakData:_init_medic(presets):
self.medic.suppression = presets.suppression.no_supress

Change presets.suppression.no_supress to nil.

That preset only works fine if the unit can't be suppressed when taking damage.

GenSec red-shirt guards can't be suppressed

Inside function CharacterTweakData:_init_gensec(presets):
self.gensec.suppression = presets.suppression.hard

Change presets.suppression.hard to presets.suppression.hard_def. The first one doesn't exist.
Last edited by Hoxi; May 22 @ 5:47am
Hoxi Jan 30 @ 3:10pm 
Movement speed multipliers aren't applied and many enemies are missing from the intended list

In lib/tweak_data/charactertweakdata, replace the following function:

function CharacterTweakData:_multiply_all_speeds(walk_mul, run_mul) local all_units = { "security", "cop", "fbi", "swat", "heavy_swat", "sniper", "gangster", "tank", "spooc", "shield", "taser", "city_swat", "fbi_swat" } table.insert(all_units, "bolivian") table.insert(all_units, "bolivian_indoors") for _, name in ipairs(all_units) do local speed_table = self[name].SPEED_WALK speed_table.hos = speed_table.hos * walk_mul speed_table.cbt = speed_table.cbt * walk_mul end self.security.SPEED_RUN = self.security.SPEED_RUN * run_mul self.cop.SPEED_RUN = self.cop.SPEED_RUN * run_mul self.fbi.SPEED_RUN = self.fbi.SPEED_RUN * run_mul self.swat.SPEED_RUN = self.swat.SPEED_RUN * run_mul self.heavy_swat.SPEED_RUN = self.heavy_swat.SPEED_RUN * run_mul self.fbi_heavy_swat.SPEED_RUN = self.fbi_heavy_swat.SPEED_RUN * run_mul self.sniper.SPEED_RUN = self.sniper.SPEED_RUN * run_mul self.gangster.SPEED_RUN = self.gangster.SPEED_RUN * run_mul self.biker.SPEED_RUN = self.biker.SPEED_RUN * run_mul self.tank.SPEED_RUN = self.tank.SPEED_RUN * run_mul self.spooc.SPEED_RUN = self.spooc.SPEED_RUN * run_mul self.shield.SPEED_RUN = self.shield.SPEED_RUN * run_mul self.taser.SPEED_RUN = self.taser.SPEED_RUN * run_mul self.city_swat.SPEED_RUN = self.city_swat.SPEED_RUN * run_mul self.biker_escape.SPEED_RUN = self.biker_escape.SPEED_RUN * run_mul self.fbi_swat.SPEED_RUN = self.fbi_swat.SPEED_RUN * run_mul end

With this one:

function CharacterTweakData:_multiply_all_speeds(walk_mul, run_mul) local all_units = { "security", "security_undominatable", "mute_security_undominatable", "cop", "cop_scared", "cop_female", "gensec", "fbi", "swat", "heavy_swat", "heavy_swat_sniper", "fbi_swat", "fbi_heavy_swat", "city_swat", "gangster", "biker", "biker_escape", "mobster", "bolivian", "bolivian_indoors", "sniper", "tank", "tank_hw", "tank_medic", "tank_mini", "spooc", "medic", "taser", "shield", "phalanx_minion", "phalanx_vip", "mobster_boss", "biker_boss", "chavez_boss", "hector_boss", "hector_boss_no_armor", "drug_lord_boss", "drug_lord_boss_stealth" } for _, name in ipairs(all_units) do local speed_preset = deep_clone(self[name].move_speed) self[name].move_speed = speed_preset speed_preset.stand.walk.hos.fwd = speed_preset.stand.walk.hos.fwd * walk_mul speed_preset.stand.walk.hos.strafe = speed_preset.stand.walk.hos.strafe * walk_mul speed_preset.stand.walk.hos.bwd = speed_preset.stand.walk.hos.bwd * walk_mul speed_preset.stand.walk.cbt.fwd = speed_preset.stand.walk.cbt.fwd * walk_mul speed_preset.stand.walk.cbt.strafe = speed_preset.stand.walk.cbt.strafe * walk_mul speed_preset.stand.walk.cbt.bwd = speed_preset.stand.walk.cbt.bwd * walk_mul speed_preset.stand.run.hos.fwd = speed_preset.stand.run.hos.fwd * run_mul speed_preset.stand.run.hos.strafe = speed_preset.stand.run.hos.strafe * run_mul speed_preset.stand.run.hos.bwd = speed_preset.stand.run.hos.bwd * run_mul speed_preset.stand.run.cbt.fwd = speed_preset.stand.run.cbt.fwd * run_mul speed_preset.stand.run.cbt.strafe = speed_preset.stand.run.cbt.strafe * run_mul speed_preset.stand.run.cbt.bwd = speed_preset.stand.run.cbt.bwd * run_mul speed_preset.crouch.walk.hos.fwd = speed_preset.crouch.walk.hos.fwd * walk_mul speed_preset.crouch.walk.hos.strafe = speed_preset.crouch.walk.hos.strafe * walk_mul speed_preset.crouch.walk.hos.bwd = speed_preset.crouch.walk.hos.bwd * walk_mul speed_preset.crouch.walk.cbt.fwd = speed_preset.crouch.walk.cbt.fwd * walk_mul speed_preset.crouch.walk.cbt.strafe = speed_preset.crouch.walk.cbt.strafe * walk_mul speed_preset.crouch.walk.cbt.bwd = speed_preset.crouch.walk.cbt.bwd * walk_mul speed_preset.crouch.run.hos.fwd = speed_preset.crouch.run.hos.fwd * run_mul speed_preset.crouch.run.hos.strafe = speed_preset.crouch.run.hos.strafe * run_mul speed_preset.crouch.run.hos.bwd = speed_preset.crouch.run.hos.bwd * run_mul speed_preset.crouch.run.cbt.fwd = speed_preset.crouch.run.cbt.fwd * run_mul speed_preset.crouch.run.cbt.strafe = speed_preset.crouch.run.cbt.strafe * run_mul speed_preset.crouch.run.cbt.bwd = speed_preset.crouch.run.cbt.bwd * run_mul end end

UPDATE: made the multipliers actually apply in the first place, no placebos this time. This does mean that you need to change them for each difficulty, since, as an example, the current numbers for Death Sentence will cause enemies to move close to the speed of sound.

Additionally, if an unit is not intended to receive a speed increase, just remove it from all_units.

EDIT: not fully ready yet, the values are applied in a way I can't verify with precision (like, they apply to the correct stances, but sometimes more than once). Will edit again once fixed.

EDIT 2: okay, here we go. It was actually way more simply than all the ♥♥♥♥♥♥♥t I tried yesterday. I'm positive the values don't get applied more than once or to the wrong table, I tested it multiple times.
Last edited by Hoxi; Jul 12 @ 8:10pm
Zdann Jan 30 @ 4:40pm 
Originally posted by Hoxi:
Melee attacks for normal and headless Bulldozers use the knife stab animation
Dozers have their own melee animation defined, so they shouldn't be:
<anim name="tank_melee" file="anims/shared/boss/tank/cbt_std_melee" blend_set="upper_body_aim"/>

I haven't noticed any difference removing the line you mentioned.

As for the Headless Dozer, there's no need to add
self.tank_hw.melee_weapon = "helloween"
because they already have it defined in their unit:
<var name="_melee_weapon_table" value="helloween" />
Last edited by Zdann; Jan 30 @ 4:47pm
Hoxi Jan 30 @ 5:39pm 
Bulldozers always run and never walk

From this thread, credits to Sandman Eh Docholiday332.

In lib/units/enemies/tank/logics/tankcoplogicattack, inside function TankCopLogicAttack.update(data), replace:

TankCopLogicAttack._chk_request_action_walk_to_chase_pos(data, my_data, "run")

With this:

TankCopLogicAttack._chk_request_action_walk_to_chase_pos(data, my_data, walk and "walk" or "run")

Additionally, in the same function, change the values from:

local run_dist = focus_enemy.verified and 1500 or 800

Because even with this issue fixed, Dozers still tend to run despite being close because their target is just out of walking range.
Last edited by Hoxi; Feb 2 @ 7:39am
Hoxi Jan 30 @ 5:46pm 
Originally posted by Zdann:
Dozers have their own melee animation defined, so they shouldn't be:
<anim name="tank_melee" file="anims/shared/boss/tank/cbt_std_melee" blend_set="upper_body_aim"/>

I haven't noticed any difference removing the line you mentioned.

They do stab you actually. And removing the line did it for me, they went from stabbing me with air or the TITAN staff to punching me or swinging the staff at me. The animations are fast so it might be that? I'm not questioning you, but I'm sure this works fine on my end.

Originally posted by Zdann:
As for the Headless Dozer, there's no need to add
self.tank_hw.melee_weapon = "helloween"
because they already have it defined in their unit:
<var name="_melee_weapon_table" value="helloween" />

tank_hw is cloned from tank so, wouldn't it be necessary to prevent them from using fists instead? I did both at once so I didn't actually check that specific case.
Last edited by Hoxi; Jan 30 @ 5:49pm
Zdann Jan 30 @ 5:54pm 
Originally posted by Hoxi:
They do stab you actually. And removing the line did it for me, they went from stabbing me with air or the TITAN staff to punching me or swinging the staff at me. The animations are fast so it might be that? I'm not questioning you, but I'm sure this works fine on my end.
When they updated all of the third person animations, melee attacks became significantly faster. They still swing/punch, but the animations go by so quickly that you can't tell. (It doesn't help that they look really similar also.)
When I tested with and without the line present, the animation seemed to be the same when I looked at it in 0.1 game speed.

Originally posted by Hoxi:
tank_hw is cloned from tank so, wouldn't it be necessary to prevent them from using fists instead? I did both at once so I didn't actually check that specific case.
The melee weapon defined in the unit overrides that, I haven't seen them punching.
Hoxi Jan 30 @ 7:06pm 
Originally posted by Zdann:
When they updated all of the third person animations, melee attacks became significantly faster. They still swing/punch, but the animations go by so quickly that you can't tell. (It doesn't help that they look really similar also.)
When I tested with and without the line present, the animation seemed to be the same when I looked at it in 0.1 game speed.

Okay, so this is how it is, as I just tested with vanilla. They did fix it for non-headless Dozers, they do punch you instead of stabbing you, so you were right about that, my bad.

However, the headless Dozers use the same punching animation with the staff because they're cloned, so I'm changing the comment accordingly.

What surprises me is that I didn't notice them changing it (when checking the commits), but I always played with NJTA, which removed the line and made both types of Dozers use the correct animations.

I guess they changed it through the .unit files? I'm 100% positive they used the stab animation, I made a thread about it at some point.

Originally posted by Zdann:
The melee weapon defined in the unit overrides that, I haven't seen them punching.

Oh yeah, duh, I didn't think about that when I answered, since that's how it is in vanilla. I added it just to be consistent when making the change (one has fists, so the other should have helloween), but I guess it's not necessary. They DO however punch you with the staff instead of swinging it at you from behind their heads.
Last edited by Hoxi; Jan 30 @ 7:18pm
Zdann Jan 30 @ 7:18pm 
Originally posted by Hoxi:
Oh yeah, duh, I didn't think about that when I answered, since that's how it is in vanilla. I added it just to be consistent when making the change (one has fists, so the other should have helloween), but I guess it's not necessary. They DO however punch you with the staff instead of swinging it at you from behind their heads.
Whoops, noticed I had that line deleted when I was testing out the Headless Dozer. He does indeed punch you with it.

Seems that the line is just redundant since it does nothing for the normal Dozer and it breaks the Headless one.
Hoxi Jan 30 @ 7:24pm 
Originally posted by Zdann:
Whoops, noticed I had that line deleted when I was testing out the Headless Dozer. He does indeed punch you with it.

I didn't exactly check with vanilla to compare either, just re-added the line, so it's fine.

Originally posted by Zdann:
Seems that the line is just redundant since it does nothing for the normal Dozer and it breaks the Headless one.

Yeah, that seems to be the case, I edited the comment, removing the line is the way to go. Though as I mentioned in the previous comment after editing it, they used to stab you when that line was used, which is what caused this confusion.
Last edited by Hoxi; Jan 30 @ 7:24pm
Hoxi Jan 30 @ 7:42pm 
Enemies have a 90% chance of surrendering after taking any damage

From this thread, credits to Hassat Hunter.

In lib/tweak_data/charactertweakdata, inside function CharacterTweakData:_presets(tweak_data):

presets.surrender.easy = { base_chance = 0.3, significant_chance = 0.35, reasons = { health = { [1] = 0.1, [0.999] = 0.9 }, weapon_down = 0.5, pants_down = 1, isolated = 0.08 }, factors = { flanked = 0.05, unaware_of_aggressor = 0.1, enemy_weap_cold = 0.11, aggressor_dis = { [1000] = 0, [300] = 0.2 } } }

Under reasons - health, change [0.999] = 0.9 to [0.999] = 0.4.
Last edited by Hoxi; Feb 24 @ 3:58pm
Hoxi Jan 30 @ 11:14pm 
Scripted spawns rarely scale correctly

Credits to Vicious Walrus for creating this method way back and making this possible in the first place.

I know it's not necessarily a tweakdata fix, but I did say I would include other fixes in the op. Besides, this does affect the game to a great extent (like the issues in the other files) as scripted enemies rarely scale correctly.

In lib/managers/mission/elementspawnenemydummy, add these[pastebin.com] lines.

And change this function in the same file:

function ElementSpawnEnemyDummy:init(...) ElementSpawnEnemyDummy.super.init(self, ...) self._enemy_name = self._values.enemy and Idstring(self._values.enemy) or Idstring("units/payday2/characters/ene_swat_1/ene_swat_1") self._values.enemy = nil self._units = {} self._events = {} self:_finalize_values() end

To this:

function ElementSpawnEnemyDummy:init(...) ElementSpawnEnemyDummy.super.init(self, ...) local ai_type = tweak_data.levels:get_ai_group_type() local difficulty = Global.game_settings and Global.game_settings.difficulty or "normal" local difficulty_index = tweak_data:difficulty_to_index(difficulty) local level = Global.level_data and Global.level_data.level_id if ai_type == "america" then if difficulty_index == 2 or difficulty_index == 3 then if A[self._values.enemy] then self._values.enemy = A[self._values.enemy] end self._values.enemy = A[self._values.enemy] or self._values.enemy elseif difficulty_index == 4 or difficulty_index == 5 then if B[self._values.enemy] then self._values.enemy = B[self._values.enemy] end self._values.enemy = B[self._values.enemy] or self._values.enemy elseif difficulty_index == 6 or difficulty_index == 7 then if C[self._values.enemy] then self._values.enemy = C[self._values.enemy] end self._values.enemy = C[self._values.enemy] or self._values.enemy elseif difficulty_index == 8 then if D[self._values.enemy] then self._values.enemy = D[self._values.enemy] end self._values.enemy = D[self._values.enemy] or self._values.enemy end self._enemy_name = self._values.enemy and Idstring(self._values.enemy) or Idstring("units/payday2/characters/ene_swat_1/ene_swat_1") self._values.enemy = nil self._units = {} self._events = {} self:_finalize_values() elseif ai_type == "russia" then if difficulty_index == 2 or difficulty_index == 3 then if A_R[self._values.enemy] then self._values.enemy = A_R[self._values.enemy] end self._values.enemy = A_R[self._values.enemy] or self._values.enemy elseif difficulty_index == 4 or difficulty_index == 5 then if B_R[self._values.enemy] then self._values.enemy = B_R[self._values.enemy] end self._values.enemy = B_R[self._values.enemy] or self._values.enemy elseif difficulty_index == 6 or difficulty_index == 7 or difficulty_index == 8 then if C_R[self._values.enemy] then self._values.enemy = C_R[self._values.enemy] end self._values.enemy = C_R[self._values.enemy] or self._values.enemy end self._enemy_name = self._values.enemy and Idstring(self._values.enemy) or Idstring("units/pd2_dlc_mad/characters/ene_akan_cs_swat_ak47♥♥♥♥♥ene_akan_cs_swat_ak47♥♥♥♥♥) self._values.enemy = nil self._units = {} self._events = {} self:_finalize_values() elseif ai_type == "zombie" then if difficulty_index == 2 or difficulty_index == 3 then if A_Z[self._values.enemy] then self._values.enemy = A_Z[self._values.enemy] end self._values.enemy = A_Z[self._values.enemy] or self._values.enemy elseif difficulty_index == 4 or difficulty_index == 5 then if B_Z[self._values.enemy] then self._values.enemy = B_Z[self._values.enemy] end self._values.enemy = B_Z[self._values.enemy] or self._values.enemy elseif difficulty_index == 6 or difficulty_index == 7 then if C_Z[self._values.enemy] then self._values.enemy = C_Z[self._values.enemy] end self._values.enemy = C_Z[self._values.enemy] or self._values.enemy elseif difficulty_index == 8 then if D_Z[self._values.enemy] then self._values.enemy = D_Z[self._values.enemy] end self._values.enemy = D_Z[self._values.enemy] or self._values.enemy end self._enemy_name = self._values.enemy and Idstring(self._values.enemy) or Idstring("units/pd2_dlc_hvh/characters/ene_swat_hvh_1/ene_swat_hvh_1") self._values.enemy = nil self._units = {} self._events = {} self:_finalize_values() end end

While it doesn't exactly fix missing spawns (like sometimes it happens on Mayhem and One Down), it does correctly scale all special and common units from scripted spawns according to the difficulty, even with Russian and Zombie units. Enemies that do not belong to assault waves such as gangsters, FBI agents, and the like, remain intact.

Using this would make your job 10x times easier as you'd only have to fix missing spawns, not try to manually scale ALL of them, I don't expect that to ever happen but only because it would take an obnoxious amount of time compared to this.

Missing spawns

Credits to Hassat Hunter.
  • Missing check in santa event (easy enemies!) on Santa Workshop (cane\cane_santa_event_mis - check_difficulty)
  • Missing trucks on day 2 Biker Heist (chew\chew_pursuit_car_mis - spawn_suv_harassers)
  • Missing dozer in Server Room (Hoxton Breakout day 1 - known, hox_breakout_serverroom001_mis 2 entries)
  • Missing stationary assailants on Goat Simulator (unsure the day) (pet_stationary_enemy_mis - 3 entries)
  • Missing stationairy assailants (unsure which Locke heist) (pbr\pbr_stationary_enemy_mis - 3 entries)
  • Missing generic harasser (instances\shared\harasser_mis - 3 entries)
  • Missing generic harasser (instances\shared\simple_harasser_spawn_mis - spawn)

I don't think I need to point out how to fix these.
Last edited by Hoxi; Feb 24 @ 3:58pm
Dom Jan 31 @ 3:22am 
Concussion Grenade have effect on dominated cops
local old_stun = CopDamage.stun_hit function CopDamage:stun_hit(attack_data) if self._unit:in_slot(16, 21, 22) then return end return old_stun(self, attack_data) end

Fixes dominated cops locked in hands-up position after getting flashed by concussion grenade.
Credits to Schmuddel
Hoxi Jan 31 @ 7:43am 
Originally posted by ShockWave:
-snip-

Thanks, added a shortcut for it!

Bots crouch all the time, which can prevent them from shooting from certain spots (actually a lot) due to cover

In lib/tweak_data/charactertweakdata, add the following line in every function CharacterTweakData:_init_character ID(presets).

self.character ID.allowed_poses = {stand = true, crouch = false}

Bots take too long to move around due to running start and stop animations, which even bug out and makes them slide back for a second very commonly

Like the one above, add the following lines in every function CharacterTweakData:_init_character ID(presets).

self.character ID.no_run_start = true self.character ID.no_run_stop = true
Last edited by Hoxi; Feb 2 @ 7:49am
Dom Jan 31 @ 8:37am 
Hide Masks from Completely OVERKILL Pack, which is no longer available to buy on Steam
function LootDropTweakData:init(tweak_data) ... self.global_values.complete_overkill_pack = { name_id = "bm_global_value_complete_overkill_pack", desc_id = "menu_l_global_value_complete_overkill_pack", unlock_id = "bm_global_value_complete_overkill_pack_unlock", color = dlc_color, dlc = true, chance = 1, value_multiplier = tweak_data:get_value("money_manager", "global_value_multipliers", "complete_overkill_pack"), durability_multiplier = 1, drops = true, track = true, sort_number = 99, category = "dlc", ignore_ulti = true, hide_unavailable = true -- Add this line }
"hide_unavailable = true" hides those masks for players, which doesn't own Completely OVERKILL Pack on Steam
< >
Showing 1-15 of 87 comments
Per page: 15 30 50

PAYDAY 2 > Bug Reporting > Topic Details