Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static function EventListenerReturn SecondaryPistol_Listener(Object EventData, Object EventSource, XComGameState GameState, Name EventID, Object CallbackData)
- {
- local XComGameStateContext_Ability AbilityContext;
- local XComGameStateHistory History;
- local XComGameState_Unit SourceUnit, TargetUnit;
- local XComGameState_Ability PrimaryAbilityState, SecondaryAbilityState;
- local X2AbilityTemplate PrimaryAbilityTemplate;
- local XComGameState_Item PrimaryWeaponItemState;
- local XComGameStateContext FindContext;
- local int VisualizeIndex;
- local X2AbilityMultiTarget_BurstFire BurstFire;
- local int NumShots;
- local int i;
- `LOG("Listener activated",, 'IRIPISTOL');
- History = `XCOMHISTORY;
- AbilityContext = XComGameStateContext_Ability(GameState.GetContext());
- if (AbilityContext != none && AbilityContext.InterruptionStatus != eInterruptionStatus_Interrupt)
- {
- SourceUnit = XComGameState_Unit(GameState.GetGameStateForObjectID(AbilityContext.InputContext.SourceObject.ObjectID));
- TargetUnit = XComGameState_Unit(GameState.GetGameStateForObjectID(AbilityContext.InputContext.PrimaryTarget.ObjectID));
- PrimaryAbilityState = XComGameState_Ability(GameState.GetGameStateForObjectID(AbilityContext.InputContext.AbilityRef.ObjectID));
- SecondaryAbilityState = XComGameState_Ability(History.GetGameStateForObjectID(SourceUnit.FindAbility('PistolStandardShot_Secondary').ObjectID));
- `LOG("SourceUnit: " @ SourceUnit.GetFullName(),, 'IRIPISTOL');
- `LOG("TargetUnit: " @ TargetUnit.GetFullName(),, 'IRIPISTOL');
- `LOG("PrimaryAbilityState: " @ PrimaryAbilityState.GetMyTemplateName(),, 'IRIPISTOL');
- `LOG("SecondaryAbilityState: " @ SecondaryAbilityState.GetMyTemplateName(),, 'IRIPISTOL');
- // Handle compability with specific abilities
- // Shadowkeeper pistol -> Shadowfall
- if (PrimaryAbilityState.GetMyTemplateName() == 'Shadowfall') return ELR_NoInterrupt;
- // Grenadier -> Chain Shot
- // First shot of Chain Shot missed
- //if (PrimaryAbilityState.GetMyTemplateName() == 'ChainShot' && !AbilityContext.IsResultContextHit())
- // Reaper -> Banish + Annihilate
- //if (PrimaryAbilityState.GetMyTemplateName() == 'SoulReaper' && SourceUnit.HasSoldierAbility('SoulHarvester') || PrimaryAbilityState.GetMyTemplateName() == 'SoulReaperContinue')
- //{
- // PrimaryAbilityState.AbilityTriggerAgainstSingleTarget(BestTargetRef, false);
- //}
- if (SourceUnit != none && PrimaryAbilityState != none && SecondaryAbilityState != none )
- {
- PrimaryWeaponItemState = XComGameState_Item(History.GetGameStateForObjectID(AbilityContext.InputContext.ItemObject.ObjectID));
- PrimaryAbilityTemplate = PrimaryAbilityState.GetMyTemplate();
- `LOG("PrimaryWeaponItemState: " @ PrimaryWeaponItemState.GetMyTemplateName(),, 'IRIPISTOL');
- `LOG("Ability template is hostile: " @ PrimaryAbilityTemplate.Hostility == eHostility_Offensive,, 'IRIPISTOL');
- // check if the triggering ability comes from a pistol
- if (class'X2DownloadableContentInfo_DualWieldedPistols'.default.PistolCategories.Find(X2WeaponTemplate(PrimaryWeaponItemState.GetMyTemplate()).WeaponCat) != INDEX_NONE)
- {
- if (PrimaryAbilityTemplate.Hostility == eHostility_Offensive && // triggering ability is offensive
- !PrimaryAbilityTemplate.IsMelee() && // triggering ability is not a melee attack
- PrimaryWeaponItemState.InventorySlot == eInvSlot_PrimaryWeapon && // triggering ability comes from the primary weapon
- AbilityDealsDamage(PrimaryAbilityTemplate))
- {
- `LOG("Activating secondary shot",, 'IRIPISTOL');
- // Getting the Visualize Index for the triggering ability to pass it along for the Merge Viz function
- VisualizeIndex = GameState.HistoryIndex;
- FindContext = AbilityContext;
- while( FindContext.InterruptionHistoryIndex > -1 )
- {
- FindContext = History.GetGameStateFromHistory(FindContext.InterruptionHistoryIndex).GetContext();
- VisualizeIndex = FindContext.AssociatedState.HistoryIndex;
- }
- // check how many shots we need to trigger against Primary Target
- // for abilities like Fan Fire
- BurstFire = X2AbilityMultiTarget_BurstFire(PrimaryAbilityTemplate.AbilityMultiTargetStyle);
- if (BurstFire != none && TargetUnit != none && SourceUnit.IsEnemyUnit(TargetUnit))
- {
- NumShots = BurstFire.NumExtraShots;
- for (i = 0; i < NumShots && TargetUnit.IsAlive(); i++)
- {
- SecondaryAbilityState.AbilityTriggerAgainstSingleTarget(TargetUnit.GetReference(), false, VisualizeIndex);
- }
- }
- else
- {
- // for abilities like Faceoff and Saturation Fire
- if (PrimaryAbilityTemplate.AbilityMultiTargetStyle != none)
- {
- // activate secondary shot against every enemy targeted by faceoff
- for (i = 0; i < AbilityContext.InputContext.MultiTargets.Length; i++)
- {
- SecondaryAbilityState.AbilityTriggerAgainstSingleTarget(AbilityContext.InputContext.MultiTargets[i], false, VisualizeIndex);
- }
- }
- // Trigger secondary shot against the primary target
- if (TargetUnit != none && SourceUnit.IsEnemyUnit(TargetUnit) && TargetUnit.IsAlive())
- {
- SecondaryAbilityState.AbilityTriggerAgainstSingleTarget(TargetUnit.GetReference(), false, VisualizeIndex);
- }
- }
- }
- }
- }
- }
- return ELR_NoInterrupt;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement