-
Posts
172 -
Joined
-
Last visited
Everything posted by Kregano
-
Remove cool down when switching power load outs
Kregano replied to dennisj's topic in Mass Effect's Andromeda
I totally agree. This would make switching profiles in combat so much more viable. I stick with 1 super OP build most of the time, because changing the profiles essentially cripples you for a long time in each encounter. -
Well, Gibbed, who made the awesome Mass Effect 2 & 3 save editors, is working on an editor for ME:A, so some things will be user friendly:
-
Since so many PC gamers use Dual Shock 4s as their main gamepad (myself included), it'd be great if someone could make a mod that replaced the Xbox One specific button prompts. It'd make it way easier to memorize the controls.
-
I created an AOE suppression ability about a year ago, and it worked fine, patch related hiccups not withstanding. However, now it's not functioning with one particular mod gun, and I'm not exactly sure why. Bug behavior: -Confirmed by multiple people - soldier with Spart's Salvaged Cannon (Standalone Version) will get out of cover when this ability is used, but the firing animation does not happen, none of the targets are suppressed, and ammo is consumed. -Possibly related - soldier with Spart's Salvaged Cannon (Standalone Version) is in range of two targetable enemies. Ability is used, but only one target is suppressed, while the other is not. Animation plays. Code for the Cone of Fire ability: class X2Ability_ConeOfFireStuff extends X2Ability_GrenadierAbilitySet config(GameData_SoldierSkills) dependson (XComGameStateContext_Ability); static function array<X2DataTemplate> CreateTemplates() { local array<X2DataTemplate> Templates; Templates.AddItem(ConeOfFire()); return Templates; } static function X2AbilityTemplate ConeOfFire() { local X2AbilityTemplate Template; local X2AbilityCost_ActionPoints ActionPointCost; local X2AbilityCost_Ammo AmmoCost; local X2AbilityCooldown Cooldown; local X2Effect_ReserveActionPoints ReserveActionPointsEffect; local X2AbilityMultiTarget_Cone ConeMultiTarget; local X2Condition_UnitProperty UnitPropertyCondition; local X2Effect_Suppression SuppressionEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'ConeOfFire'); Template.IconImage = "img:///UILibrary_ConeOfFire.UIPerk_coneoffire"; ActionPointCost = new class'X2AbilityCost_ActionPoints'; ActionPointCost.bConsumeAllPoints = true; // this will guarantee the unit has at least 1 action point ActionPointCost.bFreeCost = true; // ReserveActionPoints effect will take all action points away Template.AbilityCosts.AddItem(ActionPointCost); AmmoCost = new class'X2AbilityCost_Ammo'; AmmoCost.iAmmo = 2; Template.AbilityCosts.AddItem(AmmoCost); Cooldown = new class'X2AbilityCooldown'; Cooldown.iNumTurns = 1; Template.AbilityCooldown = Cooldown; Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty); Template.AddShooterEffectExclusions(); ReserveActionPointsEffect = new class'X2Effect_ReserveActionPoints'; ReserveActionPointsEffect.ReserveType = 'Suppression'; Template.AddShooterEffect(ReserveActionPointsEffect); Template.AbilityToHitCalc = default.DeadEye; Template.AbilityTargetConditions.AddItem(default.LivingHostileUnitDisallowMindControlProperty); Template.AbilityTargetConditions.AddItem(default.GameplayVisibilityCondition); Template.AbilityTriggers.AddItem(default.PlayerInputTrigger); Template.AbilityTargetStyle = new class'X2AbilityTarget_Cursor'; ConeMultiTarget = new class'X2AbilityMultiTarget_Cone'; ConeMultiTarget.bUseWeaponRadius = true; ConeMultiTarget.ConeEndDiameter = 12 * class'XComWorldData'.const.WORLD_StepSize; ConeMultiTarget.bUseWeaponRangeForLength = true; Template.AbilityMultiTargetStyle = ConeMultiTarget; UnitPropertyCondition = new class'X2Condition_UnitProperty'; UnitPropertyCondition.ExcludeDead = true; UnitPropertyCondition.ExcludeFriendlyToSource = true; Template.AbilityShooterConditions.AddItem(UnitPropertyCondition); Template.AbilityTargetConditions.AddItem(UnitPropertyCondition); SuppressionEffect = new class'X2Effect_Suppression'; SuppressionEffect.BuildPersistentEffect(1, false, true, false, eGameRule_PlayerTurnBegin); SuppressionEffect.bRemoveWhenTargetDies = true; SuppressionEffect.bRemoveWhenSourceDamaged = true; SuppressionEffect.bBringRemoveVisualizationForward = true; SuppressionEffect.SetDisplayInfo(ePerkBuff_Penalty, Template.LocFriendlyName, class'X2Ability_GrenadierAbilitySet'.default.SuppressionTargetEffectDesc, Template.IconImage); SuppressionEffect.SetSourceDisplayInfo(ePerkBuff_Bonus, Template.LocFriendlyName, class'X2Ability_GrenadierAbilitySet'.default.SuppressionSourceEffectDesc, Template.IconImage); Template.AddMultiTargetEffect(SuppressionEffect); Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.HoloTargetEffect()); Template.bAllowAmmoEffects = true; Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_LIEUTENANT_PRIORITY; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; Template.bDisplayInUITooltip = false; Template.AdditionalAbilities.AddItem('SuppressionShot'); Template.bIsASuppressionEffect = true; Template.AbilityConfirmSound = "TacticalUI_ActivateAbility"; Template.AssociatedPassives.AddItem('HoloTargeting'); Template.CinescriptCameraType = "StandardSuppression"; Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; Template.BuildVisualizationFn = ConeOfFireBuildVisualization; Template.BuildAppliedVisualizationSyncFn = class'X2Ability_GrenadierAbilitySet'.static.SuppressionBuildVisualizationSync; Template.TargetingMethod = class'X2TargetingMethod_Cone'; Template.bCrossClassEligible = true; return Template; } Code for the visualization (possibly where the error is, although this works on every other mod weapon I use with this skill): simulated function ConeOfFireBuildVisualization(XComGameState VisualizeGameState, out array<VisualizationTrack> OutVisualizationTracks) { local XComGameStateHistory History; local XComGameStateContext_Ability Context; local StateObjectReference InteractingUnitRef; local VisualizationTrack EmptyTrack; local VisualizationTrack BuildTrack; local int i; local XComGameState_Ability Ability; local X2Action_PlaySoundAndFlyOver SoundAndFlyOver; local XComUnitPawn UnitPawn; local XComWeapon Weapon; History = `XCOMHISTORY; Context = XComGameStateContext_Ability(VisualizeGameState.GetContext()); InteractingUnitRef = Context.InputContext.SourceObject; //Configure the visualization track for the shooter //**************************************************************************************** BuildTrack = EmptyTrack; BuildTrack.StateObject_OldState = History.GetGameStateForObjectID(InteractingUnitRef.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1); BuildTrack.StateObject_NewState = VisualizeGameState.GetGameStateForObjectID(InteractingUnitRef.ObjectID); BuildTrack.TrackActor = History.GetVisualizer(InteractingUnitRef.ObjectID); // Check the actor's pawn and weapon, see if they can play the suppression effect UnitPawn = XGUnit(BuildTrack.TrackActor).GetPawn(); Weapon = XComWeapon(UnitPawn.Weapon); if (Weapon != None && !UnitPawn.GetAnimTreeController().CanPlayAnimation(Weapon.WeaponSuppressionFireAnimSequenceName) && !UnitPawn.GetAnimTreeController().CanPlayAnimation(class'XComWeapon'.default.WeaponSuppressionFireAnimSequenceName)) { // 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 Weapon.WeaponSuppressionFireAnimSequenceName = Weapon.WeaponFireAnimSequenceName; } class'X2Action_ExitCover'.static.AddToVisualizationTrack(BuildTrack, Context); class'X2Action_StartSuppression'.static.AddToVisualizationTrack(BuildTrack, Context); OutVisualizationTracks.AddItem(BuildTrack); //**************************************************************************************** //Configure the visualization track for the targets for (i = 0; i < Context.InputContext.MultiTargets.Length; i++) { // Fake it out by assigning the first multi-target as the primary target if (Context.InputContext.PrimaryTarget.ObjectID == 0) Context.InputContext.PrimaryTarget = Context.InputContext.MultiTargets[i]; InteractingUnitRef = Context.InputContext.MultiTargets[i]; Ability = XComGameState_Ability(History.GetGameStateForObjectID(Context.InputContext.AbilityRef.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1)); BuildTrack = EmptyTrack; BuildTrack.StateObject_OldState = History.GetGameStateForObjectID(InteractingUnitRef.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1); BuildTrack.StateObject_NewState = VisualizeGameState.GetGameStateForObjectID(InteractingUnitRef.ObjectID); BuildTrack.TrackActor = History.GetVisualizer(InteractingUnitRef.ObjectID); SoundAndFlyOver = X2Action_PlaySoundAndFlyOver(class'X2Action_PlaySoundAndFlyOver'.static.AddToVisualizationTrack(BuildTrack, Context)); SoundAndFlyOver.SetSoundAndFlyOverParameters(None, Ability.GetMyTemplate().LocFlyOverText, '', eColor_Bad); if (XComGameState_Unit(BuildTrack.StateObject_OldState).ReserveActionPoints.Length != 0 && XComGameState_Unit(BuildTrack.StateObject_NewState).ReserveActionPoints.Length == 0) { SoundAndFlyOver = X2Action_PlaySoundAndFlyOver(class'X2Action_PlaySoundAndFlyOver'.static.AddToVisualizationTrack(BuildTrack, Context)); SoundAndFlyOver.SetSoundAndFlyOverParameters(none, class'XLocalizedData'.default.OverwatchRemovedMsg, '', eColor_Bad); } OutVisualizationTracks.AddItem(BuildTrack); } } Code for Spart's Salvaged Cannon (Standalone): class X2Item_SpartsSalvSA_Weapon extends X2Item config(SpartsSalvSA); var config bool HIDE_PREVIOUS_TIERS_SALV; // Variables from config - GameData_WeaponData.ini // ***** Damage arrays for attack actions ***** var config WeaponDamageValue ADVCONVLMG_SA_CONVENTIONAL_BASEDAMAGE; var config WeaponDamageValue ADVCONVLMG_SA_MAGNETIC_BASEDAMAGE; var config WeaponDamageValue ADVCONVLMG_SA_BEAM_BASEDAMAGE; // ***** Core properties and variables for weapons ***** var config int ADVCONVLMG_SA_CONVENTIONAL_AIM; var config int ADVCONVLMG_SA_CONVENTIONAL_CRITCHANCE; var config int ADVCONVLMG_SA_CONVENTIONAL_ICLIPSIZE; var config int ADVCONVLMG_SA_CONVENTIONAL_ISOUNDRANGE; var config int ADVCONVLMG_SA_CONVENTIONAL_IENVIRONMENTDAMAGE; var config int ADVCONVLMG_SA_CONVENTIONAL_UPGRADESLOTS; var config int ADVCONVLMG_SA_MAGNETIC_AIM; var config int ADVCONVLMG_SA_MAGNETIC_CRITCHANCE; var config int ADVCONVLMG_SA_MAGNETIC_ICLIPSIZE; var config int ADVCONVLMG_SA_MAGNETIC_ISOUNDRANGE; var config int ADVCONVLMG_SA_MAGNETIC_IENVIRONMENTDAMAGE; var config int ADVCONVLMG_SA_MAGNETIC_UPGRADESLOTS; var config int ADVCONVLMG_SA_BEAM_AIM; var config int ADVCONVLMG_SA_BEAM_CRITCHANCE; var config int ADVCONVLMG_SA_BEAM_ICLIPSIZE; var config int ADVCONVLMG_SA_BEAM_ISOUNDRANGE; var config int ADVCONVLMG_SA_BEAM_IENVIRONMENTDAMAGE; var config int ADVCONVLMG_SA_BEAM_UPGRADESLOTS; // ***** Range Modifier Tables ***** var config array<int> ADVCONVLMG_SA_CONVENTIONAL_RANGE; var config array<int> ADVCONVLMG_SA_MAGNETIC_RANGE; var config array<int> ADVCONVLMG_SA_BEAM_RANGE; //Template classes are searched for by the game when it starts. Any derived classes have their CreateTemplates function called //on the class default object. The game expects CreateTemplates to return a list of templates that it will add to the manager //reponsible for those types of templates. Later, these templates will be automatically picked up by the game mechanics and systems. static function array<X2DataTemplate> CreateTemplates() { local array<X2DataTemplate> ModWeapons; local X2ItemTemplateManager ItemTemplateManager; ModWeapons.AddItem(CreateTemplate_AdvCannon_SA_Conventional()); ModWeapons.AddItem(CreateTemplate_AdvCannon_SA_Magnetic()); ModWeapons.AddItem(CreateTemplate_AdvCannon_SA_Beam()); [-snip weapon attachments-] return ModWeapons; } static function X2DataTemplate CreateTemplate_AdvCannon_SA_Conventional() { local X2WeaponTemplate Template; `CREATE_X2TEMPLATE(class'X2WeaponTemplate', Template, 'AdvCannon_SA_CV'); Template.WeaponPanelImage = "_ConventionalRifle"; Template.ItemCat = 'weapon'; Template.WeaponCat = 'cannon'; Template.WeaponTech = 'conventional'; Template.strImage = "img:///UILibrary_SpartsSalvSA.ConvAdvCannon_Base"; Template.EquipSound = "Conventional_Weapon_Equip"; Template.Tier = 0; Template.Abilities.AddItem('ADVCONVLMG_SA_CV_StatBonus'); Template.SetUIStatMarkup(class'XLocalizedData'.default.MobilityLabel, eStat_Mobility, class'X2Ability_SpartsSalvSA'.default.ADVCONVLMG_SA_CV_MOBILITY_BONUS); Template.RangeAccuracy = default.ADVCONVLMG_SA_CONVENTIONAL_RANGE; Template.BaseDamage = default.ADVCONVLMG_SA_CONVENTIONAL_BASEDAMAGE; Template.Aim = default.ADVCONVLMG_SA_CONVENTIONAL_AIM; Template.CritChance = default.ADVCONVLMG_SA_CONVENTIONAL_CRITCHANCE; Template.iClipSize = default.ADVCONVLMG_SA_CONVENTIONAL_ICLIPSIZE; Template.iSoundRange = default.ADVCONVLMG_SA_CONVENTIONAL_ISOUNDRANGE; Template.iEnvironmentDamage = default.ADVCONVLMG_SA_CONVENTIONAL_IENVIRONMENTDAMAGE; Template.NumUpgradeSlots = default.ADVCONVLMG_SA_CONVENTIONAL_UPGRADESLOTS; Template.bIsLargeWeapon = true; Template.InventorySlot = eInvSlot_PrimaryWeapon; Template.Abilities.AddItem('StandardShot'); Template.Abilities.AddItem('Overwatch'); Template.Abilities.AddItem('OverwatchShot'); Template.Abilities.AddItem('Reload'); Template.Abilities.AddItem('HotLoadAmmo'); // This all the resources; sounds, animations, models, physics, the works. Template.GameArchetype = "SalvCannonSA.GameData.WP_AdvCannon_CV"; Template.UIArmoryCameraPointTag = 'UIPawnLocation_WeaponUpgrade_Cannon'; Template.AddDefaultAttachment('Mag', "ConvCannon.Meshes.SM_ConvCannon_MagA", , "img:///UILibrary_SpartsSalvSA.ConvAdvCannon_MagA"); Template.AddDefaultAttachment('Reargrip', "ConvCannon.Meshes.SM_ConvCannon_ReargripA"/*REARGRIP INCLUDED IN TRIGGER IMAGE*/); Template.AddDefaultAttachment('Stock', "ConvCannon.Meshes.SM_ConvCannon_StockA", , "img:///UILibrary_SpartsSalvSA.ConvAdvCannon_StockA"); Template.AddDefaultAttachment('StockSupport', "ConvCannon.Meshes.SM_ConvCannon_StockA_Support"); Template.AddDefaultAttachment('Suppressor', "ConvCannon.Meshes.SM_ConvCannon_SuppressorA"); Template.AddDefaultAttachment('Trigger', "ConvCannon.Meshes.SM_ConvCannon_TriggerA", , "img:///UILibrary_SpartsSalvSA.ConvAdvCannon_TriggerA"); Template.AddDefaultAttachment('Light', "ConvAttachments.Meshes.SM_ConvFlashLight", , "img:///UILibrary_SpartsSalvSA.ConvAdvCannon_Flashlight"); Template.iPhysicsImpulse = 5; if (class'X2Item_SpartsSalvSA_Schematics'.default.ADVCANNON_SA_CONVENTIONAL_ENABLE_ONSTART == true) { Template.StartingItem = true; } else { Template.CreatorTemplateName = 'AdvCannon_SA_CV_Schematic'; // The schematic which creates this item } Template.CanBeBuilt = false; Template.bInfiniteItem = true; Template.DamageTypeTemplateName = 'Projectile_Conventional'; if (default.HIDE_PREVIOUS_TIERS_SALV == true) { Template.HideIfPurchased = 'AdvCannon_SA_MG'; } return Template; } static function X2DataTemplate CreateTemplate_AdvCannon_SA_Magnetic() { local X2WeaponTemplate Template; `CREATE_X2TEMPLATE(class'X2WeaponTemplate', Template, 'AdvCannon_SA_MG'); Template.WeaponPanelImage = "_ConventionalRifle"; Template.ItemCat = 'weapon'; Template.WeaponCat = 'cannon'; Template.WeaponTech = 'magnetic'; Template.strImage = "img:///UILibrary_SpartsSalvSA.ConvAdvCannon_Base"; Template.EquipSound = "Magnetic_Weapon_Equip"; Template.Tier = 3; Template.Abilities.AddItem('ADVCONVLMG_SA_MG_StatBonus'); Template.SetUIStatMarkup(class'XLocalizedData'.default.MobilityLabel, eStat_Mobility, class'X2Ability_SpartsSalvSA'.default.ADVCONVLMG_SA_MG_MOBILITY_BONUS); Template.RangeAccuracy = default.ADVCONVLMG_SA_MAGNETIC_RANGE; Template.BaseDamage = default.ADVCONVLMG_SA_MAGNETIC_BASEDAMAGE; Template.Aim = default.ADVCONVLMG_SA_MAGNETIC_AIM; Template.CritChance = default.ADVCONVLMG_SA_MAGNETIC_CRITCHANCE; Template.iClipSize = default.ADVCONVLMG_SA_MAGNETIC_ICLIPSIZE; Template.iSoundRange = default.ADVCONVLMG_SA_MAGNETIC_ISOUNDRANGE; Template.iEnvironmentDamage = default.ADVCONVLMG_SA_MAGNETIC_IENVIRONMENTDAMAGE; Template.NumUpgradeSlots = default.ADVCONVLMG_SA_MAGNETIC_UPGRADESLOTS; Template.bIsLargeWeapon = true; Template.InventorySlot = eInvSlot_PrimaryWeapon; Template.Abilities.AddItem('StandardShot'); Template.Abilities.AddItem('Overwatch'); Template.Abilities.AddItem('OverwatchShot'); Template.Abilities.AddItem('Reload'); Template.Abilities.AddItem('HotLoadAmmo'); // This all the resources; sounds, animations, models, physics, the works. Template.GameArchetype = "SalvCannonSA.GameData.WP_AdvCannon_CV"; Template.UIArmoryCameraPointTag = 'UIPawnLocation_WeaponUpgrade_Cannon'; Template.AddDefaultAttachment('Mag', "ConvCannon.Meshes.SM_ConvCannon_MagA", , "img:///UILibrary_SpartsSalvSA.ConvAdvCannon_MagA"); Template.AddDefaultAttachment('Reargrip', "ConvCannon.Meshes.SM_ConvCannon_ReargripA"/*REARGRIP INCLUDED IN TRIGGER IMAGE*/); Template.AddDefaultAttachment('Stock', "ConvCannon.Meshes.SM_ConvCannon_StockA", , "img:///UILibrary_SpartsSalvSA.ConvAdvCannon_StockA"); Template.AddDefaultAttachment('StockSupport', "ConvCannon.Meshes.SM_ConvCannon_StockA_Support"); Template.AddDefaultAttachment('Suppressor', "ConvCannon.Meshes.SM_ConvCannon_SuppressorA"); Template.AddDefaultAttachment('Trigger', "ConvCannon.Meshes.SM_ConvCannon_TriggerA", , "img:///UILibrary_SpartsSalvSA.ConvAdvCannon_TriggerA"); Template.AddDefaultAttachment('Light', "ConvAttachments.Meshes.SM_ConvFlashLight", , "img:///UILibrary_SpartsSalvSA.ConvAdvCannon_Flashlight"); Template.iPhysicsImpulse = 5; Template.CreatorTemplateName = 'AdvCannon_SA_MG_Schematic'; // The schematic which creates this item Template.BaseItem = 'AdvCannon_SA_CV'; // Which item this will be upgraded from Template.CanBeBuilt = false; Template.bInfiniteItem = true; Template.DamageTypeTemplateName = 'Projectile_MagXCom'; if (default.HIDE_PREVIOUS_TIERS_SALV == true) { Template.HideIfPurchased = 'AdvCannon_SA_BM'; } return Template; } static function X2DataTemplate CreateTemplate_AdvCannon_SA_Beam() { local X2WeaponTemplate Template; `CREATE_X2TEMPLATE(class'X2WeaponTemplate', Template, 'AdvCannon_SA_BM'); Template.WeaponPanelImage = "_ConventionalRifle"; Template.ItemCat = 'weapon'; Template.WeaponCat = 'cannon'; Template.WeaponTech = 'beam'; Template.strImage = "img:///UILibrary_SpartsSalvSA.ConvAdvCannon_Base"; Template.EquipSound = "Beam_Weapon_Equip"; Template.Tier = 5; Template.Abilities.AddItem('ADVCONVLMG_SA_BM_StatBonus'); Template.SetUIStatMarkup(class'XLocalizedData'.default.MobilityLabel, eStat_Mobility, class'X2Ability_SpartsSalvSA'.default.ADVCONVLMG_SA_BM_MOBILITY_BONUS); Template.RangeAccuracy = default.ADVCONVLMG_SA_BEAM_RANGE; Template.BaseDamage = default.ADVCONVLMG_SA_BEAM_BASEDAMAGE; Template.Aim = default.ADVCONVLMG_SA_BEAM_AIM; Template.CritChance = default.ADVCONVLMG_SA_BEAM_CRITCHANCE; Template.iClipSize = default.ADVCONVLMG_SA_BEAM_ICLIPSIZE; Template.iSoundRange = default.ADVCONVLMG_SA_BEAM_ISOUNDRANGE; Template.iEnvironmentDamage = default.ADVCONVLMG_SA_BEAM_IENVIRONMENTDAMAGE; Template.NumUpgradeSlots = default.ADVCONVLMG_SA_BEAM_UPGRADESLOTS; Template.bIsLargeWeapon = true; Template.InventorySlot = eInvSlot_PrimaryWeapon; Template.Abilities.AddItem('StandardShot'); Template.Abilities.AddItem('Overwatch'); Template.Abilities.AddItem('OverwatchShot'); Template.Abilities.AddItem('Reload'); Template.Abilities.AddItem('HotLoadAmmo'); // This all the resources; sounds, animations, models, physics, the works. Template.GameArchetype = "SalvCannonSA.GameData.WP_AdvCannon_CV"; Template.UIArmoryCameraPointTag = 'UIPawnLocation_WeaponUpgrade_Cannon'; Template.AddDefaultAttachment('Mag', "ConvCannon.Meshes.SM_ConvCannon_MagA", , "img:///UILibrary_SpartsSalvSA.ConvAdvCannon_MagA"); Template.AddDefaultAttachment('Reargrip', "ConvCannon.Meshes.SM_ConvCannon_ReargripA"/*REARGRIP INCLUDED IN TRIGGER IMAGE*/); Template.AddDefaultAttachment('Stock', "ConvCannon.Meshes.SM_ConvCannon_StockA", , "img:///UILibrary_SpartsSalvSA.ConvAdvCannon_StockA"); Template.AddDefaultAttachment('StockSupport', "ConvCannon.Meshes.SM_ConvCannon_StockA_Support"); Template.AddDefaultAttachment('Suppressor', "ConvCannon.Meshes.SM_ConvCannon_SuppressorA"); Template.AddDefaultAttachment('Trigger', "ConvCannon.Meshes.SM_ConvCannon_TriggerA", , "img:///UILibrary_SpartsSalvSA.ConvAdvCannon_TriggerA"); Template.AddDefaultAttachment('Light', "ConvAttachments.Meshes.SM_ConvFlashLight", , "img:///UILibrary_SpartsSalvSA.ConvAdvCannon_Flashlight"); Template.iPhysicsImpulse = 5; Template.CreatorTemplateName = 'AdvCannon_SA_BM_Schematic'; // The schematic which creates this item Template.BaseItem = 'AdvCannon_SA_MG'; // Which item this will be upgraded from Template.CanBeBuilt = false; Template.bInfiniteItem = true; Template.DamageTypeTemplateName = 'Projectile_BeamXCom'; return Template; } It's entirely possible that there's some sort of problem with my Cone of Fire mod not being able to pull the weapon's range, but I have no idea how to fix this, because the gun seems to use its own custom range profiles.
-
I'm working on a mod for SPARKs from Shen's Last Gift, but I've run into a problem. The debugger doesn't pickup any of the DLC content, so it gives me errors. How do I solve this? Dump the DLC folder from XCOM 2's folder into the SDK folder? Also, is there a way to make an ability with a cooldown last more than one turn?
-
It might. I'm not sure, since I haven't really used UE Explorer for anything but code extraction.
-
Get UE Explorer, open the .u file, set the view to Object, and you'll be able to find stuff. You'll have to copy it to Notepad/ModBuddy/whatever, but you can get info out of there.
-
How's development been going on menu features? I've managed to reach the point where I probably need a drop down menu to handle all the options I've got.
-
Sure, just be aware that it already has AWC compatibility, so you might need to alter the XComClassData.ini file if you want it to not be given to certain classes. I swear I've seen this mod on the Workshop, but it could be one of the aim bonus mods. I'm not sure what you mean by this. Do you want extra mobility while concealed? Because Lightning Strike does that.
-
It's not even my code, really. I ripped that out of the LWS SMG mod.
-
Here you go: You can swap out SLINK_DETECTIONRADIUS for a numerical value, as long as it is in this format: 0.5f. Also, if this ability is going to be for Rangers, save yourself the trouble and don't bother. I already did that.
-
And where can I find those?.. In the SDK. Just type X2Item into the search box above the mod file tree.
-
All that stuff is in X2Item files.
-
I figured out why the default settings weren't writing on first run. I missed a command to write the initial settings to the .ini file. Still can't get the settings to write when running it through the debugger, but this is good enough for now.
-
Ah, I did try giving the two .uc files different .ini files to use. All that happened was that the listener generated an .ini, while the settings file didn't. I did have a log statement in LoadSavedSettingsInitial, but since it never appears in any of my logs, I'm just assuming it doesn't work (I really need to put an 'else' condition in there to see what's going on). If it's the code that's busted, that's going to be a pain to debug.
-
I'm not 100% what "put the FirstRun entry for SuppressionWeaponsListener into a different INI file" means. As for the log stuff, LoadSavedSettingsInitial() doesn't seem to run at all from what I can tell. Even when MCM is installed, it just skips it and forces you to save the settings manually before it'll do anything.
-
While changing SUPWEP_VER back to VERSION, I spotted a typo in the default settings .ini file name. I fixed that and voila, everything works while MCM is installed. If MCM is not installed, the mod's settings .ini file only contains this: [SuppressionWeapons.SuppressionWeaponsListener] FirstRun=True This, as far as I can tell, violates the rule that the mod should work, even if MCM isn't there.
-
Here's what I've discovered: as far as I can tell, running the mod through debug doesn't create an XComSuppressionWeapons.ini to pull values from, which is why that doesn't work. The one time I tried to use my mod on the regular game did generate an .ini, but everything was set to false. The config version is set to 0, which makes me think that renaming Version in the default files to clear that error broke the ability to pull the default values somehow.
-
This bit of code that controls whether or not the changes go through if the setting is set to true: if (class'SuppressionWeaponsSettings'.default.RIFLE_ENABLED == true) { `log("Base game rifles have Suppression!"); AddAbilities('AssaultRifle_CV', 'Suppression'); AddAbilities('AssaultRifle_MG', 'Suppression'); AddAbilities('AssaultRifle_BM', 'Suppression'); AddAbilities('AssaultRifle_Central', 'Suppression'); } It seems that the "if" statement gets picked up by the actual function because it's included in the brackets containing all the "AddAbilitiles" entries and that causes the problems. I can't be sure, since there are no errors generated by ModBuddy, but that's my best guess. This one, from the Listener: TextStuff2.SetHTMLText( class'UIUtilities_Text'.static.StyleText("The Suppression Weapons Pack's generated a default config file. You'll need to restart XCOM 2. You'll only have to do this once.", eUITextStyle_Tooltip_Body, eUIState_Warning ));
-
I decided to do it this way A) to draw the player's attention to a big gameplay change, and B) break things up into a more manageable setup for long term updating. SuppressionWeaponsSettings was indeed missing StaticSaveConfig, but adding it didn't fix the problem. So I did a quick test by removing the MCM hook to toggle whether or not SMGs got Suppression, loaded up a campaign save with the LWS SMGs, and they got Suppression. So I'm thinking the function that's supposed to be handling adding Suppression to the guns is picking up that stuff for some reason and just breaks. Also, I noticed this bug: MCM warnings about setting a default .ini if MCM isn't installed overlap each other, making them totally unreadable.
-
Fixed the icon problem - I accidentally omitted this: PersistentStatChangeEffect.SetDisplayInfo(ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, true,,Template.AbilitySourceName); Still haven't gotten any definitive sign that the ability is working.
-
I decided to make an ability that lowers a unit's detection radius, pretty simple stuff. Mod builds with no errors, looks good on the strategy debug, but doesn't work at all on the tactical debug. I deliberately copied some code from Shadowstep to display its icon while testing, but not only does the icon not show up, but the detection radius modified refuses to work either. I'm not certain of why that is, because it happens no matter what the modifier value is. Code for reference: class X2Ability_SlinkMaster extends X2Ability_RangerAbilitySet config(SlinkMaster); var config float SLINK_DETECTIONRADIUSMODIFER; static function array<X2DataTemplate> CreateTemplates() { local array<X2DataTemplate> Templates; Templates.AddItem(SlinkMaster()); return Templates; } static function X2AbilityTemplate SlinkMaster() { local X2AbilityTemplate Template; local X2Effect_PersistentStatChange PersistentStatChangeEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'SlinkMaster'); Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_shadowstep"; Template.AbilityToHitCalc = default.DeadEye; Template.AbilityTargetStyle = default.SelfTarget; Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); // Bonus to DetectionRange stat effects PersistentStatChangeEffect = new class'X2Effect_PersistentStatChange'; PersistentStatChangeEffect.BuildPersistentEffect(1, true, false, false); PersistentStatChangeEffect.AddPersistentStatChange(eStat_DetectionModifier, default.SLINK_DETECTIONRADIUSMODIFER); Template.AddTargetEffect(PersistentStatChangeEffect); Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; return Template; } [SlinkMaster.X2Ability_SlinkMaster] SLINK_DETECTIONRADIUSMODIFER = 0.5f
-
New GTS abilities/reverse engineering XCOM:EU/EW abilities
Kregano replied to Kregano's topic in XCOM's XCOM 2
I didn't define it that way. Firaxis did, for whatever reason, and it worked in the Alien Hunters DLC. -
New GTS abilities/reverse engineering XCOM:EU/EW abilities
Kregano replied to Kregano's topic in XCOM's XCOM 2
Bumping this, since this might help anyone trying to make stealth skills derived from Shadowfall: ModBuddy doesn't like static function XComGame.XComGameState.EventListenerReturn ShadowmanListener(Object EventData, Object EventSource, XComGameState GameState, name EventID) for whatever reason (the only change is turning Shadowfall into Shadowman). It'll give you this error: E:\SteamLibrary\SteamApps\common\XCOM 2 SDK\Development\Src\Shadowman\Classes\X2Effect_Shadowman.uc(16) : Error, Bad function definition Here's some experimental code you guys can play with: class X2Effect_Shadowman extends X2Effect_Persistent; function RegisterForEvents(XComGameState_Effect EffectGameState) { local X2EventManager EventMgr; local XComGameState_Unit UnitState; local Object EffectObj; EventMgr = class'X2EventManager'.static.GetEventManager(); EffectObj = EffectGameState; UnitState = XComGameState_Unit(class'XComGameStateHistory'.static.GetGameStateHistory().GetGameStateForObjectID(EffectGameState.ApplyEffectParameters.SourceStateObjectRef.ObjectID)); EventMgr.RegisterForEvent(EffectObj, 'KillMail', ShadowmanListener, 1,, UnitState); //return; } static function XComGame.XComGameState.EventListenerReturn ShadowmanListener(Object EventData, Object EventSource, XComGameState GameState, name EventID) { local XComGameStateContext_Ability AbilityContext; local XComGameState_Unit Killer; Killer = XComGameState_Unit(EventSource); AbilityContext = XComGameStateContext_Ability(GameState.GetContext()); // End:0xF4 if((((Killer != none) && AbilityContext != none) && AbilityContext.InputContext.AbilityTemplateName == 'OverwatchShot') && Killer.IsConcealed()) { Killer.RetainConcealment(); } if((((Killer != none) && AbilityContext != none) && AbilityContext.InputContext.AbilityTemplateName == 'PistolOverwatchShotHelper') && Killer.IsConcealed()) { Killer.RetainConcealment(); } if((((Killer != none) && AbilityContext != none) && AbilityContext.InputContext.AbilityTemplateName == 'PistolReturnFire') && Killer.IsConcealed()) { Killer.RetainConcealment(); } if((((Killer != none) && AbilityContext != none) && AbilityContext.InputContext.AbilityTemplateName == 'StandardShot') && Killer.IsConcealed()) { Killer.RetainConcealment(); } if((((Killer != none) && AbilityContext != none) && AbilityContext.InputContext.AbilityTemplateName == 'StandardShot_NoEnd') && Killer.IsConcealed()) { Killer.RetainConcealment(); } if((((Killer != none) && AbilityContext != none) && AbilityContext.InputContext.AbilityTemplateName == 'PistolStandardShot') && Killer.IsConcealed()) { Killer.RetainConcealment(); } if((((Killer != none) && AbilityContext != none) && AbilityContext.InputContext.AbilityTemplateName == 'SniperStandardFire') && Killer.IsConcealed()) { Killer.RetainConcealment(); } if((((Killer != none) && AbilityContext != none) && AbilityContext.InputContext.AbilityTemplateName == 'SniperRifleOverwatch') && Killer.IsConcealed()) { Killer.RetainConcealment(); } return 0; //return ReturnValue; } No idea if it works, due to ModBuddy hating that line.