Skip to content

VfxSystemDefinitionData

Inheritance 1 ancestor · 3 siblings

Class Documentation

Edit documentation

The definition of one particle system: three lists of emitters plus settings for the system as a whole (culling, audio, HUD placement, a point light and a set of behaviour flags). One definition is shared by every instance spawned from it.

Emitter lists

List What its emitters are
complexEmitterDefinitionData Full particle simulation. Reads almost every emitter property.
simpleEmitterDefinitionData A lightweight path that reads a small subset of the emitter properties plus the emitter's LegacySimple block.
ShimmerEmitterDefinitionData Emitters that take emission, lifetime, physics, rendering and geometry from a component graph.

The lists also differ in which spawn gates apply, see VfxEmitterDefinitionData.

Life of an instance

  1. Prepare, once per definition. The emitters are turned into prepared descriptors and their textures and meshes are loaded. assetRemappingTable is applied here, and the texture group 0x9836cd87 is active for these loads.
  2. Spawn. Each emitter goes through its gates and the survivors are instantiated. The point light is created, the material overrides are handed to the attached object and selfIllumination is pushed.
  3. Update. The instance takes position, velocity, orientation and scale from its attachment, tests its cull box, and simulates.
  4. Simulation runs in fixed steps: 30 per second on High and Very High EffectsQuality, 20 on Medium, 15 on Low and Very Low. Within a step the component emitters update first, then the complex emitters, then the simple ones, then the point light. flags bits 0x8 and 0x40 change the stepping.
  5. End. The system is finished when every emitter of every list reports finished, or when it is stopped. A soft stop lets each emitter finish by its linger rules, a hard stop ends the system at once.

Visibility

The cull box comes from visibilityRadius. A hidden system that may not simulate off screen (flags bit 0x1 clear) is not paused. Its emitters are reset when it hides: particles are cleared and child effects released. If it stays hidden until its duration has elapsed, it is finished for good. The duration is the longest duration among its instantiated emitters. Teamfight Tactics turns off-screen simulation off for every system.

HUD layer

A system with drawingLayer 1 is drawn through its own orthographic projection instead of the scene camera. See drawingLayer, hudLayerDimension, HudLayerAspect and hudAnchorPositionFromWorldProjection.

Legacy troybin

The client still carries a loader for .troy files. It runs when an effect is requested by a name ending in .troy and no definition object was found, and it fills this same object from the file. Properties without a troybin key keep their defaults. Whether any shipped content still reaches this loader is not established.

Properties

0x9836cd87

U8 = 5
14.15
Edit documentation

Id of the texture group that is active while this system's textures and meshes load. A texture remembers its group, and when the quality setting behind a group changes, that group's loaded textures are reloaded.

Id Driven by
1 CharacterQuality
2, 5 EffectsQuality
3, 4 EnvironmentQuality
0, 6, 7 no setting

The property's name is not yet known.

ClockToUse

U8 = 0
Edit documentation

An enum: 0 auto, 1 game, 2 system. No code that reads the value was found, so what each setting changes is not established.

DynamicParameterData

Pointer<VfxDynamicParametersData> = null
14.18
Edit documentation

Optional event-keyed override table, see VfxDynamicParametersData. When one of its events fires, named emitters of this instance have single parameters (scale, UV scale, emission rate, particle lifetime, birth velocity) replaced by a computed value, at once or eased in over a duration.

EffectorDefinition

Pointer<VfxEffectorDefinition> = null
Removed in 16.21 16.16
Edit documentation

Optional environment effector, see VfxEffectorDefinition. The instance creates a handle for it when it spawns and marks the handle when it stops, but nothing in the client collects those handles, so the property has no effect.

HudLayerAspect

F32 = 1.3333333730697632
Edit documentation

Width divided by height of the HUD canvas, see hudLayerDimension. Replaced together with it under flags bit 0x200.

PointLight

Pointer<ParticlePointLightInfo> = null
14.13
Edit documentation

Optional point light that belongs to the system, described by a ParticlePointLightInfo. It is created together with the emitters and updated on every simulation step, after the emitters, from the system's age and at the system's world position. It does not depend on any emitter or particle.

The light is drawn only on a map that has a MapDynamicLighting component.

ShimmerEmitterDefinitionData

List<VfxShimmerEmitterDefinitionData> = []
16.16
Edit documentation

The system's component emitters, see VfxShimmerEmitterDefinitionData. Emitters in this list carry only a few gates of their own and take emission, lifetime, physics, rendering and geometry from a component graph. An entry whose graph does not supply lifetime, physics, rendering and geometry is dropped while the system is prepared.

assetCategory

String = "fx"
Removed in 14.15
Edit documentation

Removed from current builds. A bin that still carries it has the value dropped.

assetRemappingTable

List<VfxAssetRemap> = []
Edit documentation

List of asset substitutions. Whenever one of the system's emitters names an asset path (a texture, mesh, skeleton or animation), the list is walked in order. The first entry whose oldAsset matches the path and whose condition holds wins, and its newAsset is loaded instead.

type Entry applies
0 while team-relative colours are active
1 while the colourblind palette is active
other always

When one of those states changes, every system definition is prepared again, so new instances pick up the change.

audioParameterFlexID

I32 = -1
Edit documentation

Index of one of the instance's three flex values (0, 1 or 2, see Flex values on VfxEmitterDefinitionData). While the persistent sound plays, the client sends that flex value to it every update as the audio parameter VFX_RTPC, clamped to 0..1. -1 turns the feature off. Any other index, or a flex value nobody supplied, sends 0.

audioParameterTimeScaledDuration

F32 = 0
Edit documentation

Ramp time, in seconds, for the VFX_RTPC parameter of audioParameterFlexID. At 0 or below the parameter is the flex value. Above 0 it is flex · elapsed / duration, clamped to 0..1. elapsed is counted from a time the sound reports, presumably its start.

buildUpTime

F32 = 0
Edit documentation

Seconds of simulation added to the system's clock when it becomes visible, so a long-running effect appears already built up. The extra time is simulated on the next update in a limited number of steps, so a long build-up is simulated coarsely.

It is always applied the first time the system becomes visible. It is applied again on later appearances only when the system does not simulate off screen (flags bit 0x1 clear), which is the case where hiding reset its emitters.

complexEmitterDefinitionData

List<VfxEmitterDefinitionData> = []
Edit documentation

The system's complex emitters: the full particle path. Every spawn gate applies to them (disabled, importance, ChanceToNotExist, colorblindVisibility, Filtering).

drawingLayer

U8 = 0
Edit documentation

0 is the world layer. 1 puts the system on the HUD layer:

  • It is drawn with its own orthographic projection, sized by hudLayerDimension and HudLayerAspect, instead of the scene camera.
  • Every emitter in simpleEmitterDefinitionData is dropped.
  • transform is not multiplied into the particles. Only its translation is used, for placement.
  • Its emitters draw in the HUD render phase and never take fog of war darkening.
  • Frustum culling is skipped only when hudAnchorPositionFromWorldProjection is false.

Values other than 0 and 1 are not established.

flags

U16 = 212
Edit documentation

Bitfield of system behaviour flags. The client uses the serialized value as it is and never changes the definition's bits at run time.

Bit Name Effect
0x0001 SimulateWhileOffScreen Keep simulating while hidden. Without it a hidden system is reset and can finish while hidden, see Visibility above.
0x0002 PersistThruDeath Without it, the death of the attached object marks the instance. A marked instance removes its material overrides from that object instead of applying them.
0x0004 PersistThruRevive The same mark for the attached object respawning.
0x0008 SimulateOncePerFrame One simulation step per update covering all the pending time, instead of fixed-rate steps.
0x0010 SoundsEndOnEmitterEnd Stopping the system also stops its persistent sound and voice-over.
0x0020 SoundsPlayWhileOffScreen Persistent audio keeps playing while the system is hidden, and can start before the system was ever visible.
0x0040 SimulateEveryFrame When the fixed-rate stepping would run no step in an update, run one step covering the pending time.
0x0080 KeepOrientationAfterSpellCast No reader of this bit was found.
0x0100 UseCalculusForPhysics Analytic drag for the complex emitters: a particle is not integrated but eased in closed form toward the fixed offset birthVelocity / birthDrag, see birthDrag.
0x0200 HudLayerSizeFromUiElement HUD layer: take the canvas size from the pixel size supplied by the hosting UI element instead of hudLayerDimension and HudLayerAspect, when both supplied values are non-zero.
0x0400 AlphaFromAttachment Every update, read the system's alpha multiplier from its attachment. The multiplier scales the final alpha of every complex emitter particle. A plain object attachment returns 1.
0x0800 AggressiveImportanceCulling Low-spec cull: on Low and Very Low EffectsQuality, and only while a server-controlled switch is on, complex and component emitters with importance 2 or lower are not instantiated.

hudAnchorPositionFromWorldProjection

Bool = true
Edit documentation

Chooses how a HUD-layer system (drawingLayer 1) is placed.

  • true: the system's world position is projected to the screen with the scene camera and that screen point is its anchor on the HUD canvas. The system keeps a world position, so it is frustum culled like a world system.
  • false: the anchor is the centre of a screen rectangle supplied by the hosting UI element, and the canvas is scaled by that element. The system is never frustum culled.

hudLayerDimension

F32 = 1024
Edit documentation

Width of the HUD canvas, in particle units, for a system with drawingLayer 1. The canvas height is hudLayerDimension / HudLayerAspect and always spans the full viewport height. The visible width follows the real screen aspect.

mEyeCandy

Bool = false
Edit documentation

Marks the system as eye candy. The game object that owns the instance joins the EyeCandy visibility group, and the HideEyeCandy game option hides that whole group.

mIsPoseAfterimage

Bool = false
Edit documentation

Detaches the instance from its attachment right after it is created. The update no longer takes position, velocity, orientation or scale from the attachment, so the system stays where it was spawned instead of following its owner.

materialOverrideDefinitions

List<VfxMaterialOverrideDefinitionData> = []
Edit documentation

Material overrides for the object the system is attached to, not for the system's own particles. When the instance spawns, one override is created per entry: first the entries of this list, then those of each instantiated complex emitter, then of each instantiated simple emitter. Every update, while the system is running and attached, each override is applied to the attached object.

Entries of this list do not depend on any emitter surviving its spawn gates.

objectPath

Hash = "0x0"
16.16
Edit documentation

Hash of the path of the bin entry that holds this system. The client passes it as the lookup scope when this system resolves another effect by name: the child effects named by its emitters' childParticleSetDefinition, and effects created by reference from this system. How the scope narrows the lookup is not established.

overrideScaleCap

Option<F32> = null
Edit documentation

Cap on the bound object's size that the system's emitters scale by through their FlexShapeDefinition. A size up to 200 passes unchanged. Between 200 and 500 it is remapped linearly onto the range from 200 to the cap, and a size of 500 or more becomes the cap. Unset means a cap of 250. Zero or a negative value turns the cap off.

particleName

String = ""
Edit documentation

The system's short name. When an instance is created, the string is copied into the name of the game object that owns it. It is not a lookup key.

particlePath

String = ""
Edit documentation

The system's content path as authored. No use of the value by the client was found: systems are referenced through resource resolver keys and object links, not through this string.

scaleDynamicallyWithAttachedBone

Bool = false
Edit documentation

Every update, while the system is attached to a bone of an object that has a skeleton, the bone's current scale replaces the attachment's own scale as a factor of the system scale. The scale is a single number, so it is uniform. Every emitter multiplies its particle sizes by the system scale.

selfIllumination

F32 = -1
Edit documentation

A self-illumination value for the object the system is attached to, held for as long as the system lives. It is not applied to the system's own particles. A negative value pushes nothing.

If several systems push a value onto the same object, the most recent one is used. When that system is removed the object falls back to the previous one, or to no value when none is left.

simpleEmitterDefinitionData

List<VfxEmitterDefinitionData> = []
Edit documentation

The system's simple emitters, a lightweight path. It differs from the complex list in three ways a definition can run into:

  • ChanceToNotExist and colorblindVisibility are not checked, and the low-spec cull of flags bit 0x800 does not touch them.
  • Every simple emitter is dropped when drawingLayer is 1.
  • Most emitter properties are not read. The emitter page says per property whether the simple path uses it.

soundOnCreateDefault

String = ""
Edit documentation

Audio event played once for a new instance. It is a default: when the system spawns, an instantiated complex or simple emitter whose Audio block names a create sound replaces it for that instance. If several do, the last one instantiated wins.

The event fires on the first update in which the system is visible, and only if the system is younger than 1 second at that moment. A system first seen later than that never plays it.

soundPersistentDefault

String = ""
Edit documentation

Audio event that plays for as long as the instance lives. Like soundOnCreateDefault it is a default that an emitter's Audio block can replace.

It starts when the system becomes visible, follows the system's position, stops when the system is hidden and starts again when it reappears. flags bit 0x20 keeps it playing while hidden and lets it start before the system was ever visible. When the system is stopped, the sound is stopped only if flags bit 0x10 is set.

transform

Mtx44
Default value
[[1, 0, 0, 0],
 [0, 1, 0, 0],
 [0, 0, 1, 0],
 [0, 0, 0, 1]]
Edit documentation

A matrix applied to the whole system.

  • Complex emitters: it is the last factor of every particle's matrix, after the particle's own rotation, position and orbit. Its translation, rotation and scale all take part.
  • Component emitters: its rotation and scale are multiplied into the system matrix they simulate in.
  • HUD layer (drawingLayer 1): it is not multiplied into particles. Only its translation is used, as an offset of the anchor.

visibilityRadius

F32 = 250
Edit documentation

Sets the system's cull box: an axis-aligned cube centred on the system's position with each face visibilityRadius · √½ world units away. The box is rebuilt whenever the position changes and tested against the camera frustum every update. What happens to a system that fails the test is described under Visibility above.

The test is skipped, and the system always counts as visible, when drawingLayer is 1 and hudAnchorPositionFromWorldProjection is false.

voiceOverOnCreateDefault

String = ""
Edit documentation

Voice-over event played once for a new instance, under the same rule as soundOnCreateDefault. Emitters cannot replace it.

voiceOverPersistentDefault

String = ""
Edit documentation

Voice-over counterpart of soundPersistentDefault, with the same start, hide and stop rules. Emitters cannot replace it, and the audio parameter of audioParameterFlexID is not sent to it.

Referenced by 23 classes · 40 properties

Show 3 more