// TMW2 scripts. // Authors: // Jesusalva // Description: // Controls world seasons. RESPECT MASK_* VARS ON CONSTANTS DB 000-0,0,0,0 script #WeatherCore NPC_HIDDEN,{ end; OnInit: // Bind commands bindatcmd "wsnow", "#WeatherCore::OnSnow", 80, 80, 1; bindatcmd "wrain", "#WeatherCore::OnRain", 80, 80, 1; bindatcmd "wsand", "#WeatherCore::OnSand", 80, 80, 1; bindatcmd "wevil", "#WeatherCore::OnEvil", 80, 80, 1; bindatcmd "wnight", "#WeatherCore::OnNight", 80, 80, 1; bindatcmd "wclear", "#WeatherCore::OnClear", 80, 80, 1; // Determine which maps are subject to weather, and how weather works: // eg. it will never snow on a desert, or a sandstorm on icelands. .wcore = htnew; // Deserts htput(.wcore, "003-1", "desert"); htput(.wcore, "004-1", "desert"); htput(.wcore, "004-2", "desert"); htput(.wcore, "009-1", "desert"); htput(.wcore, "010-1", "desert"); htput(.wcore, "010-2", "desert"); // Woodlands htput(.wcore, "005-1", "woodland"); htput(.wcore, "012-1", "woodland"); htput(.wcore, "014-1", "woodland"); htput(.wcore, "014-2", "woodland"); htput(.wcore, "014-3", "woodland"); // Icelands htput(.wcore, "001-7", "iceland"); // No "end" here, so server starts with weather OnMinute00: OnMinute15: OnMinute30: OnMinute45: debugmes "[Weather.sys] Total Maps = " + htsize(.wcore); .@hti = htiterator(.wcore); for(.@key$ = htinextkey(.@hti); hticheck(.@hti); .@key$ = htinextkey(.@hti)) { // PvP Maps are immune to weather changes (eg. during sieges) // I could use getmapmask, but this is simpler. if (getmapflag(.@key$, mf_pvp)) continue; // Local variables: .@key$ .@type .@r .@type$=htget(.wcore, .@key$); .@r=rand(0,10000); // Remove all current masks, and add rain/snow/sand if (.@type$ == "desert") { if (.@r < 10) setmapmask .@key$, MASK_RAIN; else if (.@r < 100) setmapmask .@key$, MASK_SANDSTORM; else setmapmask .@key$, MASK_NONE; } else if (.@type$ == "woodland") { if (.@r < 100) setmapmask .@key$, MASK_RAIN; else if (.@r < 120) setmapmask .@key$, MASK_SANDSTORM; else if (.@r < 140) setmapmask .@key$, MASK_SNOW; else setmapmask .@key$, MASK_NONE; } else if (.@type$ == "iceland") { if (.@r < 10) setmapmask .@key$, MASK_RAIN; else if (.@r < 100) setmapmask .@key$, MASK_SNOW; else setmapmask .@key$, MASK_NONE; } else { debugmes "Warning warning, blame Saulc! Weather system error on map "+.@key$; announce("ERROR BLAME SAULC! WEATHER SYSTEM CORRUPTED. KILLING MAP SERVERS.", bc_all); atcommand "@mapexit"; } // Is it night time? // For convenience, night time is from 00:15 to 00:45, every hour. // 2 = GETTIME_MINUTE if (gettime(2) >= 15 && gettime(2) < 45) addmapmask .@key$, MASK_NIGHT; else if (getmapmask(.@key$) & MASK_NIGHT) removemapmask .@key$, MASK_NIGHT; } htidelete(.@hti); debugmes "[Weather.sys] Weather reloaded"; end; // Some commands, for GMs manually override weather OnRain: getmapxy(.@key$,.@a,.@b,0); addmapmask .@key$, MASK_RAIN; end; OnSand: getmapxy(.@key$,.@a,.@b,0); addmapmask .@key$, MASK_SANDSTORM; end; OnSnow: getmapxy(.@key$,.@a,.@b,0); addmapmask .@key$, MASK_SNOW; end; OnNight: getmapxy(.@key$,.@a,.@b,0); addmapmask .@key$, MASK_NIGHT; end; OnEvil: getmapxy(.@key$,.@a,.@b,0); addmapmask .@key$, MASK_EVILSANCTUM; end; OnClear: getmapxy(.@key$,.@a,.@b,0); setmapmask .@key$, MASK_NONE; end; }