The storm
A Vortex Dread tornado never falls out of a clear sky. It comes out of one fixed
sequence, the same every time: a thunderstorm starts, a column begins turning underneath it, that
column has to keep turning long enough to count as mature, and only then does the game roll to see
whether anything reaches the ground. The whole thing is checked once a second of game time rather
than on every tick, which gives the column time to exist before a player ever notices it. Turning
off naturalTornadoes cuts that chain at the root, and so does typing the
command (/vortex storms off): the sky stops producing anything on its own, leaving
only /vortex spawn to put one down by hand.
Where a mesocyclone starts
The trigger comes down to one check on the server side
(isThundering): the moment a storm starts in a dimension with no column
already turning in it, the game picks a random connected player and drops the mesocyclone somewhere
between 450 and 900 blocks away, in a direction chosen at random too. The starting heading is not
fully free, though: it points roughly back at that player, with at most a quarter turn of spread
split across both directions, so a storm that appears actually stands a chance of crossing
someone's path instead of heading straight for the opposite horizon. The birth itself warns nobody,
nothing beyond one technical line in the server console, prefixed with
[VortexDread].
A column that grows and starts flashing
Once it is down, the column moves on every tick rather than once a second only: it drifts at 9 blocks per second, with a heading that can bend by 0.9 degrees per second, the same drift system a funnel will reuse for itself once it is born (covered in full on the life cycle page). Its radius, 320 blocks, is also the zone where the lightning above comes from, fed by two sources that do not follow the same rule:
- Ambient flashes: fired near any player caught under a storm, mesocyclone or
not, at the fixed rate of
cloudFlashesPerMinutea minute. - Column flashes: kept inside the column's own 320 blocks, and paced by its maturity: rare at birth, at full rate right as a funnel becomes possible.
Either way, these are visual-only bolts: nothing catches fire and
nobody dies from an impact they never saw coming. Turning off
extraLightning removes both sources at once and leaves vanilla weather to
strike the way it always has.
A column that lights up is not a promise. A mesocyclone that has been turning for 2 minutes is allowed to drop a funnel, not required to, most never do. Once every player drifts more than 4000 blocks away, or the storm stops, the whole column is forgotten with nothing left to show for it.
The touchdown roll
Once mature, the column does not decide anything in one shot: it tries again at every survey, once a second, for as long as no funnel is already alive in the dimension and the quiet enforced after the last one has not run out.
| Element | Value | What it means |
|---|---|---|
| Survey rate | 20 ticks | one check per second of game time |
| Birth distance | 450 to 900 blocks | rolled at random around a player |
| Column radius | 320 blocks | reach of the internal lightning |
| Time to mature | 2400 ticks | 2 minutes before a funnel becomes possible |
| Abandon distance | 4000 blocks | past this, the whole column is forgotten |
| Element | Value | What it means |
|---|---|---|
| Chance at each survey | ~0.3% | tornadoChancePerMinute spread across 60 surveys |
| Cumulative chance in a minute | 18% | the setting's own value |
| Average wait before a touchdown | ~5.5 min | once mature and off cooldown |
This clock only runs while both conditions hold at once, and a single funnel
already alive is enough to pause it entirely under the default
maxConcurrent. The only sign sent to a player arrives at the moment of
contact itself, never before: a gold message giving the distance and one of eight compass points,
for anyone within 640 blocks.
The quiet does not negotiate. A funnel that has just dissipated forces 8 minutes of calm on its parent column, whatever the odds say during that stretch. A storm that stays mature and keeps thundering the whole time can run out that clock without a single new touchdown ever being attempted.
The storm group, in brief
| Option | What it moves | Default |
|---|---|---|
| naturalTornadoes | Cuts the whole chain described above, leaving only the manual command working. | true |
| tornadoChancePerMinute | The probability behind the odds table higher up this page. | 0.18 |
| cooldownTicks | How long the forced quiet lasts after each dissipation. | 9600 |
| maxConcurrent | How many funnels can turn at once before the roll pauses itself. | 1 |
| ratingBias | Tips the strength roll, covered in full on the EF scale page. | 0.0 |
| warningRadius | Reach of the message sent the moment contact happens. | 640 |
| rebuildStorms | Changes the storm's own look, independent of everything else here. | true |
| cloudFlashesPerMinute | Rate of the two internal lightning sources above. | 34 |
| funnelFlashesPerMinute | The same idea, once the funnel is down on the ground. | 9 |
| extraLightning | The master switch for both lightning sources. | true |