diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index b7381dce6..000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "files.associations": { - "any": "cpp", - "array": "cpp", - "atomic": "cpp", - "strstream": "cpp", - "bit": "cpp", - "*.tcc": "cpp", - "bitset": "cpp", - "cctype": "cpp", - "charconv": "cpp", - "chrono": "cpp", - "cinttypes": "cpp", - "clocale": "cpp", - "cmath": "cpp", - "codecvt": "cpp", - "compare": "cpp", - "complex": "cpp", - "concepts": "cpp", - "condition_variable": "cpp", - "csignal": "cpp", - "cstdarg": "cpp", - "cstddef": "cpp", - "cstdint": "cpp", - "cstdio": "cpp", - "cstdlib": "cpp", - "cstring": "cpp", - "ctime": "cpp", - "cwchar": "cpp", - "cwctype": "cpp", - "deque": "cpp", - "forward_list": "cpp", - "list": "cpp", - "map": "cpp", - "set": "cpp", - "string": "cpp", - "unordered_map": "cpp", - "unordered_set": "cpp", - "vector": "cpp", - "exception": "cpp", - "algorithm": "cpp", - "functional": "cpp", - "iterator": "cpp", - "memory": "cpp", - "memory_resource": "cpp", - "numeric": "cpp", - "random": "cpp", - "ratio": "cpp", - "regex": "cpp", - "string_view": "cpp", - "system_error": "cpp", - "tuple": "cpp", - "type_traits": "cpp", - "utility": "cpp", - "fstream": "cpp", - "future": "cpp", - "initializer_list": "cpp", - "iomanip": "cpp", - "iosfwd": "cpp", - "iostream": "cpp", - "istream": "cpp", - "limits": "cpp", - "mutex": "cpp", - "new": "cpp", - "numbers": "cpp", - "ostream": "cpp", - "semaphore": "cpp", - "sstream": "cpp", - "stdexcept": "cpp", - "stop_token": "cpp", - "streambuf": "cpp", - "thread": "cpp", - "typeindex": "cpp", - "typeinfo": "cpp", - "valarray": "cpp" - } -} \ No newline at end of file diff --git a/common/emu_constants.cpp b/common/emu_constants.cpp index 5f02075ad..0a5879458 100644 --- a/common/emu_constants.cpp +++ b/common/emu_constants.cpp @@ -513,21 +513,3 @@ std::string EQ::constants::GetObjectTypeName(int object_type) return std::string(); } - -const std::map& EQ::constants::GetWeatherTypeMap() -{ - static const std::map weather_type_map ={ - { WeatherTypes::None, "None" }, - { WeatherTypes::Raining, "Raining" }, - { WeatherTypes::Snowing, "Snowing" } - }; -} - -std::string EQ::constants::GetWeatherTypeName(uint8 weather_type) -{ - if (EQ::ValueWithin(weather_type, WeatherTypes::None, WeatherTypes::Snowing)) { - return EQ::constants::GetWeatherTypeMap().find(weather_type)->second; - } - - return std::string(); -} \ No newline at end of file diff --git a/common/emu_constants.h b/common/emu_constants.h index 96806cc7d..d723fbed8 100644 --- a/common/emu_constants.h +++ b/common/emu_constants.h @@ -312,12 +312,6 @@ namespace EQ NoDeposit }; - enum WeatherTypes : uint8 { - None, - Raining, - Snowing - }; - const char *GetStanceName(StanceType stance_type); int ConvertStanceTypeToIndex(StanceType stance_type); @@ -351,9 +345,6 @@ namespace EQ extern const std::map& GetObjectTypeMap(); std::string GetObjectTypeName(int object_type); - extern const std::map& GetWeatherTypeMap(); - std::string GetWeatherTypeName(uint8 weather_type); - const int STANCE_TYPE_FIRST = stancePassive; const int STANCE_TYPE_LAST = stanceBurnAE; const int STANCE_TYPE_COUNT = stanceBurnAE; diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index aea039378..5a16a88d3 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -1746,14 +1746,11 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) outapp = new EQApplicationPacket(OP_Weather, 12); Weather_Struct *ws = (Weather_Struct *)outapp->pBuffer; ws->val1 = 0x000000FF; - - if (zone->zone_weather == EQ::constants::WeatherTypes::Raining) { - ws->type = 0x31; - } else if (zone->zone_weather == EQ::constants::WeatherTypes::Snowing) { + if (zone->zone_weather == 1) { ws->type = 0x31; } // Rain + if (zone->zone_weather == 2) { outapp->pBuffer[8] = 0x01; - ws->type = EQ::constants::WeatherTypes::Snowing; + ws->type = 0x02; } - outapp->priority = 6; QueuePacket(outapp); safe_delete(outapp); diff --git a/zone/gm_commands/weather.cpp b/zone/gm_commands/weather.cpp index 7c06255a7..2590c51e3 100755 --- a/zone/gm_commands/weather.cpp +++ b/zone/gm_commands/weather.cpp @@ -2,104 +2,67 @@ void command_weather(Client *c, const Seperator *sep) { - if (!sep->IsNumber(1)) { - c->Message(Chat::White, "Usage: #weather [0|1|2] - [Off|Rain|Snow]"); - c->Message(Chat::White, "Usage: #weather 3 [Type] [Intensity] - Manually set weather type and intensity"); - return; + if (!(sep->arg[1][0] == '0' || sep->arg[1][0] == '1' || sep->arg[1][0] == '2' || sep->arg[1][0] == '3')) { + c->Message(Chat::White, "Usage: #weather <0/1/2/3> - Off/Rain/Snow/Manual."); } - - int arguments = sep->argnum; - if (arguments == 1) { - auto new_weather = static_cast(std::stoul(sep->arg[1])); - uint8 new_intensity = 0; - std::string weather_message = "The sky clears."; - - if (new_weather == EQ::constants::WeatherTypes::Snowing) { - weather_message = "Snowflakes begin to fall from the sky."; - new_weather = EQ::constants::WeatherTypes::Snowing; - new_intensity = 0x02; - } else if (new_weather == EQ::constants::WeatherTypes::Raining) { - weather_message = "Raindrops begin to fall from the sky."; - new_weather = EQ::constants::WeatherTypes::Raining; - new_intensity = 0x01; // This is how it's done in Fear, and you can see a decent distance with it at this value - } else { - c->Message(Chat::White, "Usage: #weather [0|1|2] - [Off|Rain|Snow]"); - c->Message(Chat::White, "Usage: #weather 3 [Type] [Intensity] - Manually set weather type and intensity"); - return; - } - - zone->zone_weather = new_weather; - auto outapp = new EQApplicationPacket(OP_Weather, 8); - - if (new_weather != EQ::constants::WeatherTypes::None) { - if (new_weather == EQ::constants::WeatherTypes::Snowing) { - outapp->pBuffer[0] = EQ::constants::WeatherTypes::Snowing; + else if (zone->zone_weather == 0) { + if (sep->arg[1][0] == + '3') { // Put in modifications here because it had a very good chance at screwing up the client's weather system if rain was sent during snow -T7 + if (sep->arg[2][0] != 0 && sep->arg[3][0] != 0) { + c->Message(Chat::White, "Sending weather packet... TYPE=%s, INTENSITY=%s", sep->arg[2], sep->arg[3]); + zone->zone_weather = atoi(sep->arg[2]); + auto outapp = new EQApplicationPacket(OP_Weather, 8); + outapp->pBuffer[0] = atoi(sep->arg[2]); + outapp->pBuffer[4] = atoi(sep->arg[3]); // This number changes in the packets, intensity? + entity_list.QueueClients(c, outapp); + safe_delete(outapp); } - - outapp->pBuffer[4] = new_intensity; - } - - - c->Message(Chat::White, weather_message.c_str()); - entity_list.QueueClients(c, outapp); - - safe_delete(outapp); - } else if (arguments == 3) { - auto command_type = static_cast(std::stoul(sep->arg[1])); - uint8 new_weather = EQ::constants::WeatherTypes::None; - uint8 new_intensity = 0; - std::string weather_message; - - if (zone->zone_weather == EQ::constants::WeatherTypes::None) { - if (command_type > EQ::constants::WeatherTypes::Snowing) { - new_weather = static_cast(std::stoul(sep->arg[2])); - new_intensity = static_cast(std::stoul(sep->arg[3])); - - weather_message = fmt::format( - "Sending {} ({}) with an intensity of {}.", - EQ::constants::GetWeatherTypeName(new_weather), - new_weather, - new_intensity - ); - } else if (command_type == EQ::constants::WeatherTypes::Snowing) { - weather_message = "Snowflakes begin to fall from the sky."; - new_weather = EQ::constants::WeatherTypes::Snowing; - new_intensity = 0x02; - } else if (command_type == EQ::constants::WeatherTypes::Raining) { - weather_message = "Raindrops begin to fall from the sky."; - new_weather = EQ::constants::WeatherTypes::Raining; - new_intensity = 0x01; // This is how it's done in Fear, and you can see a decent distance with it at this value + else { + c->Message(Chat::White, "Manual Usage: #weather 3 "); } - - zone->zone_weather = new_weather; + } + else if (sep->arg[1][0] == '2') { + entity_list.Message(0, 0, "Snowflakes begin to fall from the sky."); + zone->zone_weather = 2; auto outapp = new EQApplicationPacket(OP_Weather, 8); - - if (new_weather != EQ::constants::WeatherTypes::Raining) { - outapp->pBuffer[0] = new_weather; - } - - outapp->pBuffer[4] = new_intensity; - - c->Message(Chat::White, weather_message.c_str()); + outapp->pBuffer[0] = 0x01; + outapp->pBuffer[4] = 0x02; // This number changes in the packets, intensity? entity_list.QueueClients(c, outapp); - safe_delete(outapp); - } else { + } + else if (sep->arg[1][0] == '1') { + entity_list.Message(0, 0, "Raindrops begin to fall from the sky."); + zone->zone_weather = 1; auto outapp = new EQApplicationPacket(OP_Weather, 8); - weather_message = "The sky clears."; - - if (zone->zone_weather == EQ::constants::WeatherTypes::Snowing) { - weather_message = "The sky clears as the snow stops falling."; - outapp->pBuffer[0] = 0x01; // Snow has it's own shutoff packet - } else if (zone->zone_weather == EQ::constants::WeatherTypes::Raining) { - weather_message = "The sky clears as the rain ceases to fall."; - } - - zone->zone_weather = EQ::constants::WeatherTypes::None; - - c->Message(Chat::White, weather_message.c_str()); + outapp->pBuffer[4] = 0x01; // This is how it's done in Fear, and you can see a decent distance with it at this value + entity_list.QueueClients(c, outapp); + safe_delete(outapp); + } + } + else { + if (zone->zone_weather == 1) { // Doing this because if you have rain/snow on, you can only turn one off. + entity_list.Message(0, 0, "The sky clears as the rain ceases to fall."); + zone->zone_weather = 0; + auto outapp = new EQApplicationPacket(OP_Weather, 8); + // To shutoff weather you send an empty 8 byte packet (You get this everytime you zone even if the sky is clear) + entity_list.QueueClients(c, outapp); + safe_delete(outapp); + } + else if (zone->zone_weather == 2) { + entity_list.Message(0, 0, "The sky clears as the snow stops falling."); + zone->zone_weather = 0; + auto outapp = new EQApplicationPacket(OP_Weather, 8); + // To shutoff weather you send an empty 8 byte packet (You get this everytime you zone even if the sky is clear) + outapp->pBuffer[0] = 0x01; // Snow has it's own shutoff packet + entity_list.QueueClients(c, outapp); + safe_delete(outapp); + } + else { + entity_list.Message(0, 0, "The sky clears."); + zone->zone_weather = 0; + auto outapp = new EQApplicationPacket(OP_Weather, 8); + // To shutoff weather you send an empty 8 byte packet (You get this everytime you zone even if the sky is clear) entity_list.QueueClients(c, outapp); - safe_delete(outapp); } } diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index 09a24e85e..3bc53eb55 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -1203,9 +1203,8 @@ luabind::adl::object lua_get_characters_in_instance(lua_State *L, uint16 instanc } int lua_get_zone_weather() { - if (!zone) { - return EQ::constants::WeatherTypes::None; - } + if(!zone) + return 0; return zone->zone_weather; } diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index bbed45323..d97520fed 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -2110,7 +2110,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove #ifdef SPELL_EFFECT_SPAM snprintf(effect_desc, _EDLEN, "Stop Rain"); #endif - zone->zone_weather = EQ::constants::WeatherTypes::None; + zone->zone_weather = 0; zone->weather_intensity = 0; zone->weatherSend(); break; diff --git a/zone/zone.cpp b/zone/zone.cpp index a60b6fda8..07f092f16 100755 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -1027,7 +1027,7 @@ Zone::Zone(uint32 in_zoneid, uint32 in_instanceid, const char* in_short_name) Weather_Timer = new Timer(60000); Weather_Timer->Start(); LogDebug("The next weather check for zone: [{}] will be in [{}] seconds", short_name, Weather_Timer->GetRemainingTime()/1000); - zone_weather = EQ::constants::WeatherTypes::None; + zone_weather = 0; weather_intensity = 0; blocked_spells = nullptr; zone_total_blocked_spells = 0; @@ -1705,117 +1705,120 @@ void Zone::ChangeWeather() } int chance = zone->random.Int(0, 3); - auto rain_chance = zone->newzone_data.rain_chance[chance]; - auto rain_duration = zone->newzone_data.rain_duration[chance]; - auto snow_chance = zone->newzone_data.snow_chance[chance]; - auto snow_duration = zone->newzone_data.snow_duration[chance]; - uint32 weather_timer = 0; - auto temporary_weather = static_cast(zone->random.Int(0, 100)); + 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 = zone->random.Int(0, 100); uint8 duration = 0; - auto temporary_old_weather = zone->zone_weather; + uint8 tmpOldWeather = zone->zone_weather; bool changed = false; - if (temporary_old_weather == EQ::constants::WeatherTypes::None) { - if (rain_chance > 0 || snow_chance > 0) { - auto intensity = static_cast(zone->random.Int(1, 10)); - if (rain_chance > snow_chance || rain_chance == snow_chance) { // Rain - if (rain_chance >= temporary_weather) { - if (!rain_duration) { + if(tmpOldWeather == 0) + { + if(rainchance > 0 || snowchance > 0) + { + uint8 intensity = zone->random.Int(1, 10); + if((rainchance > snowchance) || (rainchance == snowchance)) + { + //It's gunna rain! + if(rainchance >= tmpweather) + { + if(rainduration == 0) duration = 1; - } else { - duration = rain_duration * 3; //Duration is 1 EQ hour which is 3 earth minutes. - } + else + duration = rainduration*3; //Duration is 1 EQ hour which is 3 earth minutes. - weather_timer = (duration * 60) * 1000; - Weather_Timer->Start(weather_timer); - zone->zone_weather = EQ::constants::WeatherTypes::Raining; + weathertimer = (duration*60)*1000; + Weather_Timer->Start(weathertimer); + zone->zone_weather = 1; zone->weather_intensity = intensity; changed = true; } - } else { // Snow - if (snow_chance >= temporary_weather) { - if (!snow_duration) { + } + else + { + //It's gunna snow! + if(snowchance >= tmpweather) + { + if(snowduration == 0) duration = 1; - } else { - duration = snow_duration * 3; //Duration is 1 EQ hour which is 3 earth minutes. - } - - weather_timer = (duration * 60) * 1000; - Weather_Timer->Start(weather_timer); - zone->zone_weather = EQ::constants::WeatherTypes::Snowing; + else + duration = snowduration*3; + weathertimer = (duration*60)*1000; + Weather_Timer->Start(weathertimer); + zone->zone_weather = 2; zone->weather_intensity = intensity; changed = true; } } } - } else { + } + else + { changed = true; //We've had weather, now taking a break - if (temporary_old_weather == EQ::constants::WeatherTypes::Raining) { - if (!rain_duration) { + if(tmpOldWeather == 1) + { + if(rainduration == 0) duration = 1; - } else { - duration = rain_duration * 3; //Duration is 1 EQ hour which is 3 earth minutes. - } + else + duration = rainduration*3; //Duration is 1 EQ hour which is 3 earth minutes. - weather_timer = (duration * 60) * 1000; - Weather_Timer->Start(weather_timer); + weathertimer = (duration*60)*1000; + Weather_Timer->Start(weathertimer); zone->weather_intensity = 0; - } else if (temporary_old_weather == EQ::constants::WeatherTypes::Snowing) { - if (!snow_duration) { + } + else if(tmpOldWeather == 2) + { + if(snowduration == 0) duration = 1; - } else { - duration = snow_duration * 3; //Duration is 1 EQ hour which is 3 earth minutes. - } + else + duration = snowduration*3; //Duration is 1 EQ hour which is 3 earth minutes. - weather_timer = (duration * 60) * 1000; - Weather_Timer->Start(weather_timer); + weathertimer = (duration*60)*1000; + Weather_Timer->Start(weathertimer); zone->weather_intensity = 0; } } - if (!changed) { - if (weather_timer == 0) { - uint32 weather_timer_rule = RuleI(Zone, WeatherTimer); - weather_timer = weather_timer_rule * 1000; - Weather_Timer->Start(weather_timer); + if(changed == false) + { + if(weathertimer == 0) + { + uint32 weatherTimerRule = RuleI(Zone, WeatherTimer); + weathertimer = weatherTimerRule*1000; + Weather_Timer->Start(weathertimer); } LogDebug("The next weather check for zone: [{}] will be in [{}] seconds", zone->GetShortName(), Weather_Timer->GetRemainingTime()/1000); - } else { - LogDebug("The weather for zone: [{}] has changed. Old weather was = [{}]. New weather is = [{}] The next check will be in [{}] seconds. Rain chance: [{}], Rain duration: [{}], Snow chance [{}], Snow duration: [{}]", zone->GetShortName(), temporary_old_weather, zone_weather,Weather_Timer->GetRemainingTime()/1000,rain_chance,rain_duration,snow_chance,snow_duration); + } + else + { + LogDebug("The weather for zone: [{}] has changed. Old weather was = [{}]. New weather is = [{}] The next check will be in [{}] seconds. Rain chance: [{}], Rain duration: [{}], Snow chance [{}], Snow duration: [{}]", zone->GetShortName(), tmpOldWeather, zone_weather,Weather_Timer->GetRemainingTime()/1000,rainchance,rainduration,snowchance,snowduration); weatherSend(); - if (zone->weather_intensity == 0) { - zone->zone_weather = EQ::constants::WeatherTypes::None; + if (zone->weather_intensity == 0) + { + zone->zone_weather = 0; } } } bool Zone::HasWeather() { - auto rain_chance_one = zone->newzone_data.rain_chance[0]; - auto rain_chance_two = zone->newzone_data.rain_chance[1]; - auto rain_chance_three = zone->newzone_data.rain_chance[2]; - auto rain_chance_four = zone->newzone_data.rain_chance[3]; + 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]; - auto snow_chance_one = zone->newzone_data.snow_chance[0]; - auto snow_chance_two = zone->newzone_data.snow_chance[1]; - auto snow_chance_three = zone->newzone_data.snow_chance[2]; - auto snow_chance_four = zone->newzone_data.snow_chance[3]; - - if ( - !rain_chance_one && - !rain_chance_two && - !rain_chance_three && - !rain_chance_four && - !snow_chance_one && - !snow_chance_two && - !snow_chance_three && - !snow_chance_four - ) { + if(rain1 == 0 && rain2 == 0 && rain3 == 0 && rain4 == 0 && snow1 == 0 && snow2 == 0 && snow3 == 0 && snow4 == 0) return false; - } else { + else return true; - } } void Zone::StartShutdownTimer(uint32 set_time) @@ -2197,20 +2200,18 @@ bool ZoneDatabase::GetDecayTimes(npcDecayTimes_Struct *npcCorpseDecayTimes) void Zone::weatherSend(Client *client) { auto outapp = new EQApplicationPacket(OP_Weather, 8); - if (zone_weather > EQ::constants::WeatherTypes::None) { + if (zone_weather > 0) { outapp->pBuffer[0] = zone_weather - 1; } - - if (zone_weather > EQ::constants::WeatherTypes::None) { + if (zone_weather > 0) { outapp->pBuffer[4] = zone->weather_intensity; } - if (client) { client->QueuePacket(outapp); - } else { + } + else { entity_list.QueueClients(0, outapp); } - safe_delete(outapp); } diff --git a/zone/zone.h b/zone/zone.h index 1ceba6b37..caf140fc4 100755 --- a/zone/zone.h +++ b/zone/zone.h @@ -249,8 +249,8 @@ public: uint32 GetCurrencyID(uint32 item_id); uint32 GetCurrencyItemID(uint32 currency_id); - inline bool IsRaining() { return zone_weather == EQ::constants::WeatherTypes::Raining; } - inline bool IsSnowing() { return zone_weather == EQ::constants::WeatherTypes::Snowing; } + inline bool IsRaining() { return zone_weather == 1; } + inline bool IsSnowing() { return zone_weather == 2; } std::string GetZoneDescription(); void SendReloadMessage(std::string reload_type);