// 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;
}