Advertisement
Guest User

Untitled

a guest
Aug 6th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. static function EventListenerReturn SecondaryPistol_Listener(Object EventData, Object EventSource, XComGameState GameState, Name EventID, Object CallbackData)
  2. {
  3.     local XComGameStateContext_Ability  AbilityContext;
  4.     local XComGameStateHistory          History;
  5.     local XComGameState_Unit            SourceUnit, TargetUnit;
  6.     local XComGameState_Ability         PrimaryAbilityState, SecondaryAbilityState;
  7.     local X2AbilityTemplate             PrimaryAbilityTemplate;
  8.     local XComGameState_Item            PrimaryWeaponItemState;
  9.     local XComGameStateContext          FindContext;
  10.     local int                           VisualizeIndex;
  11.     local X2AbilityMultiTarget_BurstFire BurstFire;
  12.     local int                           NumShots;
  13.     local int                           i; 
  14.  
  15.     `LOG("Listener activated",, 'IRIPISTOL');
  16.     History = `XCOMHISTORY;
  17.     AbilityContext = XComGameStateContext_Ability(GameState.GetContext());
  18.  
  19.     if (AbilityContext != none && AbilityContext.InterruptionStatus != eInterruptionStatus_Interrupt)
  20.     {
  21.         SourceUnit = XComGameState_Unit(GameState.GetGameStateForObjectID(AbilityContext.InputContext.SourceObject.ObjectID));
  22.         TargetUnit = XComGameState_Unit(GameState.GetGameStateForObjectID(AbilityContext.InputContext.PrimaryTarget.ObjectID));
  23.         PrimaryAbilityState = XComGameState_Ability(GameState.GetGameStateForObjectID(AbilityContext.InputContext.AbilityRef.ObjectID));
  24.         SecondaryAbilityState = XComGameState_Ability(History.GetGameStateForObjectID(SourceUnit.FindAbility('PistolStandardShot_Secondary').ObjectID));
  25.          
  26.         `LOG("SourceUnit: " @ SourceUnit.GetFullName(),, 'IRIPISTOL');
  27.         `LOG("TargetUnit: " @ TargetUnit.GetFullName(),, 'IRIPISTOL');
  28.         `LOG("PrimaryAbilityState: " @ PrimaryAbilityState.GetMyTemplateName(),, 'IRIPISTOL');
  29.         `LOG("SecondaryAbilityState: " @ SecondaryAbilityState.GetMyTemplateName(),, 'IRIPISTOL');
  30.  
  31.         //  Handle compability with specific abilities
  32.         //  Shadowkeeper pistol -> Shadowfall
  33.         if (PrimaryAbilityState.GetMyTemplateName() == 'Shadowfall') return ELR_NoInterrupt;
  34.  
  35.         //  Grenadier -> Chain Shot
  36.         //  First shot of Chain Shot missed
  37.         //if (PrimaryAbilityState.GetMyTemplateName() == 'ChainShot' && !AbilityContext.IsResultContextHit())
  38.        
  39.         // Reaper -> Banish + Annihilate
  40.         //if (PrimaryAbilityState.GetMyTemplateName() == 'SoulReaper' && SourceUnit.HasSoldierAbility('SoulHarvester') || PrimaryAbilityState.GetMyTemplateName() == 'SoulReaperContinue')
  41.         //{
  42.         //  PrimaryAbilityState.AbilityTriggerAgainstSingleTarget(BestTargetRef, false);
  43.         //}
  44.  
  45.         if (SourceUnit != none && PrimaryAbilityState != none && SecondaryAbilityState != none )
  46.         {  
  47.             PrimaryWeaponItemState = XComGameState_Item(History.GetGameStateForObjectID(AbilityContext.InputContext.ItemObject.ObjectID));
  48.             PrimaryAbilityTemplate = PrimaryAbilityState.GetMyTemplate();
  49.  
  50.             `LOG("PrimaryWeaponItemState: " @ PrimaryWeaponItemState.GetMyTemplateName(),, 'IRIPISTOL');
  51.             `LOG("Ability template is hostile: " @ PrimaryAbilityTemplate.Hostility == eHostility_Offensive,, 'IRIPISTOL');
  52.  
  53.             //  check if the triggering ability comes from a pistol
  54.             if (class'X2DownloadableContentInfo_DualWieldedPistols'.default.PistolCategories.Find(X2WeaponTemplate(PrimaryWeaponItemState.GetMyTemplate()).WeaponCat) != INDEX_NONE)
  55.             {
  56.                 if (PrimaryAbilityTemplate.Hostility == eHostility_Offensive && //  triggering ability is offensive
  57.                 !PrimaryAbilityTemplate.IsMelee() &&    //  triggering ability is not a melee attack
  58.                 PrimaryWeaponItemState.InventorySlot == eInvSlot_PrimaryWeapon && // triggering ability comes from the primary weapon
  59.                 AbilityDealsDamage(PrimaryAbilityTemplate))
  60.                 {
  61.                     `LOG("Activating secondary shot",, 'IRIPISTOL');
  62.  
  63.                     //  Getting the Visualize Index for the triggering ability to pass it along for the Merge Viz function
  64.                     VisualizeIndex = GameState.HistoryIndex;
  65.                     FindContext = AbilityContext;
  66.                     while( FindContext.InterruptionHistoryIndex > -1 )
  67.                     {
  68.                         FindContext = History.GetGameStateFromHistory(FindContext.InterruptionHistoryIndex).GetContext();
  69.                         VisualizeIndex = FindContext.AssociatedState.HistoryIndex;
  70.                     }
  71.  
  72.                     //  check how many shots we need to trigger against Primary Target
  73.                     //  for abilities like Fan Fire
  74.                     BurstFire = X2AbilityMultiTarget_BurstFire(PrimaryAbilityTemplate.AbilityMultiTargetStyle);
  75.                     if (BurstFire != none && TargetUnit != none && SourceUnit.IsEnemyUnit(TargetUnit))
  76.                     {
  77.                         NumShots = BurstFire.NumExtraShots;
  78.                        
  79.                         for (i = 0; i < NumShots && TargetUnit.IsAlive(); i++)
  80.                         {
  81.                             SecondaryAbilityState.AbilityTriggerAgainstSingleTarget(TargetUnit.GetReference(), false, VisualizeIndex);
  82.                         }
  83.                     }
  84.                     else
  85.                     {
  86.                         //  for abilities like Faceoff and Saturation Fire
  87.                         if (PrimaryAbilityTemplate.AbilityMultiTargetStyle != none)
  88.                         {
  89.                             //  activate secondary shot against every enemy targeted by faceoff
  90.                             for (i = 0; i < AbilityContext.InputContext.MultiTargets.Length; i++)
  91.                             {
  92.                                 SecondaryAbilityState.AbilityTriggerAgainstSingleTarget(AbilityContext.InputContext.MultiTargets[i], false, VisualizeIndex);
  93.                             }
  94.                         }
  95.  
  96.                         //  Trigger secondary shot against the primary target
  97.                         if (TargetUnit != none && SourceUnit.IsEnemyUnit(TargetUnit) && TargetUnit.IsAlive())
  98.                         {
  99.                             SecondaryAbilityState.AbilityTriggerAgainstSingleTarget(TargetUnit.GetReference(), false, VisualizeIndex);
  100.                         }
  101.                     }
  102.                 }
  103.             }
  104.         }
  105.     }
  106.     return ELR_NoInterrupt;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement