Skip to content

Adding Particles

Particle effects use a two-file system: ParticleSystem (.particlesystem) defines the overall effect by referencing one or more ParticleSpawner (.particlespawner) assets that control individual particle behavior.

Pack location: Server/Particles/
Base game reference: Assets.zip/Server/Particles/

Server/Particles/
├── My_Effect.particlesystem # groups spawners into an effect
├── My_Smoke.particlespawner # defines how particles look and move
└── textures/
└── smoke.png # particle texture

The top-level asset that groups spawners into a complete effect.

{
"Spawners": [
{
"SpawnerId": "MyMod/Smoke_Spawner",
"PositionOffset": { "x": 0, "y": 0.5, "z": 0 },
"RotationOffset": { "yaw": 0, "pitch": 0, "roll": 0 },
"StartDelay": 0.0,
"TotalSpawners": 1,
"MaxConcurrent": 0
}
],
"LifeSpan": 3.0,
"CullDistance": 100.0,
"BoundingRadius": 2.0,
"IsImportant": false
}
FieldTypeDefaultDescription
SpawnersarrayArray of spawner group references
LifeSpanfloatTotal system lifetime (seconds)
CullDistancefloat100.0Distance beyond which the effect is culled
BoundingRadiusfloat2.0Bounding sphere radius for culling
IsImportantbooleanfalsePrevents culling when true

Each entry in Spawners references a ParticleSpawner and adds positioning:

FieldTypeDefaultDescription
SpawnerIdstringParticleSpawner asset ID
PositionOffsetVector30, 0, 0Position offset from system origin
RotationOffsetVector30, 0, 0Rotation offset (yaw, pitch, roll)
FixedRotationbooleanfalseIgnore system rotation
StartDelayfloat0.0Delay before this spawner starts (seconds)
TotalSpawnersint1Number of spawner instances
MaxConcurrentint0Max concurrent instances (0 = unlimited)

A single system can use multiple spawners for layered effects:

{
"Spawners": [
{
"SpawnerId": "MyMod/Fire_Core",
"TotalSpawners": 1
},
{
"SpawnerId": "MyMod/Fire_Sparks",
"PositionOffset": { "x": 0, "y": 0.3, "z": 0 },
"StartDelay": 0.1,
"TotalSpawners": 3
},
{
"SpawnerId": "MyMod/Fire_Smoke",
"PositionOffset": { "x": 0, "y": 1.0, "z": 0 },
"StartDelay": 0.5
}
],
"LifeSpan": 5.0
}

Controls how individual particles look, move, and behave.

{
"Shape": "Sphere",
"EmitOffset": {
"Min": { "x": -0.5, "y": 0, "z": -0.5 },
"Max": { "x": 0.5, "y": 0, "z": 0.5 }
},
"TotalParticles": { "min": 10, "max": 20 },
"SpawnRate": { "min": 5.0, "max": 10.0 },
"SpawnBurst": false,
"LifeSpan": 3.0,
"ParticleLifeSpan": { "min": 1.0, "max": 2.0 },
"MaxConcurrentParticles": 50
}
FieldTypeDescription
ShapeenumEmit shape: Sphere or Cube
EmitOffsetRangeVector3Random spawn offset range
UseEmitDirectionbooleanEmit in the direction of the emit offset
TotalParticlesRangeMin/max total particles to emit
SpawnRateRangefParticles per second
SpawnBurstbooleanEmit all particles at once
LifeSpanfloatSpawner lifetime (seconds)
ParticleLifeSpanRangefIndividual particle lifetime (seconds)
MaxConcurrentParticlesintMax alive particles at once
{
"InitialVelocity": {
"Min": { "x": -1, "y": 2, "z": -1 },
"Max": { "x": 1, "y": 5, "z": 1 }
},
"VelocityStretchMultiplier": 0.5
}
FieldTypeDescription
RenderModeenumBlendLinear, BlendAdd, Erosion, Distortion
ParticleRotationInfluenceenumNone, Billboard, BillboardY, BillboardVelocity, Velocity
ParticleRotateWithSpawnerbooleanRotate particles with the spawner
LightInfluencefloatHow much world lighting affects particles (0-1)
VelocityStretchMultiplierfloatStretches particles along velocity
CameraOffsetfloatOffset toward camera (prevents z-fighting)
{
"ParticleCollision": {
"BlockType": "Solid",
"Action": "Expire",
"ParticleRotationInfluence": "None"
}
}
FieldValuesDescription
BlockTypeNone, Air, Solid, AllWhat blocks trigger collision
ActionExpire, LastFrame, LingerWhat happens on collision
ParticleRotationInfluenceNone, Billboard, etc.Rotation after collision

Pull or push particles toward a point:

{
"Attractors": [
{
"Position": { "x": 0, "y": 2, "z": 0 },
"Radius": 3.0,
"RadialAcceleration": 5.0,
"Damping": 0.1
}
]
}

Each spawner contains a Particle definition for the visual appearance:

{
"Particle": {
"Texture": "Particles/textures/smoke.png",
"FrameSize": { "width": 64, "height": 64 },
"SoftParticles": "Enable",
"SoftParticlesFadeFactor": 1.0,
"ScaleRatioConstraint": "OneToOne",
"Animation": {
"0": {
"Scale": {
"Min": { "x": 0.5, "y": 0.5 },
"Max": { "x": 1.0, "y": 1.0 }
},
"Color": { "red": 255, "green": 200, "blue": 100 },
"Opacity": 1.0
},
"50": {
"Scale": {
"Min": { "x": 1.5, "y": 1.5 },
"Max": { "x": 2.0, "y": 2.0 }
},
"Opacity": 0.5
},
"100": {
"Opacity": 0.0
}
}
}
}

Animation keyframes are keyed by percentage (0-100) of the particle’s lifetime. Each keyframe can set:

FieldTypeDescription
FrameIndexRangeTexture frame index (for sprite sheets)
ScaleRangeVector2Particle size
RotationRangeVector3Particle rotation
ColorRGBParticle color
OpacityfloatParticle opacity (0.0-1.0)
Particle PropertyValuesDescription
SoftParticlesEnable, Disable, RequireSoft edge rendering against geometry
ScaleRatioConstraintOneToOne, Preserved, NoneScale aspect ratio lock
UVOptionNone, RandomFlipU, RandomFlipV, RandomFlipUV, FlipU, FlipV, FlipUVUV randomization
UseSpriteBlendingbooleanBlend between sprite frames

Map block events to particle system IDs. Each block type can reference a BlockParticleSet.

Pack location: Server/Item/Block/Particles/

{
"Color": { "red": 200, "green": 180, "blue": 140 },
"Scale": 1.0,
"PositionOffset": { "x": 0, "y": 0, "z": 0 },
"RotationOffset": { "yaw": 0, "pitch": 0, "roll": 0 },
"Particles": {
"Walk": "Hytale/Dirt_Walk",
"Run": "Hytale/Dirt_Run",
"Sprint": "Hytale/Dirt_Sprint",
"SoftLand": "Hytale/Dirt_SoftLand",
"HardLand": "Hytale/Dirt_HardLand",
"MoveOut": "Hytale/Dirt_MoveOut",
"Hit": "Hytale/Dirt_Hit",
"Break": "Hytale/Dirt_Break",
"Build": "Hytale/Dirt_Build",
"Physics": "Hytale/Dirt_Physics"
}
}

Block particle events:

EventWhen it plays
WalkPlayer walks on the block
RunPlayer runs on the block
SprintPlayer sprints on the block
SoftLandPlayer lands softly on the block
HardLandPlayer lands hard on the block
MoveOutEntity leaves the block’s space
HitBlock is hit (mining)
BreakBlock is broken
BuildBlock is placed
PhysicsBlock physics event

Particles attached to entity models. Defined in model configs and follow the entity’s skeleton:

{
"SystemId": "MyMod/Aura_Effect",
"TargetEntityPart": "Self",
"TargetNodeName": "chest",
"Color": { "red": 200, "green": 255, "blue": 200 },
"Scale": 1.0,
"PositionOffset": { "x": 0, "y": 0, "z": 0 },
"RotationOffset": { "yaw": 0, "pitch": 0, "roll": 0 },
"DetachedFromModel": false
}
FieldTypeDescription
SystemIdstringParticleSystem asset ID
TargetEntityPartenumSelf, Entity, PrimaryItem, SecondaryItem
TargetNodeNamestringSkeleton bone/node to attach to
DetachedFromModelbooleanIf true, spawns at position but doesn’t follow

A reusable config object that bundles a particle system ID with overrides. Used in GameplayConfig for spawn effects, damage effects, and gathering effects.

{
"SystemId": "MyMod/Spawn_Effect",
"Color": { "red": 255, "green": 200, "blue": 100 },
"Scale": 1.5,
"PositionOffset": { "x": 0, "y": 0.5, "z": 0 },
"RotationOffset": { "yaw": 0, "pitch": 0, "roll": 0 }
}

See Spawning config for FirstSpawnParticles and SpawnParticles.

{
"DeathParticles": { "SystemId": "MyMod/Impact_Fire" }
}
{
"Effects": {
"ParticleSystemId": "MyMod/Slash_Effect"
}
}
{
"Type": "SpawnParticles",
"ParticleSystem": "MyMod/NPC_Spawn_Effect",
"Range": 75.0,
"Offset": { "x": 0, "y": 1, "z": 0 }
}
WhatYour PackBase Game Reference
Particle systems (.particlesystem)Server/Particles/Assets.zip/Server/Particles/
Particle spawners (.particlespawner)Server/Particles/Assets.zip/Server/Particles/
Particle texturesServer/Particles/textures/Assets.zip/Server/Particles/textures/
Block particle setsServer/Item/Block/Particles/Assets.zip/Server/Item/Block/Particles/