
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.4K 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?
It’s a BSG bug.
Yes, experienced. I noticed it happens about first time in raid in this season or smth. Don’t know if it’s the mod’s issue.
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; } } ],