Proudly representing, Kalaran.
What is Simple/Colloquial Weather?
Simple Weather is a concluded module to simulate the environment a player sees within the game. here are some features and things to know!
-
Many Behavior Options to choose from, such as Ambiance and Cloud Settings -
Transitions between Weather Types, which include: Sound, Lighting and Sky, and Wind -
Easy to Modify and Add Changes. -
Runs on both the Client or Server. -
Supports Server to Client communication/replication; for global weather changes
Small Showcase (OLD)
Performance has greatly increased from recent versions…
(2.1.0 | 4/26) Testing Place: SimpleWeatherTest.rbxl (137.4 KB)
Download the Module,
requiring the ID does not work.
Open a Script preferably a LocalScript, and Initialize.
local SimpleWeather = require(game.ReplicatedStorage.SimpleWeather)
SimpleWeather:Init() -- loads the module, you can put a weather type to start with, inside '()'
task.delay(5, function()
SimpleWeather:ChangeWeather("Rain")
end)
SimpleWeather.WeatherChanged:Connect(function(NewWeather)
print('The Current Weather is now : '..NewWeather)
end)
API Reference
Summary
Lifecycle
:Init(overrideStartWeather: string?)
Initializes SimpleWeather. Calling it again returns the module without re-initializing. Must be called before any other method.
| Parameter | Type | Description |
|---|---|---|
overrideStartWeather |
string? |
Name of a weather type to start with instead of Config.StartWeather. |
Returns: WeatherService
:Cleanup()
Destroys all created instances, stops sounds, and clears the weather queue. No-ops if not initialized.
Weather Control
:ChangeWeather(weatherName: string, overrideTime: number?)
Transitions to the given weather type. On the server when replicating, updates state and fires signals without applying visuals — clients handle rendering. No-ops if the weather is already active.
| Parameter | Type | Description |
|---|---|---|
weatherName |
string |
Name of the weather type to transition to. Must exist in Config.WeatherTypes. |
overrideTime |
number? |
Overrides Config.TransitionTime for this transition only. Pass 0 for an instant change. |
If a transition is already in progress and
PutWeatherOnQueuesis enabled, the request is queued and processed after the current transition completes.
:ToStartWeather()
Shorthand for :ChangeWeather(Config.StartWeather).
:GetRandomWeather()
Returns a random weather type name that is not the current weather.
Returns: string
Signals
WeatherChanging(weatherName: string, isReplicated: boolean)
Fires at the start of a weather transition, before any visuals are applied.
| Parameter | Type | Description |
|---|---|---|
weatherName |
string |
The name of the incoming weather type. |
isReplicated |
boolean |
true if this change originated from server replication. |
WeatherChanged(weatherName: string, isReplicated: boolean)
Fires after a weather transition fully completes, including tween duration.
| Parameter | Type | Description |
|---|---|---|
weatherName |
string |
The name of the now-active weather type. |
isReplicated |
boolean |
true if this change originated from server replication. |
Properties
CurrentWeather: string
The name of the currently active weather type.
Config
Module-level configuration table. Should be set before calling :Init().
| Key | Type | Default | Description |
|---|---|---|---|
TransitionTime |
number |
5 |
Duration in seconds for weather transitions. |
EasingStyle |
Enum.EasingStyle |
Sine |
Easing style used for tween transitions. |
EasingDirection |
Enum.EasingDirection |
InOut |
Easing direction used for tween transitions. |
InstantWindChange |
boolean |
true |
If true, wind changes instantly instead of tweening. |
PutWeatherOnQueues |
boolean |
true |
If true, weather changes requested mid-transition are queued. |
WeatherFolderParent |
Instance |
workspace |
Parent for the weather folder. Must be a descendant of workspace. |
StartWeather |
string |
"Normal" |
The default starting weather type. |
WeatherTypes |
table |
{} |
Table of weather type definitions. Can be populated manually or via WeatherTypes module scripts. |
Internal Configuration
These are module-level constants defined at the top of the script. They must be changed directly in the source.
| Constant | Type | Default | Description |
|---|---|---|---|
REPLICATE_WEATHER_CHANGES |
boolean |
true |
If true, the server manages weather and replicates changes to clients. The server will not create visual instances. |
ON_REPLICATION_CHANGE_WEATHER |
boolean |
true |
If true, clients apply weather visuals when a replication event is received. If false, only WeatherChanging is fired. |
TWEEN_CACHING_ENABLED |
boolean |
true |
If true, tweens for persistent objects are cached and reused across transitions. |
MAX_CACHED_TWEENS |
number |
9 |
Maximum number of cached tweens per object before oldest entries are evicted. |
CAN_DEBUG |
boolean |
true |
If true, warnings are printed via warn() for invalid usage. |
Weather Type Schema
Each entry in Config.WeatherTypes must follow this structure:
| Key | Type | Description |
|---|---|---|
AmbientID |
number? |
Asset ID for the ambient sound. nil for no sound. |
Volume |
number? |
Volume of the ambient sound. |
CloudColor |
Color3? |
Color of the clouds. |
CloudCover |
number? |
Cloud cover amount, 0–1. |
Density |
number? |
Cloud density, 0–1. |
SkyBrightness |
number? |
Lighting.Brightness value. |
WindDirection |
Vector3? |
Direction of the wind. Normalized internally. |
WindSpeed |
number? |
Speed of the wind. |
Fog |
number? |
Atmosphere.Density value, 0–1. |
( If one of the properties are not provided, It’ll use the Instance’s current property value. )
How to Sync Simple/Colloquial Weather across Clients
Modular Method (Best)
Instead of creating instances, Simple weather can handle all of that for you!
![]()
Inside the module, scroll down until you see a commented section called Internal Configuration. To start replication turn REPLICATE_WEATHER_CHANGES to true - The module will now send events from the server to tell the clients what the current weather is on the server.
ON_REPLICATION_CHANGE_WEATHER; Once set to true, when the server calls WeatherService:ChangeWeather( ... : string ) the client will automatically change the weather - the client will yield and wait for the server to create the necessary objects: a RemoteEvent and RemoteFunction.
Example
Client
local Weather = require(game.ReplicatedStorage.SimpleWeather):Init()
Weather.WeatherChanging:Connect(function(NewWeather: string, isFromServer: boolean)
print(`[CLIENT]: Going into : {tostring(NewWeather)} | fromServer?: {tostring(isFromServer)}`)
end)
Weather.WeatherChanged:Connect(function(NewWeather: string, isFromServer: boolean)
print(`[CLIENT]: The Current Weather is now : {tostring(NewWeather)} | fromServer?: {tostring(isFromServer)}`)
end)
Server
local Weather = require(game.ReplicatedStorage.SimpleWeather):Init()
task.defer(function()
while task.wait(8) do
local newWeather = Weather:GetRandomWeather()
Weather:ChangeWeather(newWeather)
end
end)
Weather.WeatherChanging:Connect(function(NewWeather: string)
print("[SERVER]: Going into : ".. NewWeather)
end)
Weather.WeatherChanged:Connect(function(NewWeather: string)
print("[SERVER]: The Current Weather is now : "..NewWeather)
end)
Vanilla Method
This is quite a simple way to sync data between clients, this is generally better as it makes the tweens much smoother, since everything is calculated and processed in the client.
Create Two Events in ReplicatedStorage

Create A Local-Script and a (Server-)Script
![]()
![]()
Communicator : (Server-)Script
--// Services : https://devforum.roblox.com/t/simple-weather-14/3028058
local replicatedStorage = game:GetService("ReplicatedStorage")
--// Modules
local modules = replicatedStorage.Modules
local SimpleWeather = require(modules.SimpleWeather)
--// Shared
local shared_ = replicatedStorage.Shared
local GetWeatherFunction = shared_.GetWeather
local ChangeWeatherEvent = shared_.ChangeWeather
--// Constants
local MIN_CHANGE_TIME = 5
local MAX_CHANGE_TIME = 10
--// Values
local currentWeather = SimpleWeather.GetRandomWeather()
SimpleWeather.CurrentWeather = currentWeather
--// Functions
function ChangeWeather(name)
if name and SimpleWeather.WeatherTypes[name] then
currentWeather = name
else
currentWeather = SimpleWeather.GetRandomWeather()
end
SimpleWeather.CurrentWeather = currentWeather
ChangeWeatherEvent:FireAllClients(currentWeather, tick()) -- Fire to all clients
end
--// Connection
GetWeatherFunction.OnServerInvoke = function()
return SimpleWeather.CurrentWeather
end
while task.wait(Random.new():NextInteger(MIN_CHANGE_TIME,MAX_CHANGE_TIME)) do
ChangeWeather(nil)
end
WeatherHandler : Local-Script
--// Services : https://devforum.roblox.com/t/simple-weather-14/3028058
local replicatedStorage = game:GetService("ReplicatedStorage")
--// Modules
local modules = replicatedStorage.Modules
local SimpleWeather = require(modules.SimpleWeather)
--// Shared
local shared_ = replicatedStorage.Shared
local GetWeatherFunction = shared_.GetWeather
local ChangeWeatherEvent = shared_.ChangeWeather
--// Values
local weatherChangeConnection:RBXScriptConnection
--// Functions
-- Prepares and Syncs the Weather
function Setup()
local currentWeather = GetWeatherFunction:InvokeServer() -- ask from the server what the weather is like currently
SimpleWeather.Init(currentWeather) -- catch up to current weather
weatherChangeConnection = SimpleWeather.WeatherChanged:Connect(function(currentWeather)
print("Change to",currentWeather)
end)
end
function ChangeWeather(name, requested:number)
local instant = tick() - requested >= 5
SimpleWeather.ChangeWeather(name,instant)
if instant then
warn("The client is experiencing latency, quickly changing.")
end
end
--// Connection
spawn(Setup)
ChangeWeatherEvent.OnClientEvent:Connect(ChangeWeather)
How can I add more Types of Weather?
To add more Weather-Types you can either,
Insert Manually
Add a module, inside the WeatherTypes folder, name it to your preference.
The image shows the properties you can set, these are the default Roblox properties, the AmbientId: number.
Please remember to set yourStartWeather to a valid weather type.
Insert Directly
Index the name of your weather preset and insert the data with a table - [string]: WeatherTypeData. These are all the available properties to use, the AmbientId: number.
Please remember to set yourStartWeather to a valid weather type.
Information is given in this image…
Other Similar Sources
In no particular order:
- Dynamic Weather | anon53193547 (BEST)
- Data Aspect’s Weather System
- TwentyTwoPilots’s Weather System (OLD)
Please note the the leaves moving is using another module called WindShake | boatbomber, I highly recommend this module too!
Version History
1.0.0 | Initial Release
- Code Revamp
- Optimization
2.1.0 | 4/4/26
- Code Revamp
- Added Replication
- Optimization (Tween Caching)
|
DOWNLOAD |
-SOME RELEASES MAY NOT BE STABLE PLEASE REPORT BUGS TO THIS TOPIC-





