Jump to content

Recommended Posts

I have a few ideas, but don't know how to implement them.

Does anyone know how:

  • to combine onDamaged with OnCriticallyHit and OnHitOrCriticallyHit statusEffect event types? (I want to detect a hit or crit, from an attack that deals damage)
  • to implement channeling casting. I.e. and effect happens only during active casting; and when the character performs any other action, the effect immediately stops?
  • to make a trinket unswappable during combat?
  • to use AbilityModGameData and AbilityModComponent? (see example below)

 

------------

 

I am trying to make a trinket that when equipped mods the Spiritshift_Bear ability by adding an additional use:

Quote

 

{
  "GameDataObjects": [
    {
      "$type": "Game.GameData.EquippableGameData, Assembly-CSharp",
      "DebugName": "Trinket_U_Spiritshift_Glyph_Of_Tenacity",
      "ID": "22599625-5647-4acb-a545-69d5ad161b1e",
      "Components": [
        {
          "$type": "Game.GameData.ItemComponent, Assembly-CSharp",
          "DisplayName": 34011,
          "DescriptionText": 34012,
          "DescriptionTextTactical": -1,
          "FilterType": "Artifact",
          "InventoryAudioEventListID": "32023afc-c1c3-4b6a-bcfd-77bde56ee6c3",
          "IsQuestItem": "false",
          "IsIngredient": "false",
          "IsCurrency": "false",
          "IsAdventuringItem": "false",
          "IsJunk": "false",
          "CanSellForFullValue": "false",
          "MaxStackSize": 1,
          "NeverDropAsLoot": "false",
          "CanBePickpocketed": "false",
          "IsUnique": "true",
          "Value": 17200,
          "IconTextureSmall": "POE1_book_tome_S",
          "IconTextureLarge": "gui/icons/misc/book_tome_L.png",
          "PencilSketchTexture": "",
          "InspectOnUseButton": [],
          "IsPlaceholder": "false"
        },
        {
          "$type": "Game.GameData.EquippableComponent, Assembly-CSharp",
          "EquipmentType": "None",
          "EquipmentSlot": "GrimoireOrTrinket",
          "AppearancePiece": {
            "ModelVisualDataPath": ""
          },
          "ItemModsIDs": [
            "3d075219-7bbd-4628-a43c-5452c4c3a17c"
          ],
          "OnEquipVisualEffects": [],
          "RestrictedToClassIDs": [
            "568f1c26-1398-4e67-8b81-0f6a60e6cdde"
          ],
          "RestrictedToPlayer": "false",
          "EquipConditionals": {
            "Operator": 0,
            "Components": []
          },
          "ProficientAbilityID": "00000000-0000-0000-0000-000000000000",
          "CannotUnequip": "false",
          "ItemRendererPrefab": "",
          "ItemModel": "",
          "AnimationController": "",
          "PaperdollOverrideRenderer": "",
          "AttackSummonID": "00000000-0000-0000-0000-000000000000",
          "CannotSheathe": "false",
          "PropVisualEffects": []
        }
      ]
    },
    {
      "$type": "Game.GameData.ItemModGameData, Assembly-CSharp",
      "DebugName": "Extra_Spiritshift_Tenacity",
      "ID": "3d075219-7bbd-4628-a43c-5452c4c3a17c",
      "Components": [
        {
          "$type": "Game.GameData.ItemModComponent, Assembly-CSharp",
          "DisplayName": 33012,
          "HideFromUI": "false",
          "EnchantCategory": "Unique",
          "Cost": 4,
          "CursesItem": "false",
          "DurabilityDamage": 0,
          "StatusEffectsOnEquipIDs": [],
          "StatusEffectsOnLaunchIDs": [],
          "StatusEffectsOnAttackIDs": [],
          "AbilityModsOnEquipIDs": ["d77957c3-c9d1-47f9-bdf9-ee79a1eafd6b"],
          "OnEquipVisualEffects": [],
          "DamageProcs": [],
          "AbilitiesOnEquipIDs": []
        }
      ]
    },
    {
      "$type": "Game.GameData.AbilityModGameData, Assembly-CSharp",
      "DebugName": "Extra_Spiritshift_Ability_Mod_Tenacity",
      "ID": "d77957c3-c9d1-47f9-bdf9-ee79a1eafd6b",
      "Components": [
        {
          "$type": "Game.GameData.AbilityModComponent, Assembly-CSharp",
          "Type": "AdditionalUse",
          "Value": 1,
          "StatusEffectsIDs": ["00000000-0000-0000-0000-000000000000"],
          "ReplacedVisualEffects": []
        }
      ]
    }
  ]
}

 

But in AbilityModComponent description it is not mentioned how to indicate the id of ability that is being modded.

I.e. where to add "0db41697-d8b9-49fa-b31e-67eb9c3a9693" which corresponds to Spiritshift_Bear ability?

  • Hmmm 1
Link to comment
Share on other sites

19 hours ago, MaxQuest said:

to implement channeling casting. I.e. and effect happens only during active casting; and when the character performs any other action, the effect immediately stops?

This is a wild guess, but something like a castable ability (using an attack with a very long custom CastSpeed to make it "channel"?) together with a passive ability with ActivationPrerequisites/DeactivationPrerequisites utilizing the IsCastingAbility conditional?

IsCastingAbility 7d150000-0000-0000-0000-000000000000 <CastableAbilityID>

With this the passive ability should trigger while the castable ability is being "channeled".

 

 

  • Thanks 1
Link to comment
Share on other sites

Two more questions:

Q1. I want to create an item that gives bonus accuracy vs Prone enemies. But how can a StatusEffect check if the enemy is Prone?

There is no proper keyword for that. So I have created one and added it to Abilities and StatusEffects (e.g. Amplified Wave); and also added it to AttackTargetFilter of item's StatusEffect.

So far so good, the autogenerated tooltip reads "+x Accuracy vs Prone enemies"; but character doesn't actually get bonus accuracy. Probably because Prone is considered an interruptType?

 

Q2. Does anyone know how to create nested Conditionals that BMac has mentioned here?

I want to implement:

  • ActivationPrerequisites (hasStatusEffect): (effectA1 || effectA2) && (effectB1 || effectB2)
  • DeactivationPrerequisites (hasStatusEffect):: !(effectA1 || effectA2) || !(effectB1 || effectB2)

But without parentheses, and with partially bugged right-to-left boolean evaluation it is not clear how to do it...

Link to comment
Share on other sites

1 hour ago, MaxQuest said:

Q2. Does anyone know how to create nested Conditionals that BMac has mentioned here?

Just to confirm, you want the following logic?

ActivationPrerequisite:

if {
    HasStatusEffect(This, SE_A1)
    or HasStatusEffect(This, SE_A2)
}
and if {
    HasStatusEffect(This, SE_B1)
    or HasStatusEffect(This, SE_B2)
}

DeactivationPrerequisite:

if {
    not HasStatusEffect(This, SE_A1)
    and not HasStatusEffect(This, SE_A2)
}
or if {
    not HasStatusEffect(This, SE_B1)
    and not HasStatusEffect(This, SE_B2)
}

This is equivalent to this:

Spoiler
{
  "$type": "Game.GameData.GenericAbilityComponent, Assembly-CSharp",
  "ActivationPrerequisites": {
    "Conditional": {
      "Operator": 0,
      "Components": [
        {
          "$type": "OEIFormats.FlowCharts.ConditionalExpression, OEIFormats",
          "Operator": 0,
          "Components": [
            {
              "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
              "Data": {
                "FullName": "Boolean HasStatusEffect(Guid, Guid)",
                "Parameters": [
                  "7d150000-0000-0000-0000-000000000000",
                  "00000000-0000-0000-0000-000000000000"
                ]
              },
              "Not": false,
              "Operator": 1
            },
            {
              "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
              "Data": {
                "FullName": "Boolean HasStatusEffect(Guid, Guid)",
                "Parameters": [
                  "7d150000-0000-0000-0000-000000000000",
                  "00000000-0000-0000-0000-000000000000"
                ]
              },
              "Not": false,
              "Operator": 0
            }
          ]
        },
        {
          "$type": "OEIFormats.FlowCharts.ConditionalExpression, OEIFormats",
          "Operator": 0,
          "Components": [
            {
              "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
              "Data": {
                "FullName": "Boolean HasStatusEffect(Guid, Guid)",
                "Parameters": [
                  "7d150000-0000-0000-0000-000000000000",
                  "00000000-0000-0000-0000-000000000000"
                ]
              },
              "Not": false,
              "Operator": 1
            },
            {
              "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
              "Data": {
                "FullName": "Boolean HasStatusEffect(Guid, Guid)",
                "Parameters": [
                  "7d150000-0000-0000-0000-000000000000",
                  "00000000-0000-0000-0000-000000000000"
                ]
              },
              "Not": false,
              "Operator": 0
            }
          ]
        }
      ]
    }
  },
  "DeactivationPrerequisites": {
    "Conditional": {
      "Operator": 0,
      "Components": [
        {
          "$type": "OEIFormats.FlowCharts.ConditionalExpression, OEIFormats",
          "Operator": 1,
          "Components": [
            {
              "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
              "Data": {
                "FullName": "Boolean HasStatusEffect(Guid, Guid)",
                "Parameters": [
                  "7d150000-0000-0000-0000-000000000000",
                  "00000000-0000-0000-0000-000000000000"
                ]
              },
              "Not": true,
              "Operator": 0
            },
            {
              "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
              "Data": {
                "FullName": "Boolean HasStatusEffect(Guid, Guid)",
                "Parameters": [
                  "7d150000-0000-0000-0000-000000000000",
                  "00000000-0000-0000-0000-000000000000"
                ]
              },
              "Not": true,
              "Operator": 0
            }
          ]
        },
        {
          "$type": "OEIFormats.FlowCharts.ConditionalExpression, OEIFormats",
          "Operator": 0,
          "Components": [
            {
              "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
              "Data": {
                "FullName": "Boolean HasStatusEffect(Guid, Guid)",
                "Parameters": [
                  "7d150000-0000-0000-0000-000000000000",
                  "00000000-0000-0000-0000-000000000000"
                ]
              },
              "Not": true,
              "Operator": 0
            },
            {
              "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
              "Data": {
                "FullName": "Boolean HasStatusEffect(Guid, Guid)",
                "Parameters": [
                  "7d150000-0000-0000-0000-000000000000",
                  "00000000-0000-0000-0000-000000000000"
                ]
              },
              "Not": true,
              "Operator": 0
            }
          ]
        }
      ]
    }
  }
}

 

 

Edited by Noqn
  • Thanks 1
Link to comment
Share on other sites

3 hours ago, Testlum said:

Looking at the statuseffect.gamedatabundle, there is actually a status called AFF_Prone. Can you use it as a prerequisite on the target enemy for your bonus Accuracy to activate?

I have tried that.

And the trinket tooltip correctly reads something like: "+13 Accuracy vs enemies affected by Prone". But there is still no bonus in combat log.

Have tested with fighter's Knockdown, Call to Slumber, Amplified Wave and Amplified Wave (with added Prone keyword).

 
Spoiler
[
  {
    "$type": "Game.GameData.KeywordGameData, Assembly-CSharp",    <-- creating Prone keyword
    "DebugName": "ProneOrKnockedDown",
    "ID": "54119cfb-fe2b-4644-8bb8-38b8cd59b935",
    "Components": [
      {
        "$type": "Game.GameData.KeywordComponent, Assembly-CSharp",
        "GuiDisplayString": 1121,
        "AbilitiesDisplayString": 5174,
        "Description": -1,
        "OverridePluralEffect": -1,
        "Icon": "",
        "TintableIcon": ""
      }
    ]
  },
  {
    "$type": "Game.GameData.AfflictionGameData, Assembly-CSharp",
    "DebugName": "AFF_Prone",
    "ID": "6ee08f75-8219-4d13-b6b1-b87289ad2a38",
    "Components": [
      {
        "$type": "Game.GameData.AfflictionComponent, Assembly-CSharp",
        "DisplayName": 5174,
        "Icon": "gui/icons/keywords/ico_status_prone.png",
        "AfflictionTypeID": "00000000-0000-0000-0000-000000000000",
        "IsThinUI": "true"
      },
      {
        "$type": "Game.GameData.StatusEffectComponent, Assembly-CSharp",
        "KeywordsIDs": ["54119cfb-fe2b-4644-8bb8-38b8cd59b935"]              <-- adding Prone keyword to AFF_Prone
      }
    ]
  },
  {
    "$type": "Game.GameData.StatusEffectGameData, Assembly-CSharp",     <-- my custom status effect
    "DebugName": "Trample_SE_Bonus",
    "ID": "8a6c7d3f-f8f9-4caf-8887-84b627c5132a",
    "Components": [
      {
        "$type": "Game.GameData.StatusEffectComponent, Assembly-CSharp",
        "StatusEffectType": "AllAccuracy",
        "OverrideDescriptionString": -1,
        "OverrideDescriptionStringTactical": -1,
        "UseStatusEffectValueAs": "None",
        "BaseValue": 13,
        "DynamicValue": {
          "Stat": "None",
          "SkillDataID": "00000000-0000-0000-0000-000000000000",
          "ClassID": "00000000-0000-0000-0000-000000000000",
          "MultiplyBy": 1,
          "Operator": "Add"
        },
        "KeywordsIDs": [],
        "DurationType": "Infinite",
        "Duration": 1,
        "MaxStackQuantity": 0,
        "ApplicationBehavior": "UseLongerDurationIfAlreadyApplied",
        "ApplicationType": "ApplyOnStart",
        "IntervalRateID": "00000000-0000-0000-0000-000000000000",
        "StackedChildrenApplyEffects": "false",
        "InclusionConditions": {
          "Operator": 0,
          "Components": []
        },
        "ApplicationPrerequisites": {
          "Conditional": {
            "Operator": 0,
            "Components": []
          }
        },
        "TriggerAdjustment": {
          "TriggerOnEvent": "None",
          "TriggerOffEvent": "None",
          "ValidateWithAttackFilter": "false",
          "ParamValue": 0,
          "ValueAdjustment": 0,
          "DurationAdjustment": 0,
          "ResetTriggerOnEffectTimeout": "false",
          "MaxTriggerCount": 0,
          "IgnoreMaxTriggerCount": "false",
          "RemoveEffectAtMax": "false",
          "ChanceToTrigger": 1
        },
        "PowerLevelScaling": {
          "UseCharacterLevel": "false",
          "BaseLevel": 0,
          "LevelIncrement": 1,
          "MaxLevel": 0,
          "ValueAdjustment": 0,
          "DurationAdjustment": 0
        },
        "IsHostile": "false",
        "ClearOnCombatEnd": "false",
        "ClearOnRest": "false",
        "ClearOnFoodRest": "false",
        "ClearWhenAttacks": "false",
        "ClearOnDeath": "false",
        "HideFromCombatTooltip": "false",
        "HideFromCombatLog": "false",
        "HideFromUI": "false",
        "HideIfNoValue": "false",
        "VisualEffects": [],
        "MaterialReplacementID": "00000000-0000-0000-0000-000000000000",
        "AttackFilter": {
          "KeywordsIDs": [],
          "KeywordLogic": "Or",
          "Race": "None",
          "IsKith": "false",
          "HealthPercentage": 0,
          "HealthOperator": "EqualTo",
          "Range": "None",
          "ClassTypeID": "00000000-0000-0000-0000-000000000000",
          "Source": "None",
          "DefendedBy": "None",
          "Empowered": "false",
          "Disengagement": "false",
          "Stealthed": "false",
          "UseStealthLinger": "false",
          "PowerLevel": 0,
          "PowerLevelOperator": "EqualTo",
          "ChanceToApply": 1,
          "AttackHostility": "Default",
          "TargetType": "None"
        },
        "AttackTargetFilter": {
          "KeywordsIDs": ["54119cfb-fe2b-4644-8bb8-38b8cd59b935"],      <-- setting here the Prone keyword
          "KeywordLogic": "Or",
          "Race": "None",
          "IsKith": "false",
          "HealthPercentage": 0,
          "HealthOperator": "EqualTo",
          "Distance": 0,
          "DistanceOperator": "EqualTo",
          "HasDOT": "false",
          "IsMarked": "false",
          "TargetHostility": "Default"
        },
        "ExtraValue": 0,
        "OverridePenetration": 0,
        "DamageTypeValue": "All",
        "KeywordValueID": "00000000-0000-0000-0000-000000000000",
        "RaceValue": "None",
        "StatusEffectTypeValue": "None",
        "ItemValueID": "00000000-0000-0000-0000-000000000000",
        "AfflictionTypeValueID": "00000000-0000-0000-0000-000000000000",
        "StatusEffectsValueIDs": [],
        "AttackValueID": "00000000-0000-0000-0000-000000000000",
        "AttackOverrideValue": "None",
        "EventValue": "OnApply",
        "ClassValueID": "00000000-0000-0000-0000-000000000000",
        "WeaponTypeValue": "None",
        "AttackHitType": "None",
        "SkillValueID": "00000000-0000-0000-0000-000000000000",
        "AudioEventListID": "00000000-0000-0000-0000-000000000000",
        "BedRestDaysMinimum": 0,
        "BedRestDaysMaximum": 0
      }
    ]
  }
]

 


 

Link to comment
Share on other sites

2 hours ago, Noqn said:

Just to confirm, you want the following logic? [...]

Yeap)

2 hours ago, Noqn said:

This is equivalent to this: [...]

That's exactly what I needed! Thanks Noqn! 😊

 

I was looking at basic conditional:

Spoiler
"ActivationPrerequisites": {
            "Conditional": {
              "Operator": 0,
              "Components": [
                {
                  "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
                  "Data": {
                    "FullName": "Boolean HasStatusEffec(Guid, Guid)",
                    "Parameters": [
                      "7d150000-0000-0000-0000-000000000000",
                      "64fd55f4-fe6c-4b0b-9d93-dd51f3fe1620"
                    ],
                    "Flags": "",
                    "UnrealCall": "",
                    "FunctionHash": 0,
                    "ParameterHash": 0
                  },
                  "Not": false,
                  "Operator": 0
                }
              ]
            }
          }

And thinking: how do I put nested components here??

OEIFormats.FlowCharts.ConditionalExpression is the answer I was looking for.

 
Edited by MaxQuest
Link to comment
Share on other sites

I implemented two types of spells similar to your concept of channeling.  Inquisition in my priest mod lasts 10 seconds and disables you for the duration.  I also have a Charging thread here recently where boots activate a modal that is canceled when another ability is used.  It's not exactly what you want but the Charging effect could be reworked to do exactwhat you want.

  • Thanks 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...