Join the Game4Freak Discord Get exclusive plugin sneak peeks, talk directly with VisEntities, never miss important updates, and unlock special discount codes!
Tornado
Spawns tornadoes that roam the map and launch rockets at players and buildings
Works With
image (2).png
image (3).png
image (1).png
image.png



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 the tornado console/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 information
  • tornado start [count] [durationSeconds] [wanderRadius] [pos <x> <z> | near <player>]-- Spawns one or more tornadoes
    • count <int> -- Number of tornadoes to spawn. Limited by Maximum Number Of Active Tornadoes
    • durationSeconds <float> -- How long each tornado lasts before dissipating. Defaults to Tornado Duration Seconds from config
    • wanderRadius <float> -- Optional. Restricts the tornado to roam within this radius of its spawn center. Pass 0 or omit to disable bounded roaming
    • pos <x> <z> -- Spawn center at the given world X/Z coordinates
    • near <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 if Reset After Last Tornado Ends is enabled
  • tornado weather on -- Manually applies the configured storm weather without spawning a tornado
  • tornado 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. The tornado start command and the auto-spawn timer both respect this limit
  • Tornado Duration Seconds -- Default lifetime of each tornado before it begins dissipating. Minimum enforced at runtime is 10 seconds
  • Enable Automatic Tornado Spawns -- When true, the plugin spawns tornadoes automatically on a timer
  • Time 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 second
  • Wander Step Distance -- Distance the tornado travels before picking a new wander target. Smaller values produce twitchier movement, larger values produce smoother paths
  • Terrain 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 position
  • Height Follow Smooth Time Seconds -- Smoothing time for the funnel's vertical position. Lower values snap to terrain, higher values glide more smoothly
  • Maximum Vertical Movement Speed -- Cap on how fast the funnel can move up or down. Prevents sudden jumps over cliffs
  • Funnel 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 funnel
  • Spacing Between Rings -- Vertical distance in meters between adjacent rings. Combined with the ring count, this determines total funnel height
  • Funnel 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 linearly
  • Spiral Offset Between Rings -- Angular offset in degrees applied to each successive ring, creating the spiral twist of the funnel
  • Ring Spin Speed -- How fast the rings rotate around the funnel center, in degrees per second
  • Orbiting Projectiles Per Ring -- Number of rockets in each ring. Total rocket count is Number Of Funnel Rings * Orbiting Projectiles Per Ring
  • Orbiting Projectile Speed -- Base orbital speed of rockets around the funnel
  • Rocket 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 strikes
  • Seconds Between Rocket Strikes -- Interval between strike attempts. Minimum enforced at runtime is 0.75 seconds
  • Base Strike Explosion Damage -- Maximum explosion damage at the center of the impact. Damage scales linearly with distance to 0 at the edge of the radius
  • Strike Explosion Radius -- Blast radius of each strike explosion in meters
  • Damage Players -- When true, strike explosions damage players within the blast radius
  • Damage Buildings -- When true, strike explosions damage building blocks, simple building blocks, and doors
  • Damage Deployables -- When true, 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 rocket
  • Strike 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's weather.* 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. When false, no weather changes are made
  • Reset After Last Tornado Ends -- When true, weather is reset to dynamic once the last tornado ends
  • Preset (accepts: Clear, Dust, Fog, Overcast, RainHeavy, RainMild, Storm) -- Weather preset loaded via weather.load. Leave empty to skip preset loading and apply only the individual values below
  • Transition Seconds -- Transition time used when blending into the storm weather. Set to a negative value to skip the transition command
  • Rain -- How much it should rain
  • Fog -- How much fog there is
  • Wind -- How much wind there is. Mostly visual, affects certain vegetation
  • Thunder -- How much thunder and lightning there is
  • Cloud Coverage -- How much sky is covered by the cloud layers
  • Cloud Opacity -- Opacity of the cloud layers and billboards
  • Cloud Brightness -- Overall brightness of the clouds
  • Cloud Sharpness -- How sharp the clouds formed by the cloud layers are
  • Cloud Scattering -- How much sunlight the clouds scatter, making them bloom
  • Cloud Attenuation -- How dark the clouds should be when they get thicker
  • Cloud Size -- Scale of the cloud layers. Does not affect cloud billboards
  • Cloud Coloring -- Determines the blending of indirect light from the sky and direct light from the sun
  • Atmosphere Rayleigh -- Rayleigh scattering intensity. Helps determine the color of the sky
  • Atmosphere Mie -- Mie scattering intensity. Helps determine the color of the sky
  • Atmosphere Brightness -- Overall brightness of the sky
  • Atmosphere Contrast -- Overall contrast of the sky
  • Atmosphere Directionality -- Directionality factor that determines the size of the glow around the sun
  • Wetness Rain -- How wet players get from rain. Set to -1 to leave the dynamic value unchanged
  • Wetness Snow -- How wet players get from snow. Set to -1 to 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)
Parameters:
  • position -- Where to spawn the tornado's funnel center
  • duration -- Lifetime in seconds. Pass 0 or negative to use the configured default
  • wanderRadius -- Roam radius around the spawn center. Pass 0 or negative to allow unrestricted roaming
Returns: The new tornado's id, or -1 if the spawn was vetoed by CanTornadoSpawn.

API_StopTornado

Stops a specific tornado immediately by id.
C#:
bool API_StopTornado(int tornadoId)
Parameters:
  • tornadoId -- The id of the tornado to stop
Returns: true if the tornado existed and was stopped, false otherwise.

API_StopAllTornadoes

Stops every active tornado.
C#:
int API_StopAllTornadoes()
Returns: The number of tornadoes that were stopped.

API_IsTornadoActive

Checks whether a tornado with the given id is currently active.
C#:
bool API_IsTornadoActive(int tornadoId)
Parameters:
  • tornadoId -- The id of the tornado to check
Returns: 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)
Parameters:
  • position -- The intended spawn position of the tornado's funnel center
Returns: Any non-null value to block the spawn, or null to allow it.

OnTornadoStarted

Fires after a tornado has successfully spawned.
C#:
void OnTornadoStarted(int tornadoId, Vector3 position)
Parameters:
  • tornadoId -- Unique id assigned to the tornado, usable with the API methods to control or query it later
  • position -- The spawn position of the funnel center
Returns: Nothing. Notification-only hook.

OnTornadoEnded

Fires when a tornado finishes dissipating or is forcefully stopped.
C#:
void OnTornadoEnded(int tornadoId, Vector3 lastPosition)
Parameters:
  • tornadoId -- The idof the tornado that ended
  • lastPosition -- The funnel center's last known position before it was destroyed
Returns: Nothing. Notification-only hook.

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)
Parameters:
  • tornadoId -- The id of the tornado that initiated the strike, or -1 if unattributed
  • strikePosition -- The world position where the explosion occurs
Returns: Nothing. Notification-only hook.

CanTornadoDamageEntity

Fires once per entity inside a strike's blast radius, before damage is applied.
C#:
object CanTornadoDamageEntity(BaseEntity entity, int tornadoId)
Parameters:
  • entity -- The entity that would receive damage
  • tornadoId -- The idof the tornado responsible for the strike
Returns: Any non-null value to skip damage on that entity, or null to allow it.
Author
VisEntities
License duration
Unlimited
Price
19.99 USD
First release
Last update

Ratings

5.00 star(s) 2 reviews

Also by VisEntities

Latest updates

  1. 1.2.2

    Patched for the June Rust update.
  2. 1.2.1

    Fixed a server crash when a tornado ended.
  3. 1.2.0

    Added api methods and hooks so other plugins can integrate with tornadoes.

Latest reviews

Hi i got the plugin and honestly its awesome i have 6 spawn on the map and it wakes up the server makes it interesting to go outside and you might eat a rocket. there is no strain on the server no lag when they spawn and they run smooth this to me is one of my favourite plugins and i will be always using it. I recommend this plugin to all pve and pvp server owners you wont be disappointed.
Thank You for the great work.
im blown away. i have seen some good mods in my time and recently starting our own clan server for new players we wanted to create something different,give players custom maps,monuments and events to explore without the need for pvp but also give the pvp rust experiance. this mod alongside volcano and tree houses has literally changed the direction the server has taken. we once struggled to come up with new ideas and myself even started to create plugins to add to the game mechanics of rust. this has been a huge hit and i think it will only get better over time. another great job vis!
Back
Top
Chat commands start with a /, while console commands can be entered directly in the F1 console or server console. Use find <keyword> in console to search for available commands related to the plugin. Parameters in < > are required, while [ ] are optional.
This plugin uses Oxide's permission system. Grant or revoke permissions using oxide.grant and oxide.revoke. You can assign them to individual players or groups using their Steam id or group name.
Settings are stored in the config file found under the config/ directory. You can edit this file manually, then reload the plugin to apply your changes.
Persistent data is saved in the data/ directory. This includes things like saved settings, usage stats, or player progress depending on the plugin. Deleting a data file will reset stored progress or customizations.
Language files are located in the lang/ folder. To translate messages, copy the en.json file into your target language folder (e.g. fr, de) and edit the values. Reload the plugin after changes to apply new messages.
This section lists public methods exposed by the plugin for use in other plugins. You can call these via the CallHook method. Ensure the plugin is loaded before calling its API to avoid null reference errors.
These are custom hooks that other plugins can listen for. Simply define a method with the same name and expected parameters in your plugin to handle the event. Hooks are triggered at key moments and are useful for extending or reacting to plugin behavior.
These hooks are injected into the game's code using Harmony. They let the plugin run code at key points in the game's internal logic. You can return values to block or modify behavior. Use with caution — these are powerful and can affect core mechanics.
Cart