
Accelerate the progression of seasons based on the number of raids played. Control the weather type(s) that occur during each season.
*** If you would like to support me and my work you can donate to me here. Thank you! ***
— Dynamic Weather & Seasons —
DynamicWeatherAndSeasons is a mod that allows control over the weather and seasons for SPTarkov.
— Overview —
- Accelerate the progression of seasons based on the number of raids played.
- Control the weather type(s) that occur during each season.
- Please read the README.md for more information on how to use the mod.
— Installation Instructions —
1. Begin by downloading the ‘PreyToLive-DynamicWeatherAndSeasons-v1.0.1.zip’ file from the provided link or the Github repository.
2. Extract the contents of the downloaded archive. You should now have a folder named ‘PreyToLive-DynamicWeatherAndSeasons’ containing the mod files.
3. Navigate to the location of your SPTarkov folder on your computer.
4. Inside the SPTarkov folder, find the ‘user/mods/’ directory.
5. Place the extracted folder containing the mod files into the ‘mods’ folder within your SPTarkov folder.
2.3K Downloads
--- DYNAMIC WEATHER & SEASONS VERSION 1.0.2 — COMPATIBLE WITH SPT 3.9 —
--CHANGELOG—————————————————————————————————————————————–
- Linux users should be able to use the mod now without issues.
- Seasons should now consistently update in-game to match what the profile.json shows.
Honestly guys, I’m sorry I’ve procrastinated on uploading this update for so long. I’m working on a client side mod for it at the moment and been wanting to wait and upload the server/client together. Client will be out soon. Please let me know if any of these issues persist.
12.3K Downloads
--- DYNAMIC WEATHER & SEASONS VERSION 1.0.1 — COMPATIBLE WITH SPT 3.9.0 & 3.9.1 —
--CHANGELOG—————————————————————————————————————————————–
- Added an option that randomly selects a season before each raid. See README.md for example.
- Added console logs.
1.5K Downloads
--- DYNAMIC WEATHER & SEASONS VERSION 1.0.0 — COMPATIBLE WITH SPT 3.9.0 —
--CHANGELOG—————————————————————————————————————————————–
- Accelerate the progression of seasons based on the number of raids played.
- Control the weather type(s) that occur during each season.
Details
-
GUID
Not Available
-
License
-
Latest Version VirusTotal Result
https://www.virustotal.com/gui/url/ddb07a06e212db18350266073d048a5a6a4a3850a7ea7b1a62d573a2e6d0c4b6/
Anybody know how to remove snowfall? I read all the comments and the snow falling indoors hasn’t been fixed
Hello,
I have been playing recently and because it is now 2025 the weather mod is coming up on the server, date not found switching to default summer. Will uninstalling and re installing the mod fix it?
Playing on SPT 3.9.8
Regards.
such a great mod, hopefully it gets updated.
Does this work in 3.10 ? I don’t want to accidentally break my game
Does anyone know if this works if I just change the version from 3.9 to 3.10?
I noticed that during winter, when snow falls (also inside some buildings) you can actually hear rain sounds and ambience (and in fact the logs says that it’s raining and not snowing).
Anyone experiencing this? Is it a BSG bug or something to do with the mod?
1.0.2 works like a charm. No problems with seasons so far, thank you!
Thank you for your efforts updating and bringing this to the community! o7
Hello anyone having issues with it running on Linux. I solved mine by using the following code below. If anyone has further issues please let me know. Everything should work perfectly as it does for me. Thank you for the mod hopefully and update releases soon so no one has to edit their own to work correctly.
FILE IS: sptdir/user/mods/DynamicWeatherAndSeasons/src/DWSMain.TS
/* * DynamicWeatherAndSeasons v1.0.1 * MIT License * Copyright (c) 2024 PreyToLive */ /* eslint-disable @typescript-eslint/no-var-requires */ /* eslint-disable @typescript-eslint/brace-style */ import { DependencyContainer } from “tsyringe”; import { WeatherCallbacks } from “@spt/callbacks/WeatherCallbacks”; import { PreSptModLoader } from “@spt/loaders/PreSptModLoader”; import { ConfigTypes } from “@spt/models/enums/ConfigTypes”; import { IPostSptLoadMod } from “@spt/models/external/IPostSptLoadMod”; import { IEmptyRequestData } from “@spt/models/eft/common/IEmptyRequestData”; import { IWeatherConfig } from “@spt/models/spt/config/IWeatherConfig”; import { ILogger } from “@spt/models/spt/utils/ILogger”; import { ConfigServer } from “@spt/servers/ConfigServer”; import { StaticRouterModService } from “@spt/services/mod/staticRouter/StaticRouterModService”; import { LoggerTypes } from “../enums/DWSEnumLogger”; import * as path from “path”; import * as fs from “fs”; import pkg from “../package.json”; class DWSMain implements IPostSptLoadMod { private logger: ILogger; private weatherCallbacks: WeatherCallbacks; public preSptLoad(container: DependencyContainer): void { this.logger = container.resolve<ILogger>(“WinstonLogger”); this.weatherCallbacks = container.resolve<WeatherCallbacks>(“WeatherCallbacks”); const preSptModLoader = container.resolve<PreSptModLoader>(“PreSptModLoader”); const staticRouterModService: StaticRouterModService = container.resolve<StaticRouterModService>(“StaticRouterModService”); const modName =
${pkg.author}-${pkg.name}-v${pkg.version}
; const modPath = preSptModLoader.getModPath(path.basename(path.dirname(__dirname.split(’/’).pop()))); const dbProfile = require(“../db/profile.json“); let profileDay = dbProfile.date.day; let profileMonth = dbProfile.date.month; let profileYear = dbProfile.date.year; let profileSeason = dbProfile.season; staticRouterModService.registerStaticRouter(\[${pkg.name}\] /client/items
, [ { url: “/client/items”, action: (url: string, info: any, sessionID: string, output: string): any => { try { const sptConfigsWeather: IWeatherConfig = container.resolve<ConfigServer>(“ConfigServer”).getConfig<IWeatherConfig>(ConfigTypes.WEATHER); const dbConfig = require(“../config/config.json“); const dbWeather = require(“../db/weather.json“); if (dbConfig.modEnabled) { // START UPDATE PROFILE const monthDurationInRaids = dbConfig.monthDurationInRaids; const monthIndices = { january: 1, february: 2, march: 3, april: 4, may: 5, june: 6, july: 7, august: 8, september: 9, october: 10, november: 11, december: 12 } profileDay++; if (profileDay > monthDurationInRaids) { const monthIndex = monthIndices[profileMonth] || 1; const nextMonthIndex = monthIndex === 12 ? 1 : monthIndex + 1; profileDay = 1; profileMonth = Object.keys(monthIndices).find(key => monthIndices[key] === nextMonthIndex) || “january”; if (nextMonthIndex === 1) { profileYear++; } } if (dbConfig.randomMonthEachRaid) { const randomMonthIndex = Math.floor(Math.random() * 12) + 1 profileMonth = Object.keys(monthIndices).find(key => monthIndices[key] === randomMonthIndex); } profileSeason = dbConfig.months[profileMonth]; // START UPDATE WEATHER AND SEASONS const weatherSelections: Record<string, number> = {}; for (const [key, value] of Object.entries(dbConfig.seasons[profileSeason].weather)) { if (Array.isArray(value) && value.length > 0) { const selectedValue = value[Math.floor(Math.random() * value.length)]; if (typeof selectedValue === “number”) { weatherSelections[key] = selectedValue; } } } const { clouds, rain, wind, fog, temp, pressure } = weatherSelections; // CLOUDS const cloudsProfileDesc: string[] = [ “clear sky”, “partly cloudy”, “mostly cloudy”, “overcast with scattered clouds”, “completely overcast with thick clouds” ]; const cloudsProfile = cloudsProfileDesc[clouds]; sptConfigsWeather.weather.clouds = dbWeather.clouds[clouds]; // RAIN const rainProfileDesc: string[] = [ “no rain”, “light rain”, “moderate rain”, “heavy rain”, “intense rain” ]; let rainProfile: string; if (clouds === 0) { rainProfile = rainProfileDesc[0]; sptConfigsWeather.weather.rain = dbWeather.rain[0]; sptConfigsWeather.weather.rainIntensity = dbWeather.rainIntensity[0]; } else { rainProfile = rainProfileDesc[rain]; sptConfigsWeather.weather.rain = dbWeather.rain[rain]; sptConfigsWeather.weather.rainIntensity = dbWeather.rainIntensity[rain]; } // WIND const windProfileDesc: string[] = [ “calm”, “gentle breeze”, “moderate breeze”, “strong wind”, “stormy wind” ]; const windProfile = windProfileDesc[wind]; sptConfigsWeather.weather.windSpeed = dbWeather.windSpeed[wind]; sptConfigsWeather.weather.windGustiness = dbWeather.windGustiness[wind]; const seasonIndices: Record<string, number> = { “spring”: 1, “summer”: 2, “autumn”: 3, “winter”: 4 }; const seasonIndex = seasonIndices[profileSeason] || 0; sptConfigsWeather.weather.windDirection = dbWeather.windDirection[seasonIndex]; // FOG const fogProfileDesc: string[] = [ “no fog”, “light fog”, “moderate fog”, “dense fog”, “thick fog” ]; const fogProfile = fogProfileDesc[fog]; sptConfigsWeather.weather.fog = dbWeather.fog[fog]; // TEMP const tempProfileDesc: string[] = [ “very cold”, “cold”, “mild”, “warm”, “hot” ]; const tempProfile = tempProfileDesc[temp]; sptConfigsWeather.weather.temp = dbWeather.temp[temp]; // PRESSURE const pressureProfileDesc: string[] = [ “very low pressure”, “low pressure”, “normal pressure”, “high pressure”, “very high pressure” ]; const pressureProfile = pressureProfileDesc[pressure]; sptConfigsWeather.weather.pressure = dbWeather.pressure[pressure]; // SEASON let seasonOverrideValue: number; if (profileSeason === “spring”) { seasonOverrideValue = 3; } else if (profileSeason === “summer”) { if (clouds >= 3 && rain >= 3) { seasonOverrideValue = 4; } else { seasonOverrideValue = 0; } } else if (profileSeason === “autumn”) { seasonOverrideValue = 1; } else if (profileSeason === “winter”) { seasonOverrideValue = 2; } else { seasonOverrideValue = Math.floor(Math.random() * 4); } sptConfigsWeather.overrideSeason = seasonOverrideValue; // END UPDATE WEATHER AND SEASONS const newProfileData = { mod: modName, date: { day: profileDay, month: profileMonth, year: profileYear }, season: profileSeason, weather: { clouds: cloudsProfile, rain: rainProfile, wind: windProfile, fog: fogProfile, temp: tempProfile, pressure: pressureProfile } } const profilePath = path.join(modPath, “PreyToLive-DynamicWeatherAndSeasons/db/profile.json”); fs.writeFileSync(profilePath, JSON.stringify(newProfileData, null, 4)); // END UPDATE PROFILE if (dbConfig.consoleLogs) { this.logger.log(Mod: ${pkg.name}: console logs
, LoggerTypes.INFO); this.logger.log(season: ${profileSeason}
, LoggerTypes.INFO); this.logger.log(weather: clouds: ${clouds}: ${cloudsProfile}
, LoggerTypes.INFO); this.logger.log(weather: rain: ${rain}: ${rainProfile}
, LoggerTypes.INFO); this.logger.log(weather: wind: ${wind}: ${windProfile}
, LoggerTypes.INFO); this.logger.log(weather: fog: ${fog}: ${fogProfile}
, LoggerTypes.INFO); this.logger.log(weather: temp: ${temp}: ${tempProfile}
, LoggerTypes.INFO); this.logger.log(weather: pressure: ${pressure}: ${pressureProfile}
, LoggerTypes.INFO); } } } catch (err) { this.logger.error(Error in \[${pkg.name}\] /client/items: ${err.message}
); } return output; } } ],[UPDATED COMMENT]
If anyone has the mod not counting the days increasingly or not changing seasons, please check this quick fix by AcidMC. I will provide a quick tutorial here, but feel free to check his comment just below for full details! Also below will be another instruction on how to fix if the game season is locked to the IRL date.
FIX - To fix this mod not counting days after each raid / overwriting and reading the same date data:
Navigate to \user\mods\PreyToLive-DynamicWeatherAndSeasons\src\ and locate DWSMain.ts. Inside this file, locate the following 5 lines of code, and move them to the new location as follows:
After moving the 5 lines of code outside of the staticRouter..() (as shown in the image above), the mod should now work perfectly. Thanks for AcidMC for figuring this fix out!
FIX - SPT locking season to IRL date (how to unlock season, which also disables seasonal events):**
A non mod-related problem I had, was that in SPT-internal files, the weather.json in \SPT_Data\Server\configs was always overwriting any mod trying to change the in-game season. After modifying the seasonDates section within this file, mods were now able to change the season perfectly without being overwritten by SPT to the in-real-life season. Here is the full file for easy copy-paste:
{ “acceleration”: 7, “weather”: { “clouds”: { “values”: [-1.5, -1, 0, 0.5, 1, 1.5], “weights”: [60, 50, 15, 5, 4, 3] }, “windSpeed”: { “values”: [0, 1, 2, 3], “weights”: [4, 3, 2, 1] }, “windDirection”: { “values”: [1, 2, 3, 4, 5, 6, 7, 8], “weights”: [1, 1, 1, 1, 1, 1, 1, 1] }, “windGustiness”: { “min”: 0, “max”: 1 }, “rain”: { “values”: [1, 2, 3], “weights”: [25, 1, 1] }, “rainIntensity”: { “min”: 0, “max”: 1 }, “fog”: { “values”: [0.002, 0.004, 0.008, 0.012, 0.087], “weights”: [20, 8, 5, 5, 1] }, “temp”: { “min”: 0, “max”: 24 }, “pressure”: { “min”: 760, “max”: 764 } }, “seasonDates”: [ { “seasonType”: 0, “name”: “SUMMER”, “startDay”: “1”, “startMonth”: “1”, “endDay”: “31”, “endMonth”: “12” }, { “seasonType”: 1, “name”: “AUTUMN”, “startDay”: “1”, “startMonth”: “1”, “endDay”: “31”, “endMonth”: “12” }, { “seasonType”: 2, “name”: “WINTER”, “startDay”: “1”, “startMonth”: “1”, “endDay”: “31”, “endMonth”: “12” }, { “seasonType”: 3, “name”: “SPRING”, “startDay”: “1”, “startMonth”: “1”, “endDay”: “31”, “endMonth”: “12” }, { “seasonType”: 4, “name”: “STORM”, “startDay”: “1”, “startMonth”: “1”, “endDay”: “31”, “endMonth”: “12” } ], “overrideSeason”: null } After fixing these two issues (mod-related and SPT-internal weather,json), I was now able to have seasons correctly change in-game on the fly without needing to restart the client or server. I hope this helps other people with the same issues.
Also a big thanks to PreyToLive for creating this mod and AcidMC for providing a working mod fix!