Been a known issue for a long time... check the date last updated...
There have been at least a couple of direct replacements/updates of this orig mod, and wesslen did a much more updated & bullet-proof SE version here: Extra Attack Fix SE https://www.nexusmods.com/baldursgate3/mods/5475
It absolutely worked what a god send, thank you rolfador!
Paraphrasing you so that other's can see with easier instructions!
Download the converter tool by searching lslibtool Norbyte
Download Notepad++
Download unpacked Extra Attack Compatibility and unzip it somewhere
In ExtraAttackCompatibility\Public\ExtraAttackCompatibility\Stats\Generated\Data There will be 2 text files EAC_Passive.txt and EAC_Status.txt
Change the following on each
"EAC_Passive.txt new entry "ExtraAttack" type "PassiveData" using "ExtraAttack" data "Conditions" "((context.HasContextFlag(StatsFunctorContext.OnCast) and (ExtraAttackSpellCheck() or IsModdedExtraAttack()) and HasUseCosts('ActionPoint', true) and not Tagged('EXTRA_ATTACK_BLOCKED',context.Source) and not HasStatus('SLAYER_PLAYER',context.Source) and not HasStatus('SLAYER_PLAYER_10',context.Source) and TurnBased(context.Source)) or (context.HasContextFlag(StatsFunctorContext.OnStatusRemoved) and StatusId('INITIAL_ATTACK_TECHNICAL') and TurnBased()) or (context.HasContextFlag(StatsFunctorContext.OnStatusApplied) and StatusId('EXTRA_ATTACK_Q'))) and not IsModdedNonExtraAttack()"
new entry "ExtraAttack_2" type "PassiveData" using "ExtraAttack_2" data "Conditions" "((context.HasContextFlag(StatsFunctorContext.OnCast) and (HasStringInSpellRoll('WeaponAttack') or HasStringInSpellRoll('UnarmedAttack') or SpellId('Target_CommandersStrike') or SpellId('Projectile_ArrowOfSmokepowder') or IsModdedExtraAttack()) and HasUseCosts('ActionPoint', true) and not Tagged('EXTRA_ATTACK_BLOCKED',context.Source) and not HasStatus('SLAYER_PLAYER',context.Source) and not HasStatus('SLAYER_PLAYER_10',context.Source) and TurnBased(context.Source)) or (context.HasContextFlag(StatsFunctorContext.OnStatusRemoved) and StatusId('INITIAL_ATTACK_TECHNICAL') and TurnBased()) or (context.HasContextFlag(StatsFunctorContext.OnStatusApplied) and StatusId('EXTRA_ATTACK_2_Q'))) and not IsModdedNonExtraAttack()"
new entry "ThirstingBlade_Blade" type "PassiveData" using "ThirstingBlade_Blade" data "Conditions" "((context.HasContextFlag(StatsFunctorContext.OnCast) and (HasStringInSpellRoll('WeaponAttack') or HasStringInSpellRoll('UnarmedAttack') or SpellId('Target_CommandersStrike') or SpellId('Projectile_ArrowOfSmokepowder') or IsModdedExtraAttack()) and ExtraAttackSpellCheck() and HasUseCosts('ActionPoint', true) and not Tagged('EXTRA_ATTACK_BLOCKED',context.Source) and not HasStatus('SLAYER_PLAYER',context.Source) and not HasStatus('SLAYER_PLAYER_10',context.Source) and TurnBased(context.Source) and HasPactWeapon(context.Source)) or (context.HasContextFlag(StatsFunctorContext.OnStatusRemoved) and StatusId('INITIAL_ATTACK_TECHNICAL') and TurnBased() and HasPactWeapon(context.Target)) or (context.HasContextFlag(StatsFunctorContext.OnStatusApplied) and StatusId('EXTRA_ATTACK_THIRSTING_BLADE_Q'))) and HasPassive('PactOfTheBlade',context.Source) and not HasPassive('ExtraAttack',context.Source) and not HasPassive('ExtraAttack_2',context.Source) and not IsModdedNonExtraAttack()"
EAC_Status.txt new entry "EXTRA_ATTACK" type "StatusData" data "StatusType" "BOOST" using "EXTRA_ATTACK" data "Boosts" "UnlockSpellVariant(ExtraAttackCheck() | IsModdedExtraAttack() & ~IsModdedNonExtraAttack(),ModifyUseCosts(Replace,ActionPoint,0,0,ActionPoint),ModifyIconGlow(),ModifyTooltipDescription())" data "RemoveConditions" "(ExtraAttackSpellCheck() or IsModdedExtraAttack()) and HasUseCosts('ActionPoint',false,context.Target) and not IsOffHandAttack()and not IsModdedNonExtraAttack()"
new entry "EXTRA_ATTACK_2" type "StatusData" data "StatusType" "BOOST" using "EXTRA_ATTACK_2" data "Boosts" "UnlockSpellVariant(ExtraAttackCheck() | IsModdedExtraAttack() & ~IsModdedNonExtraAttack(),ModifyUseCosts(Replace,ActionPoint,0,0,ActionPoint),ModifyIconGlow(),ModifyTooltipDescription())"
new entry "EXTRA_ATTACK_THIRSTING_BLADE" type "StatusData" data "StatusType" "BOOST" using "EXTRA_ATTACK_THIRSTING_BLADE" data "Boosts" "UnlockSpellVariant(ExtraAttackCheck() | IsModdedExtraAttack() & ~IsModdedNonExtraAttack(),ModifyUseCosts(Replace,ActionPoint,0,0,ActionPoint),ModifyIconGlow(),ModifyTooltipDescription())" data "RemoveConditions" "(HasStringInSpellRoll('WeaponAttack') or HasStringInSpellRoll('UnarmedAttack') or SpellId('Target_CommandersStrike') or IsModdedExtraAttack()) and HasUseCosts('ActionPoint') and not IsOffHandAttack() and not IsModdedNonExtraAttack()"
Then go to the converter tool
select game baldurs gate 3, go to the PAK / LSV tools tab
Change version to baldurs gate 3 V18
Select your unpacked Extra Attack Compatibility as source on the create package tab
Then select your destination for the file somewhere where you can find it easy in Package path and add \ExtraAttackCompatibility to the end of it
Create package
Change the resulting files name to ExtraAttackCompatibility.PAK
I gave it a try with these new instructions, but it doesn't appear to have worked on my game. Karlach was lacking her bonus attack still and the workaround of just toggling non-lethal did nothing either, so I wonder if somehow something was accidentally changed in the rewrite? I have not tried the original fix though, so I can't confirm anything about that. Upon reverting to the regular mod version though and reloading 'fixed' everything, not accounting the original bug being present, of course :P
So I just used the overrides and it worked for me, I didn't download the unpacked file I used the lslib tool to extract from the EAC pak file and made the changes under public file and then cast the new package. If your's doesn't work after that it's likely another mod causing the issue.
For some reason the "Conditions" part of the script isn't pasting correctly. Try copy and pasting the file contents from the bug report tab instead. The Conditions should be one long line rather than pasted onto multiple rows.
I have reuploaded this mod and included the fixes from rolfador @ Extra Attack Compatibility FIXED. It will be archived and link back to this original page whenever it's updated.
is this mod abandoned? also i actually got a way to play saves after uninstalling mods and i uninstalled this one and still the extra attack issue persisted, does anyone know if this mod is the DEFINITE issue or if there's another one causing extra attack to break
I can confirm that the extra attack bug (at least, the one described by others in the thread here) is caused by this mod, but it's not really possible for me to confirm whether or not another mod is somehow causing an identical issue - although it does seem like some mods that rely on this mod such as Smart War Magic do cause the same problem, so I'd guess you either forgot to disable another mod that relies on this mod, and/or this mod wasn't/can't be disabled properly, so still affects your save file. If you want to test it, you can download one of the mods here on Nexus that allow for fast level up, so that you can get Extra Attack quickly on a fresh save without having to do all the work normally required to get to Level 5.
As others have said, this breaks extra attack in patch 5. The non-lethal toggle usually works, but it does not work on a hasted character with extra attack. The non-lethal toggle seems to only work once a turn, so the hasted character only gets 3 attacks instead of 4. I'm not sure if this also applies to a level 11 fighter with Improved Extra Attack.
I can no longer use extra attack at all since patch 5. Sadly I can't unistall this mod to test it because of the patch 5 modding bug, but this should be the only mod that is modifying my extra attacks.
I couldn't seem to get my extra attack after using my bonus action or movement either tho. Didn't try the non-lethal toggle. Appreciate the confirmation that it is this mod though. Now at least I know what I need to fix
55 comments
There have been at least a couple of direct replacements/updates of this orig mod, and wesslen did a much more updated & bullet-proof SE version here:
Extra Attack Fix SE
https://www.nexusmods.com/baldursgate3/mods/5475
Extra Attack Fix SE also handles EAC's tags and can be used as a replacement.
It works and is less likely to break from patches, but requires Script Extender.
Paraphrasing you so that other's can see with easier instructions!
Download the converter tool by searching lslibtool Norbyte
Download Notepad++
Download unpacked Extra Attack Compatibility and unzip it somewhere
In ExtraAttackCompatibility\Public\ExtraAttackCompatibility\Stats\Generated\Data
There will be 2 text files EAC_Passive.txt and EAC_Status.txt
Change the following on each
"EAC_Passive.txt
new entry "ExtraAttack"
type "PassiveData"
using "ExtraAttack"
data "Conditions" "((context.HasContextFlag(StatsFunctorContext.OnCast) and
(ExtraAttackSpellCheck() or IsModdedExtraAttack()) and
HasUseCosts('ActionPoint', true) and not
Tagged('EXTRA_ATTACK_BLOCKED',context.Source) and not
HasStatus('SLAYER_PLAYER',context.Source) and not
HasStatus('SLAYER_PLAYER_10',context.Source) and
TurnBased(context.Source)) or
(context.HasContextFlag(StatsFunctorContext.OnStatusRemoved) and
StatusId('INITIAL_ATTACK_TECHNICAL') and TurnBased()) or
(context.HasContextFlag(StatsFunctorContext.OnStatusApplied) and
StatusId('EXTRA_ATTACK_Q'))) and not IsModdedNonExtraAttack()"
new entry "ExtraAttack_2"
type "PassiveData"
using "ExtraAttack_2"
data "Conditions" "((context.HasContextFlag(StatsFunctorContext.OnCast) and
(HasStringInSpellRoll('WeaponAttack') or
HasStringInSpellRoll('UnarmedAttack') or
SpellId('Target_CommandersStrike') or
SpellId('Projectile_ArrowOfSmokepowder') or IsModdedExtraAttack()) and
HasUseCosts('ActionPoint', true) and not
Tagged('EXTRA_ATTACK_BLOCKED',context.Source) and not
HasStatus('SLAYER_PLAYER',context.Source) and not
HasStatus('SLAYER_PLAYER_10',context.Source) and
TurnBased(context.Source)) or
(context.HasContextFlag(StatsFunctorContext.OnStatusRemoved) and
StatusId('INITIAL_ATTACK_TECHNICAL') and TurnBased()) or
(context.HasContextFlag(StatsFunctorContext.OnStatusApplied) and
StatusId('EXTRA_ATTACK_2_Q'))) and not IsModdedNonExtraAttack()"
new entry "ThirstingBlade_Blade"
type "PassiveData"
using "ThirstingBlade_Blade"
data "Conditions" "((context.HasContextFlag(StatsFunctorContext.OnCast) and
(HasStringInSpellRoll('WeaponAttack') or
HasStringInSpellRoll('UnarmedAttack') or
SpellId('Target_CommandersStrike') or
SpellId('Projectile_ArrowOfSmokepowder') or IsModdedExtraAttack()) and
ExtraAttackSpellCheck() and HasUseCosts('ActionPoint', true) and not
Tagged('EXTRA_ATTACK_BLOCKED',context.Source) and not
HasStatus('SLAYER_PLAYER',context.Source) and not
HasStatus('SLAYER_PLAYER_10',context.Source) and
TurnBased(context.Source) and HasPactWeapon(context.Source)) or
(context.HasContextFlag(StatsFunctorContext.OnStatusRemoved) and
StatusId('INITIAL_ATTACK_TECHNICAL') and TurnBased() and
HasPactWeapon(context.Target)) or
(context.HasContextFlag(StatsFunctorContext.OnStatusApplied) and
StatusId('EXTRA_ATTACK_THIRSTING_BLADE_Q'))) and
HasPassive('PactOfTheBlade',context.Source) and not
HasPassive('ExtraAttack',context.Source) and not
HasPassive('ExtraAttack_2',context.Source) and not
IsModdedNonExtraAttack()"
EAC_Status.txt
new entry "EXTRA_ATTACK"
type "StatusData"
data "StatusType" "BOOST"
using "EXTRA_ATTACK"
data "Boosts" "UnlockSpellVariant(ExtraAttackCheck() | IsModdedExtraAttack()
&
~IsModdedNonExtraAttack(),ModifyUseCosts(Replace,ActionPoint,0,0,ActionPoint),ModifyIconGlow(),ModifyTooltipDescription())"
data "RemoveConditions" "(ExtraAttackSpellCheck() or IsModdedExtraAttack())
and HasUseCosts('ActionPoint',false,context.Target) and not
IsOffHandAttack()and not IsModdedNonExtraAttack()"
new entry "EXTRA_ATTACK_2"
type "StatusData"
data "StatusType" "BOOST"
using "EXTRA_ATTACK_2"
data "Boosts" "UnlockSpellVariant(ExtraAttackCheck() | IsModdedExtraAttack()
&
~IsModdedNonExtraAttack(),ModifyUseCosts(Replace,ActionPoint,0,0,ActionPoint),ModifyIconGlow(),ModifyTooltipDescription())"
new entry "EXTRA_ATTACK_THIRSTING_BLADE"
type "StatusData"
data "StatusType" "BOOST"
using "EXTRA_ATTACK_THIRSTING_BLADE"
data "Boosts" "UnlockSpellVariant(ExtraAttackCheck() | IsModdedExtraAttack()
&
~IsModdedNonExtraAttack(),ModifyUseCosts(Replace,ActionPoint,0,0,ActionPoint),ModifyIconGlow(),ModifyTooltipDescription())"
data "RemoveConditions" "(HasStringInSpellRoll('WeaponAttack') or
HasStringInSpellRoll('UnarmedAttack') or
SpellId('Target_CommandersStrike') or IsModdedExtraAttack()) and
HasUseCosts('ActionPoint') and not IsOffHandAttack() and not
IsModdedNonExtraAttack()"
Then go to the converter tool
select game baldurs gate 3, go to the PAK / LSV tools tab
Change version to baldurs gate 3 V18
Select your unpacked Extra Attack Compatibility as source on the create package tab
Then select your destination for the file somewhere where you can find it easy in Package path and add \ExtraAttackCompatibility to the end of it
Create package
Change the resulting files name to ExtraAttackCompatibility.PAK
Replace your file, enjoy an unbugged game
Again thanks rolfador!
Would it be a problem for you if I edited my bug report refining a bit more your instructions and giving you the credits for clarifying it?
Otherwise I'd be really happy if you could just copy these and paste as a reply there. Will be pointing to your comment
It will be archived and link back to this original page whenever it's updated.
Edit: Try Extra Attack Fix SE by wesslen instead for future proofing!