From 70f994cda545cb39cef505fb3933d0f87e37f245 Mon Sep 17 00:00:00 2001 From: cavedude00 Date: Mon, 20 Jan 2014 10:10:39 -0800 Subject: [PATCH] Live-Like weather. Big thanks to Robregen for figuring out the system! Included in the required SQL is weather data pulled from NewZone live packets for up to PoP. An update to EQExtractor will be made to grab the rest of the data from existing collects. Please note: Until weather data is grabbed for zones later than PoP, weather will not work in those zones. --- common/eq_packet_structs.h | 6 +- common/patches/Client62_structs.h | 6 +- common/patches/RoF.cpp | 16 +- common/patches/RoF_structs.h | 6 +- common/patches/SoD.cpp | 16 +- common/patches/SoD_structs.h | 6 +- common/patches/SoF.cpp | 16 +- common/patches/SoF_structs.h | 6 +- common/patches/Titanium_structs.h | 6 +- common/patches/Underfoot.cpp | 16 +- common/patches/Underfoot_structs.h | 6 +- common/ruletypes.h | 1 + utils/sql/git/required/2014_01_20_Weather.sql | 140 +++++++++++++ zone/spell_effects.cpp | 1 + zone/zone.cpp | 191 ++++++++++++------ zone/zone.h | 6 +- zone/zonedb.cpp | 67 ++---- zone/zonedb.h | 5 - 18 files changed, 381 insertions(+), 136 deletions(-) create mode 100644 utils/sql/git/required/2014_01_20_Weather.sql diff --git a/common/eq_packet_structs.h b/common/eq_packet_structs.h index 0959ed348..e0c4a1563 100644 --- a/common/eq_packet_structs.h +++ b/common/eq_packet_structs.h @@ -380,7 +380,11 @@ struct NewZone_Struct { /*0404*/ float fog_maxclip[4]; /*0420*/ float gravity; /*0424*/ uint8 time_type; -/*0425*/ uint8 unknown360[49]; +/*0425*/ uint8 rain_chance[4]; +/*0429*/ uint8 rain_duration[4]; +/*0433*/ uint8 snow_chance[4]; +/*0437*/ uint8 snow_duration[4]; +/*0441*/ uint8 unknown360[33]; /*0474*/ uint8 sky; // Sky Type /*0475*/ uint8 unknown331[13]; // ***Placeholder /*0488*/ float zone_exp_multiplier; // Experience Multiplier diff --git a/common/patches/Client62_structs.h b/common/patches/Client62_structs.h index 84eacf67e..27b808620 100644 --- a/common/patches/Client62_structs.h +++ b/common/patches/Client62_structs.h @@ -312,7 +312,11 @@ struct NewZone_Struct { /*0404*/ float fog_maxclip[4]; /*0420*/ float gravity; /*0424*/ uint8 time_type; -/*0425*/ uint8 unknown360[49]; +/*0425*/ uint8 rain_chance[4]; +/*0429*/ uint8 rain_duration[4]; +/*0433*/ uint8 snow_chance[4]; +/*0437*/ uint8 snow_duration[4]; +/*0441*/ uint8 unknown360[33]; /*0474*/ uint8 sky; // Sky Type /*0475*/ uint8 unknown331[13]; // ***Placeholder /*0488*/ float zone_exp_multiplier; // Experience Multiplier diff --git a/common/patches/RoF.cpp b/common/patches/RoF.cpp index 3577fb6f3..07cea6dfb 100644 --- a/common/patches/RoF.cpp +++ b/common/patches/RoF.cpp @@ -1587,8 +1587,20 @@ ENCODE(OP_NewZone) { } OUT(gravity); OUT(time_type); - for(r = 16; r < 48; r++) { - eq->unknown521[r] = 0xFF; //observed + for(r = 0; r < 4; r++) { + OUT(rain_chance[r]); + } + for(r = 0; r < 4; r++) { + OUT(rain_duration[r]); + } + for(r = 0; r < 4; r++) { + OUT(snow_chance[r]); + } + for(r = 0; r < 4; r++) { + OUT(snow_duration[r]); + } + for(r = 0; r < 32; r++) { + eq->unknown537[r] = 0xFF; //observed } OUT(sky); OUT(zone_exp_multiplier); diff --git a/common/patches/RoF_structs.h b/common/patches/RoF_structs.h index d3125f97d..a2635ceae 100644 --- a/common/patches/RoF_structs.h +++ b/common/patches/RoF_structs.h @@ -529,7 +529,11 @@ struct NewZone_Struct { /*0500*/ float fog_maxclip[4]; /*0516*/ float gravity; /*0520*/ uint8 time_type; -/*0521*/ uint8 unknown521[49]; +/*0521*/ uint8 rain_chance[4]; +/*0525*/ uint8 rain_duration[4]; +/*0529*/ uint8 snow_chance[4]; +/*0533*/ uint8 snow_duration[4]; +/*0537*/ uint8 unknown537[33]; /*0570*/ uint8 sky; // Sky Type /*0571*/ uint8 unknown571[13]; // ***Placeholder /*0584*/ float zone_exp_multiplier; // Experience Multiplier diff --git a/common/patches/SoD.cpp b/common/patches/SoD.cpp index cadd4b8a8..08a3401ad 100644 --- a/common/patches/SoD.cpp +++ b/common/patches/SoD.cpp @@ -709,8 +709,20 @@ ENCODE(OP_NewZone) { } OUT(gravity); OUT(time_type); - for(r = 16; r < 48; r++) { - eq->unknown521[r] = 0xFF; //observed + for(r = 0; r < 4; r++) { + OUT(rain_chance[r]); + } + for(r = 0; r < 4; r++) { + OUT(rain_duration[r]); + } + for(r = 0; r < 4; r++) { + OUT(snow_chance[r]); + } + for(r = 0; r < 4; r++) { + OUT(snow_duration[r]); + } + for(r = 0; r < 32; r++) { + eq->unknown537[r] = 0xFF; //observed } OUT(sky); OUT(zone_exp_multiplier); diff --git a/common/patches/SoD_structs.h b/common/patches/SoD_structs.h index e87d90429..99a904b86 100644 --- a/common/patches/SoD_structs.h +++ b/common/patches/SoD_structs.h @@ -399,7 +399,11 @@ struct NewZone_Struct { /*0500*/ float fog_maxclip[4]; /*0516*/ float gravity; /*0520*/ uint8 time_type; -/*0521*/ uint8 unknown521[49]; +/*0521*/ uint8 rain_chance[4]; +/*0525*/ uint8 rain_duration[4]; +/*0529*/ uint8 snow_chance[4]; +/*0533*/ uint8 snow_duration[4]; +/*0537*/ uint8 unknown537[33]; /*0570*/ uint8 sky; // Sky Type /*0571*/ uint8 unknown571[13]; // ***Placeholder /*0584*/ float zone_exp_multiplier; // Experience Multiplier diff --git a/common/patches/SoF.cpp b/common/patches/SoF.cpp index 0262858d5..96b1f223e 100644 --- a/common/patches/SoF.cpp +++ b/common/patches/SoF.cpp @@ -708,8 +708,20 @@ ENCODE(OP_NewZone) { } OUT(gravity); OUT(time_type); - for(r = 16; r < 48; r++) { - eq->unknown521[r] = 0xFF; //observed + for(r = 0; r < 4; r++) { + OUT(rain_chance[r]); + } + for(r = 0; r < 4; r++) { + OUT(rain_duration[r]); + } + for(r = 0; r < 4; r++) { + OUT(snow_chance[r]); + } + for(r = 0; r < 4; r++) { + OUT(snow_duration[r]); + } + for(r = 0; r < 32; r++) { + eq->unknown537[r] = 0xFF; //observed } OUT(sky); OUT(zone_exp_multiplier); diff --git a/common/patches/SoF_structs.h b/common/patches/SoF_structs.h index d02affa65..a31d60ef8 100644 --- a/common/patches/SoF_structs.h +++ b/common/patches/SoF_structs.h @@ -382,7 +382,11 @@ struct NewZone_Struct { /*0500*/ float fog_maxclip[4]; /*0516*/ float gravity; /*0520*/ uint8 time_type; -/*0521*/ uint8 unknown521[49]; +/*0521*/ uint8 rain_chance[4]; +/*0525*/ uint8 rain_duration[4]; +/*0529*/ uint8 snow_chance[4]; +/*0533*/ uint8 snow_duration[4]; +/*0537*/ uint8 unknown537[33]; /*0570*/ uint8 sky; // Sky Type /*0571*/ uint8 unknown571[13]; // ***Placeholder /*0584*/ float zone_exp_multiplier; // Experience Multiplier diff --git a/common/patches/Titanium_structs.h b/common/patches/Titanium_structs.h index a12958c30..1c058fb77 100644 --- a/common/patches/Titanium_structs.h +++ b/common/patches/Titanium_structs.h @@ -324,7 +324,11 @@ struct NewZone_Struct { /*0404*/ float fog_maxclip[4]; /*0420*/ float gravity; /*0424*/ uint8 time_type; -/*0425*/ uint8 unknown360[49]; +/*0425*/ uint8 rain_chance[4]; +/*0429*/ uint8 rain_duration[4]; +/*0433*/ uint8 snow_chance[4]; +/*0437*/ uint8 snow_duration[4]; +/*0441*/ uint8 unknown360[33]; /*0474*/ uint8 sky; // Sky Type /*0475*/ uint8 unknown331[13]; // ***Placeholder /*0488*/ float zone_exp_multiplier; // Experience Multiplier diff --git a/common/patches/Underfoot.cpp b/common/patches/Underfoot.cpp index 0a17ef9e6..f15a94bde 100644 --- a/common/patches/Underfoot.cpp +++ b/common/patches/Underfoot.cpp @@ -733,8 +733,20 @@ ENCODE(OP_NewZone) { } OUT(gravity); OUT(time_type); - for(r = 16; r < 48; r++) { - eq->unknown521[r] = 0xFF; //observed + for(r = 0; r < 4; r++) { + OUT(rain_chance[r]); + } + for(r = 0; r < 4; r++) { + OUT(rain_duration[r]); + } + for(r = 0; r < 4; r++) { + OUT(snow_chance[r]); + } + for(r = 0; r < 4; r++) { + OUT(snow_duration[r]); + } + for(r = 0; r < 32; r++) { + eq->unknown537[r] = 0xFF; //observed } OUT(sky); OUT(zone_exp_multiplier); diff --git a/common/patches/Underfoot_structs.h b/common/patches/Underfoot_structs.h index 941ca583f..ee7286dab 100644 --- a/common/patches/Underfoot_structs.h +++ b/common/patches/Underfoot_structs.h @@ -399,7 +399,11 @@ struct NewZone_Struct { /*0500*/ float fog_maxclip[4]; /*0516*/ float gravity; /*0520*/ uint8 time_type; -/*0521*/ uint8 unknown521[49]; +/*0521*/ uint8 rain_chance[4]; +/*0525*/ uint8 rain_duration[4]; +/*0529*/ uint8 snow_chance[4]; +/*0533*/ uint8 snow_duration[4]; +/*0537*/ uint8 unknown537[33]; /*0570*/ uint8 sky; // Sky Type /*0571*/ uint8 unknown571[13]; // ***Placeholder /*0584*/ float zone_exp_multiplier; // Experience Multiplier diff --git a/common/ruletypes.h b/common/ruletypes.h index 26083a583..26acc7434 100644 --- a/common/ruletypes.h +++ b/common/ruletypes.h @@ -196,6 +196,7 @@ RULE_INT ( Zone, ReservedInstances, 30 ) //Will reserve this many instance ids f RULE_INT ( Zone, EbonCrystalItemID, 40902) RULE_INT ( Zone, RadiantCrystalItemID, 40903) RULE_BOOL ( Zone, LevelBasedEXPMods, false) // Allows you to use the level_exp_mods table in consideration to your players EXP hits +RULE_INT ( Zone, WeatherTimer, 600) // Weather timer when no duration is available RULE_CATEGORY_END() RULE_CATEGORY( Map ) diff --git a/utils/sql/git/required/2014_01_20_Weather.sql b/utils/sql/git/required/2014_01_20_Weather.sql new file mode 100644 index 000000000..86ecb729a --- /dev/null +++ b/utils/sql/git/required/2014_01_20_Weather.sql @@ -0,0 +1,140 @@ +alter table zone drop column `weather`; +alter table zone add column `rain_chance1` int(4) not null default 0; +alter table zone add column `rain_chance2` int(4) not null default 0; +alter table zone add column `rain_chance3` int(4) not null default 0; +alter table zone add column `rain_chance4` int(4) not null default 0; +alter table zone add column `rain_duration1` int(4) not null default 0; +alter table zone add column `rain_duration2` int(4) not null default 0; +alter table zone add column `rain_duration3` int(4) not null default 0; +alter table zone add column `rain_duration4` int(4) not null default 0; +alter table zone add column `snow_chance1` int(4) not null default 0; +alter table zone add column `snow_chance2` int(4) not null default 0; +alter table zone add column `snow_chance3` int(4) not null default 0; +alter table zone add column `snow_chance4` int(4) not null default 0; +alter table zone add column `snow_duration1` int(4) not null default 0; +alter table zone add column `snow_duration2` int(4) not null default 0; +alter table zone add column `snow_duration3` int(4) not null default 0; +alter table zone add column `snow_duration4` int(4) not null default 0; + +UPDATE `zone` SET `snow_chance1`=25, `snow_chance2`=20, `snow_chance3`=10, `snow_chance4`=20, `snow_duration1`=10, `snow_duration2`=8, `snow_duration3`=5, `snow_duration4`=10 WHERE `id`=160; +UPDATE `zone` SET `rain_chance1`=5, `rain_chance2`=5 WHERE `id`=202; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=306; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=304; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=23; +UPDATE `zone` SET `snow_chance1`=50, `snow_chance2`=25, `snow_chance3`=10, `snow_chance4`=25, `snow_duration1`=24, `snow_duration2`=24, `snow_duration3`=24, `snow_duration4`=24 WHERE `id`=112; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=303; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=50, `rain_chance4`=25, `rain_duration1`=24, `rain_duration2`=24, `rain_duration3`=24, `rain_duration4`=24 WHERE `id`=302; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_duration1`=10, `rain_duration2`=10 WHERE `id`=133; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_duration1`=10, `rain_duration2`=10 WHERE `id`=132; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_duration1`=10, `rain_duration2`=10 WHERE `id`=131; +UPDATE `zone` SET `rain_chance1`=5, `rain_chance2`=2 WHERE `id`=257; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=104; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=5, `rain_chance4`=5, `rain_duration1`=2, `rain_duration2`=3, `rain_duration3`=1, `rain_duration4`=2 WHERE `id`=439; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=365; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=2, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1 WHERE `id`=4; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=1, `rain_duration2`=2, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=204; +UPDATE `zone` SET `rain_chance1`=100, `rain_chance2`=100, `rain_chance3`=100, `rain_chance4`=100, `rain_duration1`=24, `rain_duration2`=24, `rain_duration3`=24, `rain_duration4`=24 WHERE `id`=224; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_duration1`=1, `rain_duration2`=2, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1 WHERE `id`=138; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=56; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=31; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=34; +UPDATE `zone` SET `rain_chance1`=100, `rain_chance2`=100, `rain_chance3`=100, `rain_chance4`=100, `rain_duration1`=24, `rain_duration2`=24, `rain_duration3`=24, `rain_duration4`=24 WHERE `id`=419; +UPDATE `zone` SET `rain_chance1`=15, `rain_chance2`=15, `rain_chance3`=5, `rain_chance4`=5 WHERE `id`=116; +UPDATE `zone` SET `rain_chance1`=15, `rain_chance2`=15, `rain_chance3`=5, `rain_chance4`=5 WHERE `id`=115; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=2, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=188; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=2, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=189; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=1, `rain_duration2`=2, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=410; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=75, `rain_chance3`=75, `rain_chance4`=25, `rain_duration1`=16, `rain_duration2`=12, `rain_duration3`=12, `rain_duration4`=16 WHERE `id`=276; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1, `snow_duration2`=1, `snow_duration3`=1, `snow_duration4`=1 WHERE `id`=430; +UPDATE `zone` SET `rain_chance2`=19, `rain_chance3`=14, `rain_duration1`=1, `rain_duration2`=2, `rain_duration3`=1, `rain_duration4`=1, `snow_chance1`=20, `snow_chance4`=20, `snow_duration1`=2, `snow_duration4`=1 WHERE `id`=370; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=194; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=108; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=110; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1 WHERE `id`=51; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=1, `rain_duration2`=2, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1 WHERE `id`=196; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=5, `rain_chance4`=10 WHERE `id`=316; +UPDATE `zone` SET `rain_chance1`=20, `rain_chance3`=10, `rain_chance4`=20, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=166; +UPDATE `zone` SET `rain_chance1`=20, `rain_chance3`=10, `rain_chance4`=20, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10, `snow_duration1`=12 WHERE `id`=165; +UPDATE `zone` SET `rain_chance1`=20, `rain_chance2`=20, `rain_chance3`=5, `rain_chance4`=10 WHERE `id`=225; +UPDATE `zone` SET `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=329; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=21; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=10, `rain_chance4`=25, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=99; +UPDATE `zone` SET `rain_chance1`=30, `rain_chance2`=30, `rain_chance3`=20, `rain_chance4`=30, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=255; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=10, `rain_chance4`=25, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=301; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=10, `rain_chance4`=25, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=359; +UPDATE `zone` SET `rain_chance1`=20, `rain_chance2`=20, `rain_chance3`=15, `rain_chance4`=20, `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1 WHERE `id`=201; +UPDATE `zone` SET `rain_chance1`=35, `rain_chance2`=45, `rain_chance3`=15, `rain_chance4`=20, `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1 WHERE `id`=312; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=75, `rain_chance3`=50, `rain_chance4`=5, `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=114; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=10, `rain_chance4`=25, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=263; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=10, `rain_chance4`=25, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=36; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=50, `rain_chance4`=25, `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=182; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=10, `rain_chance4`=25, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10, `snow_duration1`=12 WHERE `id`=142; +UPDATE `zone` SET `rain_chance1`=5, `rain_chance2`=3 WHERE `id`=361; +UPDATE `zone` SET `rain_chance1`=8, `rain_chance2`=5 WHERE `id`=259; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=2, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1 WHERE `id`=357; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=2, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1 WHERE `id`=156; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=2, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1 WHERE `id`=149; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=50, `rain_chance4`=25, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10, `snow_chance1`=10, `snow_duration1`=10 WHERE `id`=406; +UPDATE `zone` SET `rain_chance1`=30, `rain_chance2`=40, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=119; +UPDATE `zone` SET `rain_chance1`=3, `rain_chance2`=3, `rain_chance3`=3, `rain_chance4`=3, `rain_duration1`=24, `rain_duration2`=24, `rain_duration3`=24, `rain_duration4`=24 WHERE `id`=32; +UPDATE `zone` SET `rain_chance1`=3, `rain_chance2`=3, `rain_chance3`=3, `rain_chance4`=3, `rain_duration1`=24, `rain_duration2`=24, `rain_duration3`=24, `rain_duration4`=24 WHERE `id`=33; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=50, `rain_chance4`=25, `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=374; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=10, `rain_chance4`=25, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10, `snow_duration1`=12 WHERE `id`=412; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=2, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1 WHERE `id`=331; +UPDATE `zone` SET `rain_chance1`=5, `rain_chance2`=5 WHERE `id`=345; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=10, `rain_chance4`=25, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10, `snow_duration1`=12 WHERE `id`=30; +UPDATE `zone` SET `rain_chance1`=35, `rain_chance2`=45, `rain_chance3`=15, `rain_chance4`=20, `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1 WHERE `id`=107; +UPDATE `zone` SET `rain_chance1`=70, `rain_chance2`=70, `rain_chance3`=70, `rain_chance4`=70, `rain_duration1`=24, `rain_duration2`=24, `rain_duration3`=24, `rain_duration4`=24 WHERE `id`=46; +UPDATE `zone` SET `rain_duration1`=15, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10, `snow_chance1`=25, `snow_chance2`=15, `snow_chance3`=5, `snow_chance4`=15, `snow_duration1`=24, `snow_duration2`=12, `snow_duration3`=6, `snow_duration4`=12 WHERE `id`=95; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=190; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=10, `rain_chance4`=25, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10, `snow_duration1`=12 WHERE `id`=275; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1 WHERE `id`=43; +UPDATE `zone` SET `rain_chance1`=35, `rain_chance2`=45, `rain_chance3`=15, `rain_chance4`=20, `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1 WHERE `id`=134; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1, `snow_duration2`=1, `snow_duration3`=1, `snow_duration4`=1 WHERE `id`=97; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1, `snow_duration2`=1, `snow_duration3`=1, `snow_duration4`=1 WHERE `id`=258; +UPDATE `zone` SET `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=199; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=50, `rain_chance4`=25, `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=431; +UPDATE `zone` SET `rain_chance1`=30, `rain_chance2`=40, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=200; +UPDATE `zone` SET `rain_chance4`=25 WHERE `id`=113; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1, `snow_chance1`=15, `snow_chance2`=15, `snow_chance3`=15, `snow_chance4`=15, `snow_duration1`=24, `snow_duration2`=6, `snow_duration3`=2, `snow_duration4`=10 WHERE `id`=48; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1, `snow_chance1`=50, `snow_chance2`=40, `snow_chance3`=35, `snow_chance4`=40, `snow_duration1`=15, `snow_duration2`=10, `snow_duration3`=4, `snow_duration4`=12 WHERE `id`=436; +UPDATE `zone` SET `rain_duration1`=24, `rain_duration2`=24, `rain_duration3`=24, `rain_duration4`=24 WHERE `id`=243; +UPDATE `zone` SET `rain_chance1`=30, `rain_chance2`=30, `rain_chance3`=30, `rain_chance4`=30, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=428; +UPDATE `zone` SET `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10, `snow_chance1`=50, `snow_chance2`=15, `snow_chance3`=15, `snow_chance4`=15, `snow_duration1`=24, `snow_duration2`=6, `snow_duration3`=2, `snow_duration4`=10 WHERE `id`=102; +UPDATE `zone` SET `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10, `snow_chance1`=15, `snow_chance2`=15, `snow_chance3`=15, `snow_chance4`=15, `snow_duration1`=24, `snow_duration2`=6, `snow_duration3`=2, `snow_duration4`=10 WHERE `id`=174; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=2, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1 WHERE `id`=136; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1, `snow_chance1`=50, `snow_chance2`=15, `snow_chance3`=15, `snow_chance4`=15, `snow_duration1`=24, `snow_duration2`=6, `snow_duration3`=2, `snow_duration4`=10 WHERE `id`=139; +UPDATE `zone` SET `rain_duration1`=24, `rain_duration2`=24, `rain_duration3`=24, `rain_duration4`=24 WHERE `id`=404; +UPDATE `zone` SET `rain_duration1`=24, `rain_duration2`=24, `rain_duration3`=24, `rain_duration4`=24 WHERE `id`=405; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=50, `rain_chance4`=25, `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=143; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=394; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=416; +UPDATE `zone` SET `rain_duration1`=24, `rain_duration2`=24, `rain_duration3`=24, `rain_duration4`=24 WHERE `id`=253; +UPDATE `zone` SET `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=252; +UPDATE `zone` SET `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10, `snow_duration1`=12 WHERE `id`=362; +UPDATE `zone` SET `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=140; +UPDATE `zone` SET `rain_chance1`=30, `rain_chance2`=30, `rain_chance3`=30, `rain_chance4`=30, `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1, `snow_chance1`=5, `snow_chance2`=5, `snow_chance3`=5, `snow_duration1`=1, `snow_duration2`=1, `snow_duration3`=1 WHERE `id`=418; +UPDATE `zone` SET `rain_duration1`=24, `rain_duration2`=24, `rain_duration3`=24, `rain_duration4`=24 WHERE `id`=333; +UPDATE `zone` SET `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=140; +UPDATE `zone` SET `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=277; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1, `snow_duration2`=1, `snow_duration3`=1, `snow_duration4`=1 WHERE `id`=103; +UPDATE `zone` SET `rain_chance1`=2, `rain_chance2`=2, `rain_chance3`=2, `rain_chance4`=2, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=332; +UPDATE `zone` SET `rain_chance1`=5, `rain_chance2`=5, `rain_chance3`=5, `rain_chance4`=5, `rain_duration1`=10, `rain_duration2`=10, `rain_duration3`=10, `rain_duration4`=10 WHERE `id`=336; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=173; +UPDATE `zone` SET `rain_chance1`=2, `rain_chance2`=8, `rain_chance3`=10, `rain_chance4`=3, `rain_duration1`=1, `rain_duration2`=2, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=141; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10, `snow_chance1`=25, `snow_duration1`=24 WHERE `id`=389; +UPDATE `zone` SET `rain_duration1`=24, `rain_duration2`=24, `rain_duration3`=24, `rain_duration4`=24 WHERE `id`=191; +UPDATE `zone` SET `rain_chance1`=25, `rain_chance2`=25, `rain_chance3`=50, `rain_chance4`=25, `rain_duration1`=1, `rain_duration2`=1, `rain_duration3`=1, `rain_duration4`=1 WHERE `id`=223; +UPDATE `zone` SET `rain_duration1`=1, `rain_duration2`=2, `rain_duration3`=1, `rain_duration4`=1, `snow_duration1`=1 WHERE `id`=49; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=281; +UPDATE `zone` SET `rain_chance1`=6, `rain_chance2`=6, `rain_chance3`=6, `rain_chance4`=6, `rain_duration1`=12, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=288; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=290; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=170; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=27; +UPDATE `zone` SET `rain_chance2`=100, `rain_chance3`=100, `rain_chance4`=50, `rain_duration2`=24, `rain_duration3`=24, `rain_duration4`=24, `snow_chance1`=100, `snow_chance4`=50, `snow_duration1`=24, `snow_duration4`=24 WHERE `id`=289; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=285; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=171; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=282; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=283; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=24, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=280; +UPDATE `zone` SET `rain_chance1`=10, `rain_chance2`=10, `rain_chance3`=10, `rain_chance4`=10, `rain_duration1`=12, `rain_duration2`=6, `rain_duration3`=2, `rain_duration4`=10 WHERE `id`=254; \ No newline at end of file diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 841abcac6..524db430c 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -2123,6 +2123,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial) snprintf(effect_desc, _EDLEN, "Stop Rain"); #endif zone->zone_weather = 0; + zone->weather_intensity = 0; zone->weatherSend(); break; } diff --git a/zone/zone.cpp b/zone/zone.cpp index 745401f5d..cadd1b472 100644 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -134,20 +134,6 @@ bool Zone::Bootup(uint32 iZoneID, uint32 iInstanceID, bool iStaticZone) { } } - zone->weather_type = database.GetZoneWeather(iZoneID, zone->GetInstanceVersion()); - - LogFile->write(EQEMuLog::Debug, "Zone: %s has weather of type %i.", zonename, zone->weather_type); - - if(zone->weather_type > 3 || zone->weather_type == 0) { - zone->zone_weather = 0; - zone->Weather_Timer->Disable(); - LogFile->write(EQEMuLog::Debug, "Zone: %s(%i) has no weather type. The weather timer has been disabled.", zonename, iZoneID); - } - else { - zone->zone_weather = 0; - LogFile->write(EQEMuLog::Debug, "Zone: %s(%i) has weather type = %i. The weather timer has been enabled.", zonename, iZoneID, zone->weather_type); - } - ZoneLoaded = true; worldserver.SetZone(iZoneID, iInstanceID); @@ -900,11 +886,11 @@ Zone::Zone(uint32 in_zoneid, uint32 in_instanceid, const char* in_short_name) long_name = strcpy(new char[18], "Long zone missing"); } autoshutdown_timer.Start(AUTHENTICATION_TIMEOUT * 1000, false); - Weather_Timer = new Timer((MakeRandomInt(1800, 7200) + 30) * 2000); + Weather_Timer = new Timer(60000); Weather_Timer->Start(); LogFile->write(EQEMuLog::Debug, "The next weather check for zone: %s will be in %i seconds.", short_name, Weather_Timer->GetRemainingTime()/1000); - weather_type = 0; zone_weather = 0; + weather_intensity = 0; blocked_spells = nullptr; totalBS = 0; aas = nullptr; @@ -1365,38 +1351,7 @@ bool Zone::Process() { if(Weather_Timer->Check()){ Weather_Timer->Disable(); - uint16 tmpweather = MakeRandomInt(0, 100); - - if(zone->weather_type != 0) - { - if(tmpweather >= 80) - { - // A change in the weather.... - uint8 tmpOldWeather = zone_weather; - - if(zone->zone_weather == 0) - zone->zone_weather = zone->weather_type; - else - zone->zone_weather = 0; - - LogFile->write(EQEMuLog::Debug, "The weather for zone: %s has changed. Old weather was = %i. New weather is = %i", zone->GetShortName(), tmpOldWeather, zone_weather); - - this->weatherSend(); - } - else - LogFile->write(EQEMuLog::Debug, "The weather for zone: %s is not going to change. Chance was = %i percent.", zone->GetShortName(), tmpweather); - - uint32 weatherTime = 0; - - if(zone->zone_weather != zone->weather_type) - weatherTime = (MakeRandomInt(1800, 7200) + 30) * 2000; - else - weatherTime = (MakeRandomInt(900, 2700) + 30) * 1000; - - Weather_Timer->Start(weatherTime); - - LogFile->write(EQEMuLog::Debug, "The next weather check for zone: %s will be in %i seconds.", zone->GetShortName(), Weather_Timer->GetRemainingTime()/1000); - } + this->ChangeWeather(); } if(qGlobals) @@ -1426,6 +1381,129 @@ bool Zone::Process() { return true; } +void Zone::ChangeWeather() +{ + if(!HasWeather()) + { + Weather_Timer->Disable(); + return; + } + + int chance = MakeRandomInt(0, 3); + uint8 rainchance = zone->newzone_data.rain_chance[chance]; + uint8 rainduration = zone->newzone_data.rain_duration[chance]; + uint8 snowchance = zone->newzone_data.snow_chance[chance]; + uint8 snowduration = zone->newzone_data.snow_duration[chance]; + uint32 weathertimer = 0; + uint16 tmpweather = MakeRandomInt(0, 100); + uint8 duration = 0; + uint8 tmpOldWeather = zone->zone_weather; + bool changed = false; + + if(tmpOldWeather == 0) + { + if(rainchance > 0 || snowchance > 0) + { + uint8 intensity = MakeRandomInt(1, 10); + if((rainchance > snowchance) || (rainchance == snowchance)) + { + //It's gunna rain! + if(rainchance >= tmpweather) + { + if(rainduration == 0) + duration = 1; + else + duration = rainduration*3; //Duration is 1 EQ hour which is 3 earth minutes. + + weathertimer = (duration*60)*1000; + Weather_Timer->Start(weathertimer); + zone->zone_weather = 1; + zone->weather_intensity = intensity; + changed = true; + } + } + else + { + //It's gunna snow! + if(snowchance >= tmpweather) + { + if(snowduration == 0) + duration = 1; + else + duration = snowduration*3; + weathertimer = (duration*60)*1000; + Weather_Timer->Start(weathertimer); + zone->zone_weather = 2; + zone->weather_intensity = intensity; + changed = true; + } + } + } + } + else + { + changed = true; + //We've had weather, now taking a break + if(tmpOldWeather == 1) + { + if(rainduration == 0) + duration = 1; + else + duration = rainduration*3; //Duration is 1 EQ hour which is 3 earth minutes. + + weathertimer = (duration*60)*1000; + Weather_Timer->Start(weathertimer); + zone->zone_weather = 0; + zone->weather_intensity = 0; + } + else if(tmpOldWeather == 2) + { + if(snowduration == 0) + duration = 1; + else + duration = snowduration*3; //Duration is 1 EQ hour which is 3 earth minutes. + + weathertimer = (duration*60)*1000; + Weather_Timer->Start(weathertimer); + zone->zone_weather = 0; + zone->weather_intensity = 0; + } + } + + if(changed == false) + { + if(weathertimer == 0) + { + uint32 weatherTimerRule = RuleI(Zone, WeatherTimer); + weathertimer = weatherTimerRule*1000; + Weather_Timer->Start(weathertimer); + } + LogFile->write(EQEMuLog::Debug, "The next weather check for zone: %s will be in %i seconds.", zone->GetShortName(), Weather_Timer->GetRemainingTime()/1000); + } + else + { + LogFile->write(EQEMuLog::Debug, "The weather for zone: %s has changed. Old weather was = %i. New weather is = %i The next check will be in %i seconds. Rain chance: %i, Rain duration: %i, Snow chance %i, Snow duration: %i", zone->GetShortName(), tmpOldWeather, zone_weather,Weather_Timer->GetRemainingTime()/1000,rainchance,rainduration,snowchance,snowduration); + this->weatherSend(); + } +} + +bool Zone::HasWeather() +{ + uint8 rain1 = zone->newzone_data.rain_chance[0]; + uint8 rain2 = zone->newzone_data.rain_chance[1]; + uint8 rain3 = zone->newzone_data.rain_chance[2]; + uint8 rain4 = zone->newzone_data.rain_chance[3]; + uint8 snow1 = zone->newzone_data.snow_chance[0]; + uint8 snow2 = zone->newzone_data.snow_chance[1]; + uint8 snow3 = zone->newzone_data.snow_chance[2]; + uint8 snow4 = zone->newzone_data.snow_chance[3]; + + if(rain1 == 0 && rain2 == 0 && rain3 == 0 && rain4 == 0 && snow1 == 0 && snow2 == 0 && snow3 == 0 && snow4 == 0) + return false; + else + return true; +} + void Zone::StartShutdownTimer(uint32 set_time) { if (set_time > autoshutdown_timer.GetRemainingTime()) { if (set_time == (RuleI(Zone, AutoShutdownDelay))) @@ -1807,26 +1885,11 @@ bool ZoneDatabase::GetDecayTimes(npcDecayTimes_Struct* npcCorpseDecayTimes) { void Zone::weatherSend() { - /*switch(zone_weather) - { - case 0: - entity_list.Message(0, 0, "The sky clears."); - break; - case 1: - entity_list.Message(0, 0, "Raindrops begin to fall from the sky."); - break; - case 2: - entity_list.Message(0, 0, "Snowflakes begin to fall from the sky."); - break; - default: - entity_list.Message(0, 0, "Strange weather patterns form in the sky. (%i)", zone_weather); - break; - }*/ EQApplicationPacket* outapp = new EQApplicationPacket(OP_Weather, 8); if(zone_weather>0) outapp->pBuffer[0] = zone_weather-1; if(zone_weather>0) - outapp->pBuffer[4] = 0x10+MakeRandomInt(0, 9); // This number changes in the packets, intensity? + outapp->pBuffer[4] = zone->weather_intensity; entity_list.QueueClients(0, outapp); safe_delete(outapp); } diff --git a/zone/zone.h b/zone/zone.h index 71f1c8f42..981e448b8 100644 --- a/zone/zone.h +++ b/zone/zone.h @@ -149,6 +149,8 @@ public: void ShowDisabledSpawnStatus(Mob* client); void ShowSpawnStatusByID(Mob* client, uint32 spawnid); void StartShutdownTimer(uint32 set_time = (RuleI(Zone, AutoShutdownDelay))); + void ChangeWeather(); + bool HasWeather(); void AddAuth(ServerZoneIncommingClient_Struct* szic); void RemoveAuth(const char* iCharName); void ResetAuth(); @@ -212,7 +214,6 @@ public: WaterMap* watermap; PathManager *pathing; NewZone_Struct newzone_data; - uint8 zone_weather; SpawnConditionManager spawn_conditions; @@ -232,7 +233,8 @@ public: inline bool BuffTimersSuspended() const { return newzone_data.SuspendBuffs != 0; }; time_t weather_timer; - uint8 weather_type; + uint8 weather_intensity; + uint8 zone_weather; uint8 loglevelvar; uint8 merchantvar; diff --git a/zone/zonedb.cpp b/zone/zonedb.cpp index b95f86621..ea90b9f08 100644 --- a/zone/zonedb.cpp +++ b/zone/zonedb.cpp @@ -94,7 +94,11 @@ bool ZoneDatabase::GetZoneCFG(uint32 zoneid, uint16 instance_id, NewZone_Struct "fog_red4,fog_green4,fog_blue4,fog_minclip4,fog_maxclip4,fog_density," "sky,zone_exp_multiplier,safe_x,safe_y,safe_z,underworld," "minclip,maxclip,time_type,canbind,cancombat,canlevitate," - "castoutdoor,hotzone,ruleset,suspendbuffs,map_file_name,short_name" + "castoutdoor,hotzone,ruleset,suspendbuffs,map_file_name,short_name," + "rain_chance1,rain_chance2,rain_chance3,rain_chance4," + "rain_duration1,rain_duration2,rain_duration3,rain_duration4," + "snow_chance1,snow_chance2,snow_chance3,snow_chance4," + "snow_duration1,snow_duration2,snow_duration3,snow_duration4" " from zone where zoneidnumber=%i and version=%i",zoneid, instance_id), errbuf, &result)) { safe_delete_array(query); row = mysql_fetch_row(result); @@ -146,6 +150,18 @@ bool ZoneDatabase::GetZoneCFG(uint32 zoneid, uint16 instance_id, NewZone_Struct { strcpy(*map_filename, row[r++]); } + for(i=0;i<4;i++){ + zone_data->rain_chance[i]=atoi(row[r++]); + } + for(i=0;i<4;i++){ + zone_data->rain_duration[i]=atoi(row[r++]); + } + for(i=0;i<4;i++){ + zone_data->snow_chance[i]=atoi(row[r++]); + } + for(i=0;i<4;i++){ + zone_data->snow_duration[i]=atof(row[r++]); + } good = true; } mysql_free_result(result); @@ -2197,55 +2213,6 @@ bool ZoneDatabase::SetZoneTZ(uint32 zoneid, uint32 version, uint32 tz) { } //End new timezone functions. - -//Functions for weather -uint8 ZoneDatabase::GetZoneWeather(uint32 zoneid, uint32 version) { - char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; - MYSQL_RES *result; - MYSQL_ROW row; - - if (RunQuery(query, MakeAnyLenString(&query, "SELECT weather FROM zone WHERE zoneidnumber=%i AND (version=%i OR version=0) ORDER BY version DESC", zoneid, version), errbuf, &result)) - { - safe_delete_array(query); - if (mysql_num_rows(result) > 0) { - row = mysql_fetch_row(result); - uint8 tmp = atoi(row[0]); - mysql_free_result(result); - return tmp; - } - mysql_free_result(result); - } - - else { - std::cerr << "Error in GetZoneWeather query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); - } - return 0; -} - -bool ZoneDatabase::SetZoneWeather(uint32 zoneid, uint32 version, uint8 w) { - char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; - uint32 affected_rows = 0; - - if (RunQuery(query, MakeAnyLenString(&query, "UPDATE zone SET weather=%i WHERE zoneidnumber=%i AND version=%i", w, zoneid, version), errbuf, 0, &affected_rows)) { - safe_delete_array(query); - if (affected_rows == 1) - return true; - else - return false; - } - else { - std::cerr << "Error in SetZoneWeather query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); - return false; - } - - return false; -} -//End weather functions. - /* solar: this is never actually called, client_process starts an async query instead and uses GetAccountInfoForLogin_result to process it.. diff --git a/zone/zonedb.h b/zone/zonedb.h index 52700daa2..797b59980 100644 --- a/zone/zonedb.h +++ b/zone/zonedb.h @@ -428,11 +428,6 @@ public: uint32 GetZoneTZ(uint32 zoneid, uint32 version); bool SetZoneTZ(uint32 zoneid, uint32 version, uint32 tz); - /* - * Weather - */ - uint8 GetZoneWeather(uint32 zoneid, uint32 version); - bool SetZoneWeather(uint32 zoneid, uint32 version, uint8 w); /* * Group */