diff options
author | Jesusaves <cpntb1@ymail.com> | 2018-06-19 13:14:03 +0000 |
---|---|---|
committer | Jesusaves <cpntb1@ymail.com> | 2018-06-19 13:14:03 +0000 |
commit | 3e82cbcbf7040277dc46244592b68733fe9e2265 (patch) | |
tree | 7b6a57dd32677df1fee989f4d63eb98a04ca3ed0 /npc/functions | |
parent | 1dfec5e561130796b759e0334ccabf1aad44ea02 (diff) | |
parent | 781d1fd070e7565af741a8606447cd1a98f7f076 (diff) | |
download | serverdata-3e82cbcbf7040277dc46244592b68733fe9e2265.tar.gz serverdata-3e82cbcbf7040277dc46244592b68733fe9e2265.tar.bz2 serverdata-3e82cbcbf7040277dc46244592b68733fe9e2265.tar.xz serverdata-3e82cbcbf7040277dc46244592b68733fe9e2265.zip |
Merge branch 'jesusalva/20180619' into 'master'
Jesusalva/20180619
See merge request TMW2/serverdata!12
Diffstat (limited to 'npc/functions')
-rw-r--r-- | npc/functions/weather.txt | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/npc/functions/weather.txt b/npc/functions/weather.txt new file mode 100644 index 000000000..cc7285721 --- /dev/null +++ b/npc/functions/weather.txt @@ -0,0 +1,169 @@ +// TMW2 scripts. +// Authors: +// Jesusalva +// Description: +// Controls world seasons. RESPECT MASK_* VARS ON CONSTANTS DB + +000-0,0,0,0 script #WeatherCore NPC_HIDDEN,{ + end; + +/* + * removemapflag("<map name>", <flag>) + * setmapflag("<map name>", <flag>{, <val>}) + * getmapflag("<map name>", <flag>) + + mf_snow: 16 + + mf_jexp: 39 + mf_bexp: 40 + + setmapflag(.@key$, mf_nightenabled); + removemapflag(.@key$, mf_nightenabled); + +*/ + +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) { + setmapflag(.@key$, mf_nightenabled); + addmapmask .@key$, MASK_NIGHT; + } else if (getmapmask(.@key$) & MASK_NIGHT) { + removemapflag(.@key$, mf_nightenabled); + removemapmask .@key$, MASK_NIGHT; + } + + } + htidelete(.@hti); + debugmes "[Weather.sys] Weather reloaded"; + end; + + // Function to check stuff + // WeatherSwitch ( MASK ) + function WeatherSwitch { + // Get map + getmapxy(.@key$,.@a,.@b,0); + + // Sanitize + .@m$ = htget(.wcore, .@key$, "Not found"); + + // Change Weather or abort + if (.@m$ == "Not found") + dispbottom l("Command not permitted on this map! Check npc/functions/weather.conf"); + else + addmapmask(.@key$, MASK_RAIN); + return; + } + +// Some commands, for GMs manually override weather +OnRain: + WeatherSwitch(MASK_RAIN); + end; + +OnSand: + WeatherSwitch(MASK_SANDSTORM); + end; + +OnSnow: + WeatherSwitch(MASK_SNOW); + end; + +OnNight: + WeatherSwitch(MASK_NIGHT); + end; + +OnEvil: + WeatherSwitch(MASK_EVILSANCTUM); + end; + +// Clear works on any map +OnClear: + getmapxy(.@key$,.@a,.@b,0); + setmapmask(.@key$, MASK_NONE); + end; + +} |