Advertisement
kregano

Cone_of_Fire_v2_bugged

Sep 1st, 2017
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.45 KB | None | 0 0
  1. //---------------------------------------------------------------------------------------
  2. // FILE: X2Ability_ConeOfFire.uc
  3. // AUTHOR: Kregano
  4. // DATE:
  5. // PURPOSE: Defines Cone of Fire ability.
  6. //
  7. //---------------------------------------------------------------------------------------
  8. //
  9. //---------------------------------------------------------------------------------------
  10.  
  11. class X2Ability_ConeOfFireStuff extends X2Ability_GrenadierAbilitySet;
  12.  
  13. static function array<X2DataTemplate> CreateTemplates()
  14. {
  15. local array<X2DataTemplate> Templates;
  16.  
  17. Templates.AddItem(ConeOfFire());
  18. Templates.AddItem(COF_ReactionShot());
  19. return Templates;
  20. }
  21.  
  22. static function X2AbilityTemplate ConeOfFire()
  23. {
  24. local X2AbilityTemplate Template;
  25. local X2AbilityCost_ActionPoints ActionPointCost;
  26. local X2AbilityCost_Ammo AmmoCost;
  27. local X2AbilityCooldown Cooldown;
  28. local X2Effect_ReserveActionPoints ReserveActionPointsEffect;
  29. local X2AbilityMultiTarget_Cone ConeMultiTarget;
  30. local X2Condition_UnitProperty UnitPropertyCondition;
  31. local X2Effect_Suppression SuppressionEffect;
  32.  
  33. `CREATE_X2ABILITY_TEMPLATE(Template, 'ConeOfFire');
  34.  
  35. Template.IconImage = "img:///UILibrary_ConeOfFire.UIPerk_coneoffire";
  36.  
  37. ActionPointCost = new class'X2AbilityCost_ActionPoints';
  38. ActionPointCost.bConsumeAllPoints = true; // this will guarantee the unit has at least 1 action point
  39. ActionPointCost.bFreeCost = true; // ReserveActionPoints effect will take all action points away
  40. Template.AbilityCosts.AddItem(ActionPointCost);
  41.  
  42. AmmoCost = new class'X2AbilityCost_Ammo';
  43. AmmoCost.iAmmo = 2;
  44. Template.AbilityCosts.AddItem(AmmoCost);
  45.  
  46. Cooldown = new class'X2AbilityCooldown';
  47. Cooldown.iNumTurns = 1;
  48. Template.AbilityCooldown = Cooldown;
  49.  
  50. Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty);
  51.  
  52. Template.AddShooterEffectExclusions();
  53.  
  54. ReserveActionPointsEffect = new class'X2Effect_ReserveActionPoints';
  55. ReserveActionPointsEffect.ReserveType = 'Suppression';
  56. Template.AddShooterEffect(ReserveActionPointsEffect);
  57.  
  58. Template.AbilityToHitCalc = default.DeadEye;
  59. Template.AbilityTargetConditions.AddItem(default.LivingHostileUnitDisallowMindControlProperty);
  60. Template.AbilityTargetConditions.AddItem(default.GameplayVisibilityCondition);
  61. Template.AbilityTriggers.AddItem(default.PlayerInputTrigger);
  62. Template.AbilityTargetStyle = new class'X2AbilityTarget_Cursor';
  63. ConeMultiTarget.bIgnoreBlockingCover = true;
  64. ConeMultiTarget = new class'X2AbilityMultiTarget_Cone';
  65. ConeMultiTarget.bUseWeaponRadius = true;
  66. ConeMultiTarget.ConeEndDiameter = 12 * class'XComWorldData'.const.WORLD_StepSize;
  67. ConeMultiTarget.bUseWeaponRangeForLength = true;
  68. Template.AbilityMultiTargetStyle = ConeMultiTarget;
  69.  
  70. UnitPropertyCondition = new class'X2Condition_UnitProperty';
  71. UnitPropertyCondition.ExcludeDead = true;
  72. UnitPropertyCondition.ExcludeFriendlyToSource = true;
  73. Template.AbilityShooterConditions.AddItem(UnitPropertyCondition);
  74. Template.AbilityTargetConditions.AddItem(UnitPropertyCondition);
  75.  
  76. SuppressionEffect = new class'X2Effect_Suppression';
  77. SuppressionEffect.BuildPersistentEffect(1, false, true, false, eGameRule_PlayerTurnBegin);
  78. SuppressionEffect.bRemoveWhenTargetDies = true;
  79. SuppressionEffect.bRemoveWhenSourceDamaged = true;
  80. SuppressionEffect.bBringRemoveVisualizationForward = true;
  81. SuppressionEffect.SetDisplayInfo(ePerkBuff_Penalty, Template.LocFriendlyName, class'X2Ability_GrenadierAbilitySet'.default.SuppressionTargetEffectDesc, Template.IconImage);
  82. SuppressionEffect.SetSourceDisplayInfo(ePerkBuff_Bonus, Template.LocFriendlyName, class'X2Ability_GrenadierAbilitySet'.default.SuppressionSourceEffectDesc, Template.IconImage);
  83. Template.AddMultiTargetEffect(SuppressionEffect);
  84. Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.HoloTargetEffect());
  85. Template.bAllowAmmoEffects = true;
  86.  
  87. Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_LIEUTENANT_PRIORITY;
  88. Template.AbilitySourceName = 'eAbilitySource_Perk';
  89. Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow;
  90. Template.bDisplayInUITooltip = false;
  91. Template.AdditionalAbilities.AddItem('COF_ReactionShot');
  92. Template.bIsASuppressionEffect = true;
  93. Template.AbilityConfirmSound = "TacticalUI_ActivateAbility";
  94.  
  95. Template.AssociatedPassives.AddItem('HoloTargeting');
  96.  
  97.  
  98. Template.BuildNewGameStateFn = TypicalAbility_BuildGameState;
  99. Template.BuildVisualizationFn = ConeOfFireBuildVisualization;
  100. Template.BuildAppliedVisualizationSyncFn = class'X2Ability_GrenadierAbilitySet'.static.SuppressionBuildVisualizationSync;
  101. Template.CinescriptCameraType = "StandardSuppression";
  102.  
  103. Template.TargetingMethod = class'X2TargetingMethod_Cone';
  104.  
  105. Template.bCrossClassEligible = true;
  106.  
  107. return Template;
  108. }
  109.  
  110. simulated function ConeOfFireBuildVisualization(XComGameState VisualizeGameState, out array<VisualizationTrack> OutVisualizationTracks)
  111. {
  112. local XComGameStateHistory History;
  113. local XComGameStateContext_Ability Context;
  114. local StateObjectReference InteractingUnitRef;
  115.  
  116. local VisualizationTrack EmptyTrack;
  117. local VisualizationTrack BuildTrack;
  118.  
  119. local XComUnitPawn UnitPawn;
  120. local XComWeapon Weapon;
  121.  
  122. local int i;
  123. local XComGameState_Ability Ability;
  124. local X2Action_PlaySoundAndFlyOver SoundAndFlyOver;
  125.  
  126. History = `XCOMHISTORY;
  127.  
  128. Context = XComGameStateContext_Ability(VisualizeGameState.GetContext());
  129. InteractingUnitRef = Context.InputContext.SourceObject;
  130.  
  131. //Configure the visualization track for the shooter
  132. //****************************************************************************************
  133. BuildTrack = EmptyTrack;
  134. BuildTrack.StateObject_OldState = History.GetGameStateForObjectID(InteractingUnitRef.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1);
  135. BuildTrack.StateObject_NewState = VisualizeGameState.GetGameStateForObjectID(InteractingUnitRef.ObjectID);
  136. BuildTrack.TrackActor = History.GetVisualizer(InteractingUnitRef.ObjectID);
  137.  
  138. // Check the actor's pawn and weapon, see if they can play the suppression effect
  139. UnitPawn = XGUnit(BuildTrack.TrackActor).GetPawn();
  140. Weapon = XComWeapon(UnitPawn.Weapon);
  141. if (Weapon != None &&
  142. !UnitPawn.GetAnimTreeController().CanPlayAnimation(Weapon.WeaponSuppressionFireAnimSequenceName) &&
  143. !UnitPawn.GetAnimTreeController().CanPlayAnimation(class'XComWeapon'.default.WeaponSuppressionFireAnimSequenceName))
  144. {
  145. // The unit can't play their weapon's suppression effect. Replace it with the normal fire effect so at least they'll look like they're shooting
  146. Weapon.WeaponSuppressionFireAnimSequenceName = Weapon.WeaponFireAnimSequenceName;
  147. }
  148.  
  149. class'X2Action_ExitCover'.static.AddToVisualizationTrack(BuildTrack, Context);
  150. class'X2Action_StartSuppression'.static.AddToVisualizationTrack(BuildTrack, Context);
  151. OutVisualizationTracks.AddItem(BuildTrack);
  152. //****************************************************************************************
  153. //Configure the visualization track for the targets
  154. for (i = 0; i < Context.InputContext.MultiTargets.Length; i++)
  155. {
  156. // Fake it out by assigning the first multi-target as the primary target
  157. if (Context.InputContext.PrimaryTarget.ObjectID == 0)
  158. Context.InputContext.PrimaryTarget = Context.InputContext.MultiTargets[i];
  159. }
  160.  
  161. InteractingUnitRef = Context.InputContext.MultiTargets[i];
  162. Ability = XComGameState_Ability(History.GetGameStateForObjectID(Context.InputContext.AbilityRef.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1));
  163. BuildTrack = EmptyTrack;
  164. BuildTrack.StateObject_OldState = History.GetGameStateForObjectID(InteractingUnitRef.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1);
  165. BuildTrack.StateObject_NewState = VisualizeGameState.GetGameStateForObjectID(InteractingUnitRef.ObjectID);
  166. BuildTrack.TrackActor = History.GetVisualizer(InteractingUnitRef.ObjectID);
  167. SoundAndFlyOver = X2Action_PlaySoundAndFlyOver(class'X2Action_PlaySoundAndFlyOver'.static.AddToVisualizationTrack(BuildTrack, Context));
  168. SoundAndFlyOver.SetSoundAndFlyOverParameters(None, Ability.GetMyTemplate().LocFlyOverText, '', eColor_Bad);
  169. if (XComGameState_Unit(BuildTrack.StateObject_OldState).ReserveActionPoints.Length != 0 && XComGameState_Unit(BuildTrack.StateObject_NewState).ReserveActionPoints.Length == 0)
  170. {
  171. SoundAndFlyOver = X2Action_PlaySoundAndFlyOver(class'X2Action_PlaySoundAndFlyOver'.static.AddToVisualizationTrack(BuildTrack, Context));
  172. SoundAndFlyOver.SetSoundAndFlyOverParameters(none, class'XLocalizedData'.default.OverwatchRemovedMsg, '', eColor_Bad);
  173. }
  174. OutVisualizationTracks.AddItem(BuildTrack);
  175. }
  176.  
  177. static function X2AbilityTemplate COF_ReactionShot()
  178. {
  179. local X2AbilityTemplate Template;
  180. local X2AbilityCost_ReserveActionPoints ReserveActionPointCost;
  181. local X2AbilityToHitCalc_StandardAim ToHitCalc;
  182. local X2Condition_Visibility TargetVisibilityCondition;
  183. local X2AbilityTrigger_Event Trigger;
  184. local X2Condition_UnitEffectsWithAbilitySource TargetEffectCondition;
  185. local X2Effect_RemoveEffects RemoveSuppression;
  186. local X2Effect ShotEffect;
  187. local X2AbilityCost_Ammo AmmoCost;
  188.  
  189. `CREATE_X2ABILITY_TEMPLATE(Template, 'COF_ReactionShot');
  190.  
  191. Template.bDontDisplayInAbilitySummary = true;
  192.  
  193. ReserveActionPointCost = new class'X2AbilityCost_ReserveActionPoints';
  194. ReserveActionPointCost.iNumPoints = 1;
  195. ReserveActionPointCost.AllowedTypes.AddItem('Suppression');
  196. Template.AbilityCosts.AddItem(ReserveActionPointCost);
  197.  
  198. AmmoCost = new class'X2AbilityCost_Ammo';
  199. AmmoCost.iAmmo = 1;
  200. Template.AbilityCosts.AddItem(AmmoCost);
  201.  
  202. ToHitCalc = new class'X2AbilityToHitCalc_StandardAim';
  203. ToHitCalc.BuiltInHitMod = 200;
  204. ToHitCalc.bAllowCrit = false;
  205. Template.AbilityToHitCalc = ToHitCalc;
  206. Template.AbilityToHitOwnerOnMissCalc = ToHitCalc;
  207.  
  208. Template.AbilityTargetStyle = default.SimpleSingleTarget;
  209.  
  210. Template.AbilityTargetConditions.AddItem(default.LivingHostileTargetProperty);
  211.  
  212. TargetEffectCondition = new class'X2Condition_UnitEffectsWithAbilitySource';
  213. TargetEffectCondition.AddRequireEffect(class'X2Effect_Suppression'.default.EffectName, 'AA_UnitIsNotSuppressed');
  214. Template.AbilityTargetConditions.AddItem(TargetEffectCondition);
  215.  
  216. TargetVisibilityCondition = new class'X2Condition_Visibility';
  217. TargetVisibilityCondition.bRequireGameplayVisible = false;
  218. Template.AbilityTargetConditions.AddItem(TargetVisibilityCondition);
  219. Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty);
  220.  
  221. Template.bAllowAmmoEffects = true;
  222.  
  223. RemoveSuppression = new class'X2Effect_RemoveEffects';
  224. RemoveSuppression.EffectNamesToRemove.AddItem(class'X2Effect_Suppression'.default.EffectName);
  225. RemoveSuppression.bCheckSource = true;
  226. RemoveSuppression.SetupEffectOnShotContextResult(true, true);
  227. Template.AddShooterEffect(RemoveSuppression);
  228.  
  229. //Trigger on movement - interrupt the move
  230. Trigger = new class'X2AbilityTrigger_Event';
  231. Trigger.EventObserverClass = class'X2TacticalGameRuleset_MovementObserver';
  232. Trigger.MethodName = 'InterruptGameState';
  233. Template.AbilityTriggers.AddItem(Trigger);
  234.  
  235. Template.AbilitySourceName = 'eAbilitySource_Standard';
  236. Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow;
  237. Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_supression";
  238. Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_LIEUTENANT_PRIORITY;
  239. Template.bDisplayInUITooltip = false;
  240. Template.bDisplayInUITacticalText = false;
  241.  
  242. //don't want to exit cover, we are already in suppression/alert mode.
  243. Template.bSkipExitCoverWhenFiring = true;
  244. Template.bAllowFreeFireWeaponUpgrade = true;
  245.  
  246. // Put holo target effect first because if the target dies from this shot, it will be too late to notify the effect.
  247. ShotEffect = class'X2Ability_GrenadierAbilitySet'.static.HoloTargetEffect();
  248. ShotEffect.TargetConditions.AddItem(class'X2Ability_DefaultAbilitySet'.static.OverwatchTargetEffectsCondition());
  249. Template.AddTargetEffect(ShotEffect);
  250.  
  251. // Various Soldier ability specific effects - effects check for the ability before applying
  252. ShotEffect = class'X2Ability_GrenadierAbilitySet'.static.ShredderDamageEffect();
  253. ShotEffect.TargetConditions.AddItem(class'X2Ability_DefaultAbilitySet'.static.OverwatchTargetEffectsCondition());
  254. Template.AddTargetEffect(ShotEffect);
  255.  
  256. Template.BuildNewGameStateFn = TypicalAbility_BuildGameState;
  257. Template.BuildVisualizationFn = TypicalAbility_BuildVisualization;
  258.  
  259. return Template;
  260. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement