Skip to content

Projectile Configs

Overview

Projectile config files define how a weapon launches a projectile: the model used, physics parameters, spawn position, and what happens when the projectile hits, misses, or bounces. They act as the bridge between a weapon’s attack action and the runtime projectile entity. Configs support inheritance via a Parent field, allowing shared base configs to be overridden per-weapon.

File Location

Assets/Server/ProjectileConfigs/
Weapons/
Arrows/
Bows/
Crossbow/
Shortbow/
Staff/
Throwables/
...
NPCs/
_Debug/

Schema

FieldTypeRequiredDefaultDescription
ParentstringNoID of another projectile config to inherit fields from. Child fields override parent fields.
ModelstringNoVisual model ID used for the projectile (e.g. "Arrow_Crude", "Ice_Ball").
PhysicsPhysicsConfigNoPhysics simulation parameters. See below.
LaunchForcenumberNoScalar force applied at launch, scaled by charge level where applicable.
LaunchLocalSoundEventIdstringNoSound event played locally for the shooter on launch.
LaunchWorldSoundEventIdstringNoSound event played in the world (audible to nearby players) on launch.
SpawnOffsetVector3NoLocal-space offset (X/Y/Z) from the weapon’s origin where the projectile spawns.
SpawnRotationOffsetRotationOffsetNoAdditional rotation applied to the projectile at spawn.
InteractionsInteractionMapNoNamed interaction events and their chained action lists. See below.

PhysicsConfig

FieldTypeRequiredDefaultDescription
Type"Standard"No"Standard"Physics simulation model. Currently only "Standard" is used.
GravitynumberNoGravitational acceleration applied per second.
TerminalVelocityAirnumberNoMaximum speed in air.
TerminalVelocityWaternumberNoMaximum speed in water.
RotationMode"VelocityDamped" | "Fixed"NoControls how the projectile’s orientation tracks its velocity vector.
BouncinessnumberNo0Fraction of speed retained after a surface bounce.
BounceCountnumberNoNumber of times the projectile can bounce before stopping.
BounceLimitnumberNoMaximum number of bounces allowed.
AllowRollingbooleanNofalseWhether the projectile can roll along surfaces after bouncing.
SticksVerticallybooleanNofalseWhether the projectile embeds vertically in surfaces on impact.

Vector3

FieldTypeRequiredDefaultDescription
XnumberYesLateral offset.
YnumberYesVertical offset.
ZnumberYesForward offset.

RotationOffset

FieldTypeRequiredDefaultDescription
PitchnumberNo0Pitch offset in degrees.
YawnumberNo0Yaw offset in degrees.
RollnumberNo0Roll offset in degrees.

InteractionMap

The Interactions object maps event names to InteractionHandler objects. Supported event keys:

KeyWhen it fires
ProjectileSpawnImmediately when the projectile is created.
ProjectileHitWhen the projectile hits an entity.
ProjectileMissWhen the projectile hits terrain or expires.
ProjectileBounceWhen the projectile bounces off a surface.

InteractionHandler

FieldTypeRequiredDefaultDescription
CooldownobjectNoOptional cooldown gating on this handler.
Interactionsstring[] | object[]YesOrdered list of named interaction IDs or inline interaction definitions to execute.

Examples

Base arrow config (Assets/Server/ProjectileConfigs/Weapons/Arrows/Projectile_Config_Arrow_Base.json):

{
"Model": "Arrow_Crude",
"SpawnRotationOffset": {
"Pitch": 2,
"Yaw": 0.25,
"Roll": 0
},
"Physics": {
"Type": "Standard",
"Gravity": 15,
"TerminalVelocityAir": 50,
"TerminalVelocityWater": 15,
"RotationMode": "VelocityDamped",
"Bounciness": 0.0,
"SticksVertically": true
},
"LaunchForce": 30,
"SpawnOffset": {
"X": 0.15,
"Y": -0.25,
"Z": 0
}
}

Two-handed bow arrow (Projectile_Config_Arrow_Two_Handed_Bow.json) — inherits from base and adds interactions:

{
"Parent": "Projectile_Config_Arrow_Base",
"LaunchLocalSoundEventId": "SFX_Bow_T2_Shoot",
"LaunchWorldSoundEventId": "SFX_Bow_T2_Shoot",
"LaunchForce": 5,
"Interactions": {
"ProjectileHit": {
"Interactions": [
"Bow_Two_Handed_Projectile_Damage",
"Bow_Two_Handed_Projectile_Damage_End"
]
},
"ProjectileMiss": {
"Interactions": [
"Bow_Two_Handed_Projectile_Miss",
"Bow_Two_Handed_Projectile_Miss_End"
]
}
}
}

Ice ball staff config (Assets/Server/ProjectileConfigs/Weapons/Staff/Ice/Projectile_Config_Ice_Ball.json):

{
"Model": "Ice_Ball",
"LaunchForce": 30,
"Physics": {
"Type": "Standard",
"Gravity": 4.4,
"TerminalVelocityAir": 42.5,
"TerminalVelocityWater": 15,
"RotationMode": "VelocityDamped",
"Bounciness": 0.0,
"SticksVertically": true
},
"LaunchWorldSoundEventId": "SFX_Staff_Ice_Shoot",
"Interactions": {
"ProjectileHit": {
"Interactions": [
{
"Parent": "DamageEntityParent",
"DamageCalculator": {
"Class": "Charged",
"BaseDamage": { "Ice": 20 }
},
"DamageEffects": {
"Knockback": {
"Type": "Force",
"Force": 20,
"VelocityType": "Set"
},
"WorldParticles": [
{ "SystemId": "Impact_Ice" },
{ "SystemId": "IceBall_Explosion" }
],
"WorldSoundEventId": "SFX_Ice_Ball_Death"
}
},
{ "Type": "RemoveEntity", "Entity": "User" }
]
},
"ProjectileMiss": {
"Interactions": [
{
"Type": "Simple",
"Effects": {
"WorldSoundEventId": "SFX_Ice_Ball_Death",
"WorldParticles": [
{ "SystemId": "IceBall_Explosion" }
]
}
},
{ "Type": "RemoveEntity", "Entity": "User" }
]
}
}
}