Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

revenge weapon for shield breaking & overridden by warheads #1411

Open
wants to merge 2 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CREDITS.md
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,7 @@ This page lists all the individual contributions to the project by their author.
- **Ollerus**
- Build limit group enhancement
- Customizable rocker amplitude
- `RevengeWeapon` for shield breaking & overridden by warheads
- **handama** - AI script action to jump back to previous script
- **TaranDahl (航味麻酱)**
- Skirmish AI "sell all buildings and set all technos to hunt" behavior dehardcode
Expand Down
2 changes: 1 addition & 1 deletion YRpp
Submodule YRpp updated 1 files
+1 −1 CCFileClass.h
33 changes: 26 additions & 7 deletions docs/New-or-Enhanced-Logics.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ This page describes all the engine features that are either new and introduced b
- `Crit.AllowWarheads` can be used to list only Warheads that can benefit from this critical hit chance multiplier and `Crit.DisallowWarheads` weapons that are not allowed to, respectively.
- `RevengeWeapon` can be used to temporarily grant the specified weapon as a [revenge weapon](#revenge-weapon) for the attached object.
- `RevengeWeapon.AffectsHouses` customizes which houses can trigger the revenge weapon.
- `RevengeWeapon.CanFire.ShieldBreak` can be used to determine whether this revenge weapon should be fired upon a [shield](#shields) is broken if the ShieldType has `RevengeWeapon.AllFire` set to true.
- `ReflectDamage` can be set to true to have any positive damage dealt to the object the effect is attached to be reflected back to the attacker. `ReflectDamage.Warhead` determines which Warhead is used to deal the damage, defaults to `[CombatDamage]`->`C4Warhead`. If `ReflectDamage.Warhead` is set to true, the Warhead is fully detonated instead of used to simply deal damage. `ReflectDamage.Multiplier` is a multiplier to the damage received and then reflected back. Already reflected damage cannot be further reflected back.
- Warheads can prevent reflect damage from occuring by setting `SuppressReflectDamage` to true. `SuppressReflectDamage.Types` can control which AttachEffectTypes' reflect damage is suppressed, if none are listed then all of them are suppressed.
- `DisableWeapons` can be used to disable ability to fire any and all weapons.
Expand Down Expand Up @@ -121,6 +122,7 @@ Crit.AllowWarheads= ; list of WarheadTypes
Crit.DisallowWarheads= ; list of WarheadTypes
RevengeWeapon= ; WeaponType
RevengeWeapon.AffectsHouses=all ; list of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
RevengeWeapon.CanFire.ShieldBreak=true ; boolean
ReflectDamage=false ; boolean
ReflectDamage.Warhead= ; WarheadType
ReflectDamage.Warhead.Detonate=false ; WarheadType
Expand Down Expand Up @@ -319,6 +321,9 @@ ImmuneToCrit=no ; boolean
Tint.Color= ; integer - R,G,B
Tint.Intensity=0.0 ; floating point value
Tint.VisibleToHouses=all ; list of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
RevengeWeapon= ; WeaponType
RevengeWeapon.AffectsHouses=all ; list of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
RevengeWeapon.AllFire=false ; boolean

[SOMETECHNO] ; TechnoType
ShieldType=SOMESHIELDTYPE ; ShieldType; none by default
Expand All @@ -337,6 +342,9 @@ Shield.ReceivedDamage.Minimum= ; integer
Shield.ReceivedDamage.Maximum= ; integer
Shield.ReceivedDamage.MinMultiplier=1.0 ; floating point value
Shield.ReceivedDamage.MaxMultiplier=1.0 ; floating point value
Shield.RevengeWeapon= ; WeaponType
Shield.RevengeWeapon.AffectsHouses= ; list of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
Shield.RevengeWeapon.AllFire= ; boolean
Shield.Respawn.Duration=0 ; integer, game frames
Shield.Respawn.Amount=0.0 ; floating point value, percents or absolute
Shield.Respawn.Rate=-1.0 ; floating point value, ingame minutes
Expand Down Expand Up @@ -387,6 +395,10 @@ Shield.InheritStateOnReplace=false ; boolean
- `HitAnim`, if set, will be played when the shield is attacked, similar to `WeaponNullifyAnim` for Iron Curtain.
- `HitFlash`, if set to true, makes it so that a light flash is generated when the shield is attacked by a Warhead unless it has `Shield.HitFlash=false`. Size of the flash is determined by damage dealt, unless `HitFlash.FixedSize` is set to a number, in which case that value is used instead (range of values that produces visible effect are increments of 4 from 81 to 252, anything higher or below does not have effect). Color can be customized via `HitFlash.Red/Green/Blue`. If `HitFlash.Black` is set to true, the generated flash will be black regardless of other color settings.
- `BreakWeapon`, if set, will be fired at the TechnoType once the shield breaks.
- `RevengeWeapon`, if set, will be fired on whoever dealt the damage that broke the shield. If it's broken by sources other than direct damage dealt by another TechnoType, `RevengeWeapon` will not be fired.
- `RevengeWeapon.AffectsHouses` can be used to filter which houses the damage that broke the shield is allowed to come from to fire the weapon.
- If `RevengeWeapon.AllFire` set to true, all `RevengeWeapon` the TechnoType has will be fired if its `RevengeWeapon.CanFire.ShieldBreak` set to true, including those on its own or granted by [attached effects](#attached-effects).
- Ìf a Warhead has `SuppressRevengeWeapons` set to true, it will not trigger revenge weapons. `SuppressRevengeWeapons.Types` can be used to list WeaponTypes affected by this, if none are listed all WeaponTypes are affected.
- `AbsorbPercent` controls the percentage of damage that will be absorbed by the shield. Defaults to 1.0, meaning full damage absorption.
- `PassPercent` controls the percentage of damage that will *not* be absorbed by the shield, and will be dealt to the unit directly even if the shield is active. Defaults to 0.0 - no penetration.
- `ReceivedDamage.Minimum` & `ReceivedDamage.Maximum` control the minimum and maximum amount of damage that can be dealt to shield in a single hit. This is applied after armor type and `AbsorbPercent` adjustments. If `AbsorbOverDamage=false`, the residual damage dealt to the TechnoType is still based on the original damage before the clamping to the range.
Expand All @@ -409,6 +421,7 @@ Shield.InheritStateOnReplace=false ; boolean
- `Shield.HitAnim` will be displayed instead of ShieldType `HitAnim` if set when Warhead hits the shield.
- If `Shield.SkipHitAnim` is set to true, no hit anim is shown when the Warhead damages the shield whatsoever.
- `Shield.BreakWeapon` will be fired instead of ShieldType `BreakWeapon` if the shield is broken by the Warhead, either through damage or `Shield.Break`.
- `Shield.RevengeWeapon` will be fired instead of ShieldType `RevengeWeapon` if the shield is broken by the Warhead. `Shield.RevengeWeapon.AffectsHouses` and `Shield.RevengeWeapon.AllFire` override the `RevengeWeapon.AffectsHouses` and `RevengeWeapon.AllFire` respectively for this shield breaking as well, if set.
- `Shield.AbsorbPercent` overrides the `AbsorbPercent` value set in the ShieldType that is being damaged.
- `Shield.PassPercent` overrides the `PassPercent` value set in the ShieldType that is being damaged.
- `Shield.ReceivedDamage.Minimum` & `Shield.ReceivedDamage.Maximum` override the values set in in the ShieldType that is being damaged.
Expand Down Expand Up @@ -1273,18 +1286,24 @@ Promote.IncludeSpawns=false ; boolean

- Similar to `DeathWeapon` in that it is fired after a TechnoType is killed, but with the difference that it will be fired on whoever dealt the damage that killed the TechnoType. If TechnoType died of sources other than direct damage dealt by another TechnoType, `RevengeWeapon` will not be fired.
- `RevengeWeapon.AffectsHouses` can be used to filter which houses the damage that killed the TechnoType is allowed to come from to fire the weapon.
- `RevengeWeapon.CanFire.ShieldBreak` can be used to determine whether this revenge weapon should be fired upon a [shield](#shields) is broken if the ShieldType has `RevengeWeapon.AllFire` set to true.
- It is possible to grant revenge weapons through [attached effects](#attached-effects) as well.
- If a Warhead has `RevengeWeapon` set, it will be fired instead of TechnoType `RevengeWeapon` if it's killed by the Warhead. `RevengeWeapon.AffectsHouses` and `RevengeWeapon.CanFire.ShieldBreak` override TechnoType `RevengeWeapon.AffectsHouses` and `RevengeWeapon.CanFire.ShieldBreak` respectively for this kill as well, if set. Can't override revenge weapon settings granted by [attached effects](#attached-effects).
- Ìf a Warhead has `SuppressRevengeWeapons` set to true, it will not trigger revenge weapons. `SuppressRevengeWeapons.Types` can be used to list WeaponTypes affected by this, if none are listed all WeaponTypes are affected.

In `rulesmd.ini`:
```ini
[SOMETECHNO] ; TechnoType
RevengeWeapon= ; WeaponType
RevengeWeapon.AffectsHouses=all ; list of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)

[SOMEWARHEAD] ; WarheadType
SuppressRevengeWeapons=false ; boolean
SuppressRevengeWeapons.Types= ; List of WeaponTypes
[SOMETECHNO] ; TechnoType
RevengeWeapon= ; WeaponType
RevengeWeapon.AffectsHouses=all ; list of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
RevengeWeapon.CanFire.ShieldBreak=true ; boolean

[SOMEWARHEAD] ; WarheadType
RevengeWeapon= ; WeaponType
RevengeWeapon.AffectsHouses= ; list of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
RevengeWeapon.CanFire.ShieldBreak= ; boolean
SuppressRevengeWeapons=false ; boolean
SuppressRevengeWeapons.Types= ; List of WeaponTypes
```

### Weapons fired on warping in / out
Expand Down
1 change: 1 addition & 0 deletions docs/Whats-New.md
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,7 @@ New:
- `<Player @ X>` can now be used as owner for pre-placed objects on skirmish and multiplayer maps (by Starkku)
- Allow customizing charge turret delays per burst on a weapon (by Starkku)
- Unit `Speed` setting now accepts floating point values (by Starkku)
- `RevengeWeapon` for shield breaking & overridden by warheads (by Ollerus)

Vanilla fixes:
- Allow AI to repair structures built from base nodes/trigger action 125/SW delivery in single player missions (by Trsdy)
Expand Down
1 change: 1 addition & 0 deletions src/Ext/Techno/Body.h
Original file line number Diff line number Diff line change
Expand Up @@ -183,4 +183,5 @@ class TechnoExt
static WeaponTypeClass* GetCurrentWeapon(TechnoClass* pThis, int& weaponIndex, bool getSecondary = false);
static WeaponTypeClass* GetCurrentWeapon(TechnoClass* pThis, bool getSecondary = false);
static int GetWeaponIndexAgainstWall(TechnoClass* pThis, OverlayTypeClass* pWallOverlayType);
static void ApplyRevengeWeapon(TechnoClass* pSource, TechnoClass* pOwner, WarheadTypeClass* pWH, RevengeWeaponCondition condition);
};
30 changes: 1 addition & 29 deletions src/Ext/Techno/Hooks.ReceiveDamage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,35 +113,7 @@ DEFINE_HOOK(0x702672, TechnoClass_ReceiveDamage_RevengeWeapon, 0x5)
GET_STACK(WarheadTypeClass*, pWarhead, STACK_OFFSET(0xC4, 0xC));

if (pSource)
{
auto const pExt = TechnoExt::ExtMap.Find(pThis);
auto const pTypeExt = pExt->TypeExtData;
auto const pWHExt = WarheadTypeExt::ExtMap.Find(pWarhead);
bool hasFilters = pWHExt->SuppressRevengeWeapons_Types.size() > 0;

if (pTypeExt && pTypeExt->RevengeWeapon && EnumFunctions::CanTargetHouse(pTypeExt->RevengeWeapon_AffectsHouses, pThis->Owner, pSource->Owner))
{
if (!pWHExt->SuppressRevengeWeapons || (hasFilters && !pWHExt->SuppressRevengeWeapons_Types.Contains(pTypeExt->RevengeWeapon)))
WeaponTypeExt::DetonateAt(pTypeExt->RevengeWeapon, pSource, pThis);
}

for (auto& attachEffect : pExt->AttachedEffects)
{
if (!attachEffect->IsActive())
continue;

auto const pType = attachEffect->GetType();

if (!pType->RevengeWeapon)
continue;

if (pWHExt->SuppressRevengeWeapons && (!hasFilters || pWHExt->SuppressRevengeWeapons_Types.Contains(pType->RevengeWeapon)))
continue;

if (EnumFunctions::CanTargetHouse(pType->RevengeWeapon_AffectsHouses, pThis->Owner, pSource->Owner))
WeaponTypeExt::DetonateAt(pType->RevengeWeapon, pSource, pThis);
}
}
TechnoExt::ApplyRevengeWeapon(pSource, pThis, pWarhead, RevengeWeaponCondition::Death);

return 0;
}
Expand Down
39 changes: 39 additions & 0 deletions src/Ext/Techno/WeaponHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include <OverlayTypeClass.h>

#include <Ext/WarheadType/Body.h>
#include <Ext/WeaponType/Body.h>
#include <Utilities/EnumFunctions.h>

Expand Down Expand Up @@ -198,3 +199,41 @@ int TechnoExt::GetWeaponIndexAgainstWall(TechnoClass* pThis, OverlayTypeClass* p

return weaponIndex;
}

void TechnoExt::ApplyRevengeWeapon(TechnoClass* pSource, TechnoClass* pOwner, WarheadTypeClass* pWH, RevengeWeaponCondition condition)
{
auto const pExt = TechnoExt::ExtMap.Find(pOwner);
auto const pTypeExt = pExt->TypeExtData;
auto const pWHExt = WarheadTypeExt::ExtMap.Find(pWH);
auto const pRevengeWeapon = pWHExt->RevengeWeapon.Get(pTypeExt->RevengeWeapon);
auto const affectedHouses = pWHExt->RevengeWeapon_AffectsHouses.Get(pTypeExt->RevengeWeapon_AffectsHouses);
const bool shieldBreakFire = pWHExt->RevengeWeapon_CanFire_ShieldBreak.Get(pTypeExt->RevengeWeapon_CanFire_ShieldBreak);
const bool hasFilters = pWHExt->SuppressRevengeWeapons_Types.size() > 0;

if ((condition != RevengeWeaponCondition::ShieldBreak || shieldBreakFire)
&& pRevengeWeapon && EnumFunctions::CanTargetHouse(affectedHouses, pOwner->Owner, pSource->Owner))
{
if (!pWHExt->SuppressRevengeWeapons || (hasFilters && !pWHExt->SuppressRevengeWeapons_Types.Contains(pRevengeWeapon)))
WeaponTypeExt::DetonateAt(pRevengeWeapon, pSource, pOwner);
}

for (auto& attachEffect : pExt->AttachedEffects)
{
if (!attachEffect->IsActive())
continue;

auto const pType = attachEffect->GetType();

if (condition == RevengeWeaponCondition::ShieldBreak && !shieldBreakFire)
continue;

if (!pType->RevengeWeapon)
continue;

if (pWHExt->SuppressRevengeWeapons && (!hasFilters || pWHExt->SuppressRevengeWeapons_Types.Contains(pType->RevengeWeapon)))
continue;

if (EnumFunctions::CanTargetHouse(pType->RevengeWeapon_AffectsHouses, pOwner->Owner, pSource->Owner))
WeaponTypeExt::DetonateAt(pType->RevengeWeapon, pSource, pOwner);
}
}
2 changes: 2 additions & 0 deletions src/Ext/TechnoType/Body.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,7 @@ void TechnoTypeExt::ExtData::LoadFromINIFile(CCINIClass* const pINI)

this->RevengeWeapon.Read<true>(exINI, pSection, "RevengeWeapon");
this->RevengeWeapon_AffectsHouses.Read(exINI, pSection, "RevengeWeapon.AffectsHouses");
this->RevengeWeapon_CanFire_ShieldBreak.Read(exINI, pSection, "RevengeWeapon.CanFire.ShieldBreak");

this->BuildLimitGroup_Types.Read(exINI, pSection, "BuildLimitGroup.Types");
this->BuildLimitGroup_Nums.Read(exINI, pSection, "BuildLimitGroup.Nums");
Expand Down Expand Up @@ -811,6 +812,7 @@ void TechnoTypeExt::ExtData::Serialize(T& Stm)

.Process(this->RevengeWeapon)
.Process(this->RevengeWeapon_AffectsHouses)
.Process(this->RevengeWeapon_CanFire_ShieldBreak)

.Process(this->AttachEffects)

Expand Down
2 changes: 2 additions & 0 deletions src/Ext/TechnoType/Body.h
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ class TechnoTypeExt

Valueable<WeaponTypeClass*> RevengeWeapon;
Valueable<AffectedHouse> RevengeWeapon_AffectsHouses;
Valueable<bool> RevengeWeapon_CanFire_ShieldBreak;

AEAttachInfoTypeClass AttachEffects;

Expand Down Expand Up @@ -436,6 +437,7 @@ class TechnoTypeExt

, RevengeWeapon {}
, RevengeWeapon_AffectsHouses { AffectedHouse::All }
, RevengeWeapon_CanFire_ShieldBreak { true }

, AttachEffects {}

Expand Down
14 changes: 14 additions & 0 deletions src/Ext/WarheadType/Body.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,13 @@ void WarheadTypeExt::ExtData::LoadFromINIFile(CCINIClass* const pINI)
this->SuppressReflectDamage.Read(exINI, pSection, "SuppressReflectDamage");
this->SuppressReflectDamage_Types.Read(exINI, pSection, "SuppressReflectDamage.Types");

this->RevengeWeapon.Read<true>(exINI, pSection, "RevengeWeapon");
this->RevengeWeapon_AffectsHouses.Read(exINI, pSection, "RevengeWeapon.AffectsHouses");
this->RevengeWeapon_CanFire_ShieldBreak.Read(exINI, pSection, "RevengeWeapon.CanFire.ShieldBreak");
this->Shield_RevengeWeapon.Read<true>(exINI, pSection, "Shield.RevengeWeapon");
this->Shield_RevengeWeapon_AffectsHouses.Read(exINI, pSection, "Shield.RevengeWeapon.AffectsHouses");
this->Shield_RevengeWeapon_AllFire.Read(exINI, pSection, "Shield.RevengeWeapon.AllFire");

// Convert.From & Convert.To
TypeConvertGroup::Parse(this->Convert_Pairs, exINI, pSection, AffectedHouse::All);

Expand Down Expand Up @@ -499,6 +506,13 @@ void WarheadTypeExt::ExtData::Serialize(T& Stm)
.Process(this->PossibleCellSpreadDetonate)
.Process(this->Reflected)
.Process(this->DamageAreaTarget)

.Process(this->RevengeWeapon)
.Process(this->RevengeWeapon_AffectsHouses)
.Process(this->RevengeWeapon_CanFire_ShieldBreak)
.Process(this->Shield_RevengeWeapon)
.Process(this->Shield_RevengeWeapon_AffectsHouses)
.Process(this->Shield_RevengeWeapon_AllFire)
;
}

Expand Down
16 changes: 15 additions & 1 deletion src/Ext/WarheadType/Body.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,13 @@ class WarheadTypeExt
Valueable<double> Shield_ReceivedDamage_MinMultiplier;
Valueable<double> Shield_ReceivedDamage_MaxMultiplier;

Nullable<WeaponTypeClass*> RevengeWeapon;
Nullable<AffectedHouse> RevengeWeapon_AffectsHouses;
Nullable<bool> RevengeWeapon_CanFire_ShieldBreak;
Nullable<WeaponTypeClass*> Shield_RevengeWeapon;
Nullable<AffectedHouse> Shield_RevengeWeapon_AffectsHouses;
Nullable<bool> Shield_RevengeWeapon_AllFire;

Valueable<int> Shield_Respawn_Duration;
Nullable<double> Shield_Respawn_Amount;
Valueable<int> Shield_Respawn_Rate;
Expand Down Expand Up @@ -235,6 +242,13 @@ class WarheadTypeExt
, Shield_ReceivedDamage_MinMultiplier { 1.0 }
, Shield_ReceivedDamage_MaxMultiplier { 1.0 }

, RevengeWeapon {}
, RevengeWeapon_AffectsHouses {}
, RevengeWeapon_CanFire_ShieldBreak {}
, Shield_RevengeWeapon {}
, Shield_RevengeWeapon_AffectsHouses {}
, Shield_RevengeWeapon_AllFire {}

, Shield_Respawn_Duration { 0 }
, Shield_Respawn_Amount { 0.0 }
, Shield_Respawn_Rate { -1 }
Expand Down Expand Up @@ -347,7 +361,7 @@ class WarheadTypeExt
void ApplyRemoveDisguise(HouseClass* pHouse, TechnoClass* pTarget);
void ApplyRemoveMindControl(TechnoClass* pTarget);
void ApplyCrit(HouseClass* pHouse, TechnoClass* pTarget, TechnoClass* Owner, TechnoExt::ExtData* pTargetExt);
void ApplyShieldModifiers(TechnoClass* pTarget, TechnoExt::ExtData* pTargetExt);
void ApplyShieldModifiers(TechnoClass* pTarget, TechnoClass* pOwner, TechnoExt::ExtData* pTargetExt);
void ApplyAttachEffects(TechnoClass* pTarget, HouseClass* pInvokerHouse, TechnoClass* pInvoker);
double GetCritChance(TechnoClass* pFirer) const;
};
Expand Down
7 changes: 5 additions & 2 deletions src/Ext/WarheadType/Detonate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ void WarheadTypeExt::ExtData::DetonateOnOneUnit(HouseClass* pHouse, TechnoClass*
if (!this->CanTargetHouse(pHouse, pTarget) || !this->CanAffectTarget(pTarget, pTargetExt))
return;

this->ApplyShieldModifiers(pTarget, pTargetExt);
this->ApplyShieldModifiers(pTarget, pOwner, pTargetExt);

if (this->RemoveDisguise)
this->ApplyRemoveDisguise(pHouse, pTarget);
Expand All @@ -180,7 +180,7 @@ void WarheadTypeExt::ExtData::DetonateOnOneUnit(HouseClass* pHouse, TechnoClass*

}

void WarheadTypeExt::ExtData::ApplyShieldModifiers(TechnoClass* pTarget, TechnoExt::ExtData* pTargetExt = nullptr)
void WarheadTypeExt::ExtData::ApplyShieldModifiers(TechnoClass* pTarget, TechnoClass* pOwner, TechnoExt::ExtData* pTargetExt = nullptr)
{
if (!pTargetExt)
pTargetExt = TechnoExt::ExtMap.Find(pTarget);
Expand Down Expand Up @@ -250,7 +250,10 @@ void WarheadTypeExt::ExtData::ApplyShieldModifiers(TechnoClass* pTarget, TechnoE
};

if (this->Shield_Break && pTargetExt->Shield->IsActive() && isShieldTypeEligible(this->Shield_Break_Types.GetElements(this->Shield_AffectTypes)))
{
pTargetExt->Shield->BreakShield(this->Shield_BreakAnim, this->Shield_BreakWeapon);
pTargetExt->Shield->ShieldRevengeWeapon(pOwner, pTarget, this->OwnerObject());
}

if (this->Shield_Respawn_Duration > 0 && isShieldTypeEligible(this->Shield_Respawn_Types.GetElements(this->Shield_AffectTypes)))
{
Expand Down
Loading
Loading