- Works With
Adds dynamic tornado events to your server. Each tornado is a roaming funnel of orbiting rockets that wanders the terrain, periodically detaches a rocket to dive-bomb a target on the ground, and triggers an explosion on impact. Tornadoes can damage players, buildings, and deployables based on configuration.
The plugin can spawn tornadoes automatically on a timer, on demand via console/chat command, or through its API for other plugins. While tornadoes are active, the plugin can optionally force storm weather (rain, fog, wind, thunder, clouds, atmosphere) and reset it when the last tornado ends.
You can control the maximum number of active tornadoes, their duration, travel speed, funnel shape, strike frequency, explosion damage, and weather settings.
Features
- Roaming tornadoes - Funnels wander across the map and track terrain height with smooth vertical movement
- Spiraling rocket funnel - Configurable rings of rockets orbit the tornado in a spinning vortex shape
- Dive-bomb strikes - Rockets detach from the funnel and dive toward the ground, exploding on impact against players, buildings, or deployables
- Configurable damage - Independently toggle damage to players, buildings, and deployables
- Storm weather - Applies stormy weather (rain, fog, wind, thunder, clouds) while tornadoes are active, and resets to dynamic weather after the last one ends
- Custom prefabs - Use any rocket prefab for the orbiting projectiles and any effect prefab for strike explosions
- Manual or automatic spawns - Spawn tornadoes via console command on demand, or let them spawn automatically on a configurable timer
- Bounded roaming - Optionally restrict tornadoes to a roam circle around a fixed center
- Player notifications - In-game toasts announce tornado spawns with grid coordinates
Other Environmental Events
- Volcano -- Adds volcanoes that erupt with lava, ash clouds, and debris. Pairs well with Tornado for servers that want layered environmental disaster events
Permissions
tornado.admin-- Allows use of thetornadoconsole/chat command for spawning, stopping, and weather control
Commands
The tornado command can be used from chat (prefixed with /) or from the server console.tornado help-- Shows command usage informationtornado start [count] [durationSeconds] [wanderRadius] [pos <x> <z> | near <player>]-- Spawns one or more tornadoescount <int>-- Number of tornadoes to spawn. Limited byMaximum Number Of Active TornadoesdurationSeconds <float>-- How long each tornado lasts before dissipating. Defaults toTornado Duration Secondsfrom configwanderRadius <float>-- Optional. Restricts the tornado to roam within this radius of its spawn center. Pass0or omit to disable bounded roamingpos <x> <z>-- Spawn center at the given world X/Z coordinatesnear <player>-- Spawn center at the given player's position. Accepts partial name or Steam ID- Example:
tornado start 2 120 200 pos 100 -50-- Spawns 2 tornadoes lasting 120 seconds, restricted to a 200m radius around world position (100, -50) - Example:
tornado start 1 90 0 near VisEntities-- Spawns 1 tornado lasting 90 seconds near player "John" with no roam limit
tornado stopall-- Stops and removes all active tornadoes. Also resets weather ifReset After Last Tornado Endsis enabledtornado weather on-- Manually applies the configured storm weather without spawning a tornadotornado weather off-- Resets weather to default
When called by a player without arguments or with the position omitted, tornadoes spawn at the player's current location. When called from the server console without position arguments, a random land position is chosen.
Configuration
JSON:
{
"Version": "1.2.0",
"Maximum Number Of Active Tornadoes": 2,
"Tornado Duration Seconds": 90.0,
"Enable Automatic Tornado Spawns": false,
"Time Between Automatic Spawns": 900.0,
"Tornado Travel Speed": 12.0,
"Wander Step Distance": 60.0,
"Terrain Height Lookahead": 8.0,
"Height Follow Smooth Time Seconds": 0.6,
"Maximum Vertical Movement Speed": 10.0,
"Funnel Center Height Above Ground": 5.0,
"Number Of Funnel Rings": 16,
"Spacing Between Rings": 7.0,
"Funnel Throat Radius (bottom)": 1.25,
"Funnel Mouth Radius (top)": 32.0,
"Spiral Offset Between Rings": 12.0,
"Ring Spin Speed": 90.0,
"Orbiting Projectiles Per Ring": 4,
"Orbiting Projectile Speed": 12.0,
"Rocket Vertical Travel Time Seconds": 12.0,
"Strike Search Radius": 90.0,
"Seconds Between Rocket Strikes": 2.0,
"Base Strike Explosion Damage": 500.0,
"Strike Explosion Radius": 4.0,
"Damage Players": false,
"Damage Buildings": true,
"Damage Deployables": true,
"Orbiting Projectile Prefab Path": "assets/prefabs/ammo/rocket/rocket_basic.prefab",
"Strike Explosion FX Prefab": "assets/prefabs/npc/m2bradley/effects/bradley_explosion.prefab",
"Storm Weather": {
"Enabled": true,
"Reset After Last Tornado Ends": true,
"Preset": "Storm",
"Transition Seconds": 1.5,
"Rain": 0.95,
"Fog": 0.75,
"Wind": 0.9,
"Thunder": 0.8,
"Cloud Coverage": 1.0,
"Cloud Opacity": 1.0,
"Cloud Brightness": 0.35,
"Cloud Sharpness": 0.6,
"Cloud Scattering": 0.5,
"Cloud Attenuation": 0.7,
"Cloud Size": 0.8,
"Cloud Coloring": 0.35,
"Atmosphere Rayleigh": 1.0,
"Atmosphere Mie": 1.2,
"Atmosphere Brightness": 0.35,
"Atmosphere Contrast": 1.15,
"Atmosphere Directionality": 0.85,
"Wetness Rain": -1.0,
"Wetness Snow": -1.0
}
}
General Settings
Maximum Number Of Active Tornadoes-- Hard cap on how many tornadoes can exist at the same time. Thetornado startcommand and the auto-spawn timer both respect this limitTornado Duration Seconds-- Default lifetime of each tornado before it begins dissipating. Minimum enforced at runtime is10secondsEnable Automatic Tornado Spawns-- Whentrue, the plugin spawns tornadoes automatically on a timerTime Between Automatic Spawns-- Interval in seconds between automatic spawn attempts. Only used when automatic spawns are enabled
Movement Settings
Tornado Travel Speed-- Horizontal movement speed of the funnel center in meters per secondWander Step Distance-- Distance the tornado travels before picking a new wander target. Smaller values produce twitchier movement, larger values produce smoother pathsTerrain Height Lookahead-- Distance ahead of the tornado used when sampling terrain height. Helps the funnel anticipate hills and dips rather than reacting to its current positionHeight Follow Smooth Time Seconds-- Smoothing time for the funnel's vertical position. Lower values snap to terrain, higher values glide more smoothlyMaximum Vertical Movement Speed-- Cap on how fast the funnel can move up or down. Prevents sudden jumps over cliffsFunnel Center Height Above Ground-- Vertical offset of the funnel's bottom above the terrain surface
Funnel Shape
The funnel is built from horizontal rings of orbiting rockets stacked vertically.Number Of Funnel Rings-- How many rings stack vertically to form the funnelSpacing Between Rings-- Vertical distance in meters between adjacent rings. Combined with the ring count, this determines total funnel heightFunnel Throat Radius-- Radius of the bottom ring (the tightest part of the funnel)Funnel Mouth Radius-- Radius of the top ring (the widest part). Rings between throat and mouth are interpolated linearlySpiral Offset Between Rings-- Angular offset in degrees applied to each successive ring, creating the spiral twist of the funnelRing Spin Speed-- How fast the rings rotate around the funnel center, in degrees per secondOrbiting Projectiles Per Ring-- Number of rockets in each ring. Total rocket count isNumber Of Funnel Rings * Orbiting Projectiles Per RingOrbiting Projectile Speed-- Base orbital speed of rockets around the funnelRocket Vertical Travel Time Seconds-- Time in seconds for a rocket to cycle through the funnel's vertical range (creates the upward/downward streaming motion)
Strike Settings
When a tornado strikes, one of its orbiting rockets detaches and dive-bombs a ground position.Strike Search Radius-- Radius around the funnel center used to pick ground impact points for strikesSeconds Between Rocket Strikes-- Interval between strike attempts. Minimum enforced at runtime is0.75secondsBase Strike Explosion Damage-- Maximum explosion damage at the center of the impact. Damage scales linearly with distance to0at the edge of the radiusStrike Explosion Radius-- Blast radius of each strike explosion in metersDamage Players-- Whentrue, strike explosions damage players within the blast radiusDamage Buildings-- Whentrue, strike explosions damage building blocks, simple building blocks, and doorsDamage Deployables-- Whentrue, strike explosions damage deployable entities (boxes, tool cupboards, furnaces, etc.)
Prefab Paths
Orbiting Projectile Prefab Path-- Prefab used for the orbiting rockets that form the funnel. Default is the basic rocketStrike Explosion FX Prefab-- Effect prefab spawned at each strike impact point. Default is the Bradley explosion effect
Storm Weather
When the first tornado of a wave spawns, these settings are applied via Rust'sweather.* console commands. When Reset After Last Tornado Ends is true and the last active tornado dissipates, the plugin runs weather.reset to restore dynamic weather. See the Facepunch Weather wiki for full details on each underlying convar.Any individual weather value set to a negative number is skipped, leaving that aspect of the weather under control of Rust's dynamic weather system.
Enabled-- Master toggle for forced storm weather. Whenfalse, no weather changes are madeReset After Last Tornado Ends-- When true, weather is reset to dynamic once the last tornado endsPreset(accepts:Clear,Dust,Fog,Overcast,RainHeavy,RainMild,Storm) -- Weather preset loaded viaweather.load. Leave empty to skip preset loading and apply only the individual values belowTransition Seconds-- Transition time used when blending into the storm weather. Set to a negative value to skip the transition commandRain-- How much it should rainFog-- How much fog there isWind-- How much wind there is. Mostly visual, affects certain vegetationThunder-- How much thunder and lightning there isCloud Coverage-- How much sky is covered by the cloud layersCloud Opacity-- Opacity of the cloud layers and billboardsCloud Brightness-- Overall brightness of the cloudsCloud Sharpness-- How sharp the clouds formed by the cloud layers areCloud Scattering-- How much sunlight the clouds scatter, making them bloomCloud Attenuation-- How dark the clouds should be when they get thickerCloud Size-- Scale of the cloud layers. Does not affect cloud billboardsCloud Coloring-- Determines the blending of indirect light from the sky and direct light from the sunAtmosphere Rayleigh-- Rayleigh scattering intensity. Helps determine the color of the skyAtmosphere Mie-- Mie scattering intensity. Helps determine the color of the skyAtmosphere Brightness-- Overall brightness of the skyAtmosphere Contrast-- Overall contrast of the skyAtmosphere Directionality-- Directionality factor that determines the size of the glow around the sunWetness Rain-- How wet players get from rain. Set to-1to leave the dynamic value unchangedWetness Snow-- How wet players get from snow. Set to-1to leave the dynamic value unchanged
Localization
JSON:
{
"Error.NoPermission": "You do not have permission to use this command.",
"Info.Usage.Header": "Usage:",
"Info.Usage.Start": "tornado start [count] [durationSeconds] [wanderRadius] [pos <x> <z> | near <player>]",
"Info.Usage.StopAll": "tornado stopall",
"Info.Usage.Weather": "tornado weather on|off",
"Error.SpawnLimitReached": "Already at the maximum of {0} active tornadoes.",
"Info.TornadoStarted": "Tornado started.",
"Info.AllStopped": "All tornadoes stopped.",
"Error.WeatherUsage": "Use: tornado weather on|off",
"Info.WeatherOn": "Forced storm weather applied.",
"Info.WeatherOff": "Weather reset.",
"Error.UnknownSubcommand": "Unknown subcommand. Type: tornado help",
"Error.PlayerNotFound": "No active player found matching \"{0}\".",
"Error.InvalidCoordinates": "Invalid coordinates. Use numbers for X and Z.",
"Error.PickLandFailed": "Failed to pick a land position.",
"Broadcast.TornadoFormed": "A tornado has formed near {0}."
}
Developer API
API_StartTornado
Spawns a tornado at the given position.
C#:
int API_StartTornado(Vector3 position, float duration, float wanderRadius)
position-- Where to spawn the tornado's funnel centerduration-- Lifetime in seconds. Pass0or negative to use the configured defaultwanderRadius-- Roam radius around the spawn center. Pass0or negative to allow unrestricted roaming
-1 if the spawn was vetoed by CanTornadoSpawn.API_StopTornado
Stops a specific tornado immediately by id.
C#:
bool API_StopTornado(int tornadoId)
tornadoId-- The id of the tornado to stop
true if the tornado existed and was stopped, false otherwise.API_StopAllTornadoes
Stops every active tornado.
C#:
int API_StopAllTornadoes()
API_IsTornadoActive
Checks whether a tornado with the given id is currently active.
C#:
bool API_IsTornadoActive(int tornadoId)
tornadoId-- The id of the tornado to check
true if the tornado is active, false otherwise.Developer Hooks
CanTornadoSpawn
Fires before a tornado is created, whether from a command, the auto-spawn timer, or the API.
C#:
object CanTornadoSpawn(Vector3 position)
position-- The intended spawn position of the tornado's funnel center
null to allow it.OnTornadoStarted
Fires after a tornado has successfully spawned.
C#:
void OnTornadoStarted(int tornadoId, Vector3 position)
tornadoId-- Unique id assigned to the tornado, usable with the API methods to control or query it laterposition-- The spawn position of the funnel center
OnTornadoEnded
Fires when a tornado finishes dissipating or is forcefully stopped.
C#:
void OnTornadoEnded(int tornadoId, Vector3 lastPosition)
tornadoId-- The idof the tornado that endedlastPosition-- The funnel center's last known position before it was destroyed
OnTornadoStrike
Fires when a tornado's rocket reaches its dive target and is about to apply radius damage.
C#:
void OnTornadoStrike(int tornadoId, Vector3 strikePosition)
tornadoId-- The id of the tornado that initiated the strike, or-1if unattributedstrikePosition-- The world position where the explosion occurs
CanTornadoDamageEntity
Fires once per entity inside a strike's blast radius, before damage is applied.
C#:
object CanTornadoDamageEntity(BaseEntity entity, int tornadoId)
entity-- The entity that would receive damagetornadoId-- The idof the tornado responsible for the strike
null to allow it.