Skip to content

Commit

Permalink
[Core/Packet] Split SMSG_OVERRIDE_LIGHT to MiscPackets (Legends-of-Az…
Browse files Browse the repository at this point in the history
…eroth#353)

1.Split SMSG_OVERRIDE_LIGHT to MiscPackets
2.Remove SMSG_WEATHER From scripts
  • Loading branch information
leelf00 authored Sep 29, 2024
1 parent 536da5c commit 5006264
Show file tree
Hide file tree
Showing 18 changed files with 215 additions and 291 deletions.
23 changes: 5 additions & 18 deletions src/server/game/Entities/Player/Player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7957,11 +7957,7 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea)
// Let there be light! :3
if (m_zoneUpdateId == 876 || newZone == 876) // GM Island
{
WorldPacket data(SMSG_OVERRIDE_LIGHT, 12);
data << uint32(newZone == 876 ? 500 : 0);
data << uint32(2488);
data << uint32(1);
SendDirectMessage(&data);
GetMap()->SetZoneOverrideLight(876, newZone == 876 ? 500 : 0, 2488, 1s);
}
}

Expand All @@ -7979,19 +7975,10 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea)
if (!zone)
return;

if (sWorld->getBoolConfig(CONFIG_WEATHER) && !HasAuraType(SPELL_AURA_FORCE_WEATHER))
{
if (Weather* weather = WeatherMgr::FindWeather(zone->ID))
weather->SendWeatherUpdateToPlayer(this);
else
{
if (!WeatherMgr::AddWeather(zone->ID))
{
// send fine weather packet to remove old zone's weather
WeatherMgr::SendFineWeatherUpdateToPlayer(this);
}
}
}
if (sWorld->getBoolConfig(CONFIG_WEATHER))
GetMap()->GetOrGenerateZoneDefaultWeather(newZone);

GetMap()->SendZoneDynamicInfo(newZone, this);

sScriptMgr->OnPlayerUpdateZone(this, newZone, newArea);

Expand Down
33 changes: 0 additions & 33 deletions src/server/game/LuaEngine/GlobalMethods.h
Original file line number Diff line number Diff line change
Expand Up @@ -1016,38 +1016,5 @@ namespace LuaGlobalFunctions
return 1;
}

static int FindWeather(lua_State* L)
{
uint32 zoneId = luaL_checkunsigned(L, 1);
Weather* weather = WeatherMgr::FindWeather(zoneId);
sEluna->Push(L, weather);
return 1;
}

static int AddWeather(lua_State* L)
{
uint32 zoneId = luaL_checkunsigned(L, 1);
Weather* weather = WeatherMgr::AddWeather(zoneId);
sEluna->Push(L, weather);
return 1;
}

static int RemoveWeather(lua_State* L)
{
uint32 zoneId = luaL_checkunsigned(L, 1);

WeatherMgr::RemoveWeather(zoneId);
return 0;
}

static int SendFineWeatherToPlayer(lua_State* L)
{
Player* player = sEluna->CHECK_PLAYER(L, 1);
if (!player)
return 0;

WeatherMgr::SendFineWeatherUpdateToPlayer(player);
return 0;
}
}
#endif
4 changes: 0 additions & 4 deletions src/server/game/LuaEngine/LuaFunctions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,6 @@ void RegisterGlobals(lua_State* L)
lua_register(L, "SaveAllPlayers", &LuaGlobalFunctions::SaveAllPlayers); // SaveAllPlayers() - Saves all players
lua_register(L, "SendMail", &LuaGlobalFunctions::SendMail); // SendMail(subject, text, receiverLowGUID[, sender, stationary, delay, itemEntry, itemAmount, itemEntry2, itemAmount2...]) - Sends a mail to player with lowguid. use nil to use default values on optional arguments. Sender is an optional player object. UNDOCUMENTED
lua_register(L, "AddTaxiPath", &LuaGlobalFunctions::AddTaxiPath); // AddTaxiPath(pathTable, mountA, mountH[, price, pathId]) - Adds a new taxi path. Returns the path's ID. Will replace an existing path if pathId provided and already used. path table structure: T = {{map, x, y, z[, actionFlag, delay, arrivalEvId, departEvId]}, {...}, ...} UDOCUMENTED
lua_register(L, "FindWeather", &LuaGlobalFunctions::FindWeather); // FindWeather(zoneId) - Finds the weather by zoneId and returns the weather
lua_register(L, "AddWeather", &LuaGlobalFunctions::AddWeather); // AddWeather(zoneId) - Adds weather to the following zone, also returns weather
lua_register(L, "RemoveWeather", &LuaGlobalFunctions::RemoveWeather); // RemoveWeather(zoneId) - Removes weather from a zone
lua_register(L, "SendFineWeatherToPlayer", &LuaGlobalFunctions::SendFineWeatherToPlayer); // SendFineWeatherToPlayer(player) - Sends WEATHER_STATE_FINE weather to the
}

ElunaRegister<Object> ObjectMethods[] =
Expand Down
158 changes: 112 additions & 46 deletions src/server/game/Maps/Map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
#include "Vehicle.h"
#include "VMapFactory.h"
#include "VMapManager2.h"
#include "Weather.h"
#include "WeatherMgr.h"
#include "G3D/Plane.h"

u_map_magic MapMagic = { {'M','A','P','S'} };
Expand All @@ -57,6 +59,9 @@ static uint16 const holetab_v[4] = { 0x000F, 0x00F0, 0x0F00, 0xF000 };

GridState* si_GridStates[MAX_GRID_STATE];

ZoneDynamicInfo::ZoneDynamicInfo() : MusicId(0), DefaultWeather(nullptr), WeatherId(WEATHER_STATE_FINE),
Intensity(0.0f) { }

Map::~Map()
{
sBattlePetSpawnMgr->DepopulateMap(i_mapEntry->MapID);
Expand Down Expand Up @@ -509,7 +514,6 @@ bool Map::AddPlayerToMap(Player* player)
SendInitSelf(player);

SendInitTransports(player);
SendZoneDynamicInfo(player);

player->m_clientGUIDs.clear();

Expand Down Expand Up @@ -756,6 +760,16 @@ void Map::Update(const uint32 t_diff)
i_scriptLock = false;
}

_weatherUpdateTimer.Update(t_diff);
if (_weatherUpdateTimer.Passed())
{
for (auto&& zoneInfo : _zoneDynamicInfo)
if (zoneInfo.second.DefaultWeather && !zoneInfo.second.DefaultWeather->Update(_weatherUpdateTimer.GetInterval()))
zoneInfo.second.DefaultWeather.reset();

_weatherUpdateTimer.Reset();
}

MoveAllCreaturesInMoveList();
MoveAllGameObjectsInMoveList();
MoveAllDynamicObjectsInMoveList();
Expand Down Expand Up @@ -3184,6 +3198,27 @@ void Map::SendToPlayers(WorldPacket const* data) const
itr->GetSource()->GetSession()->SendPacket(data);
}

/// Send a packet to all players (or players selected team) in the zone (except self if mentioned)
bool Map::SendZoneMessage(uint32 zone, WorldPacket const* packet, WorldSession const* self, uint32 team) const
{
bool foundPlayerToSend = false;

for (MapReference const& ref : GetPlayers())
{
Player* player = ref.GetSource();
if (player->IsInWorld() &&
player->GetZoneId() == zone &&
player->GetSession() != self &&
(team == 0 || player->GetTeam() == team))
{
player->SendDirectMessage(packet);
foundPlayerToSend = true;
}
}

return foundPlayerToSend;
}

bool Map::ActiveObjectsNearGrid(NGridType const& ngrid) const
{
CellCoord cell_min(ngrid.getX() * MAX_NUMBER_OF_CELLS, ngrid.getY() * MAX_NUMBER_OF_CELLS);
Expand Down Expand Up @@ -4214,33 +4249,24 @@ void Map::RemoveOldCorpses()
}
}

void Map::SendZoneDynamicInfo(Player* player)
void Map::SendZoneDynamicInfo(uint32 zoneId, Player* player) const
{
uint32 zoneId = GetZoneId(player->GetPhaseMask(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());
ZoneDynamicInfoMap::const_iterator itr = _zoneDynamicInfo.find(zoneId);

auto itr = _zoneDynamicInfo.find(zoneId);
if (itr == _zoneDynamicInfo.end())
return;

if (uint32 music = itr->second.MusicId)
player->SendDirectMessage(WorldPackets::Misc::PlayMusic(music).Write());

if (uint32 weather = itr->second.WeatherId)
{
WorldPacket data(SMSG_WEATHER, 4 + 4 + 1);
data << uint32(weather);
data << float(itr->second.WeatherGrade);
data << uint8(0);
player->SendDirectMessage(&data);
}
SendZoneWeather(itr->second, player);

if (uint32 overrideLight = itr->second.OverrideLightId)
for (ZoneDynamicInfo::LightOverride const& lightOverride : itr->second.LightOverrides)
{
WorldPacket data(SMSG_OVERRIDE_LIGHT, 4 + 4 + 1);
data << uint32(_defaultLight);
data << uint32(overrideLight);
data << uint32(itr->second.LightFadeInTime);
player->SendDirectMessage(&data);
WorldPackets::Misc::OverrideLight overrideLight;
overrideLight.AreaLightID = lightOverride.AreaLightId;
overrideLight.OverrideLightID = lightOverride.OverrideLightId;
overrideLight.TransitionMilliseconds = lightOverride.TransitionMilliseconds;
player->SendDirectMessage(overrideLight.Write());
}
}

Expand All @@ -4265,50 +4291,90 @@ void Map::SetZoneMusic(uint32 zoneId, uint32 musicId)
}
}

void Map::SetZoneWeather(uint32 zoneId, uint32 weatherId, float weatherGrade)
void Map::SendZoneWeather(uint32 zoneId, Player* player) const
{
if (_zoneDynamicInfo.find(zoneId) == _zoneDynamicInfo.end())
_zoneDynamicInfo.insert(ZoneDynamicInfoMap::value_type(zoneId, ZoneDynamicInfo()));
if (!player->HasAuraType(SPELL_AURA_FORCE_WEATHER))
{
auto itr = _zoneDynamicInfo.find(zoneId);
if (itr == _zoneDynamicInfo.end())
return;

ZoneDynamicInfo& info = _zoneDynamicInfo[zoneId];
info.WeatherId = weatherId;
info.WeatherGrade = weatherGrade;
Map::PlayerList const& players = GetPlayers();
SendZoneWeather(itr->second, player);
}
}

if (!players.isEmpty())
void Map::SendZoneWeather(ZoneDynamicInfo const& zoneDynamicInfo, Player* player) const
{
if (WeatherState weatherId = zoneDynamicInfo.WeatherId)
{
WorldPacket data(SMSG_WEATHER, 4 + 4 + 1);
data << uint32(weatherId);
data << float(weatherGrade);
data << uint8(0);
WorldPackets::Misc::Weather weather(weatherId, zoneDynamicInfo.Intensity);
player->SendDirectMessage(weather.Write());
}
else if (zoneDynamicInfo.DefaultWeather)
{
zoneDynamicInfo.DefaultWeather->SendWeatherUpdateToPlayer(player);
}
else
Weather::SendFineWeatherUpdateToPlayer(player);
}

for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (Player* player = itr->GetSource())
if (player->GetZoneId() == zoneId)
player->SendDirectMessage(&data);
Weather* Map::GetOrGenerateZoneDefaultWeather(uint32 zoneId)
{
WeatherData const* weatherData = WeatherMgr::GetWeatherData(zoneId);
if (!weatherData)
return nullptr;

ZoneDynamicInfo& info = _zoneDynamicInfo[zoneId];
if (!info.DefaultWeather)
{
info.DefaultWeather = std::make_unique<Weather>(this, zoneId, weatherData);
info.DefaultWeather->ReGenerate();
info.DefaultWeather->UpdateWeather();
}

return info.DefaultWeather.get();
}

void Map::SetZoneOverrideLight(uint32 zoneId, uint32 lightId, uint32 fadeInTime)
void Map::SetZoneWeather(uint32 zoneId, WeatherState weatherId, float intensity)
{
if (_zoneDynamicInfo.find(zoneId) == _zoneDynamicInfo.end())
_zoneDynamicInfo.insert(ZoneDynamicInfoMap::value_type(zoneId, ZoneDynamicInfo()));
ZoneDynamicInfo& info = _zoneDynamicInfo[zoneId];
info.WeatherId = weatherId;
info.Intensity = intensity;

SendZoneMessage(zoneId, WorldPackets::Misc::Weather(weatherId, intensity).Write());
}

void Map::SetZoneOverrideLight(uint32 zoneId, uint32 areaLightId, uint32 overrideLightId, Milliseconds transitionTime)
{
ZoneDynamicInfo& info = _zoneDynamicInfo[zoneId];
info.OverrideLightId = lightId;
info.LightFadeInTime = fadeInTime;
Map::PlayerList const& players = GetPlayers();
// client can support only one override for each light (zone independent)
info.LightOverrides.erase(std::remove_if(info.LightOverrides.begin(), info.LightOverrides.end(), [areaLightId](ZoneDynamicInfo::LightOverride const& lightOverride)
{
return lightOverride.AreaLightId == areaLightId;
}), info.LightOverrides.end());

// set new override (if any)
if (overrideLightId)
{
ZoneDynamicInfo::LightOverride& lightOverride = info.LightOverrides.emplace_back();
lightOverride.AreaLightId = areaLightId;
lightOverride.OverrideLightId = overrideLightId;
lightOverride.TransitionMilliseconds = static_cast<uint32>(transitionTime.count());
}

Map::PlayerList const& players = GetPlayers();
if (!players.isEmpty())
{
WorldPacket data(SMSG_OVERRIDE_LIGHT, 4 + 4 + 1);
data << uint32(_defaultLight);
data << uint32(lightId);
data << uint32(fadeInTime);
WorldPackets::Misc::OverrideLight overrideLight;
overrideLight.AreaLightID = areaLightId;
overrideLight.OverrideLightID = overrideLightId;
overrideLight.TransitionMilliseconds = static_cast<uint32>(transitionTime.count());
overrideLight.Write();

for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (Player* player = itr->GetSource())
if (player->GetZoneId() == zoneId)
player->SendDirectMessage(&data);
player->SendDirectMessage(overrideLight.GetRawPacket());
}
}

Loading

0 comments on commit 5006264

Please sign in to comment.