Phase system development continue.

* Use WorldObject phase mask field instead explicit aura scan. This allow have phase for any world objects.
* Add phase checks to packet broadcasters/object searchers. This let correctly work say/yell/area
  and multi/random target spells/aggro assistance in phased areas or target selection.
* In GM-mode character presense (see and visible) in all phases except normal visibility efects including GM-visibility.

TODO: summoned objects phase set base at owner phase, load phase mask for creatures/gameobjects from DB, in game commands.
This commit is contained in:
VladimirMangos 2009-01-29 02:47:28 +03:00
parent 0c43a425e8
commit b5da610388
16 changed files with 223 additions and 121 deletions

View file

@ -142,8 +142,11 @@ MessageDeliverer::Visit(PlayerMapType &m)
{
for(PlayerMapType::iterator iter=m.begin(); iter != m.end(); ++iter)
{
if( i_toSelf || iter->getSource() != &i_player)
if (i_toSelf || iter->getSource() != &i_player)
{
if (!i_player.InSamePhase(iter->getSource()))
continue;
if(WorldSession* session = iter->getSource()->GetSession())
session->SendPacket(i_message);
}
@ -155,6 +158,9 @@ ObjectMessageDeliverer::Visit(PlayerMapType &m)
{
for(PlayerMapType::iterator iter=m.begin(); iter != m.end(); ++iter)
{
if(!iter->getSource()->InSamePhase(i_phaseMask))
continue;
if(WorldSession* session = iter->getSource()->GetSession())
session->SendPacket(i_message);
}
@ -169,6 +175,9 @@ MessageDistDeliverer::Visit(PlayerMapType &m)
(!i_ownTeamOnly || iter->getSource()->GetTeam() == i_player.GetTeam() ) &&
(!i_dist || iter->getSource()->GetDistance(&i_player) <= i_dist) )
{
if (!i_player.InSamePhase(iter->getSource()))
continue;
if(WorldSession* session = iter->getSource()->GetSession())
session->SendPacket(i_message);
}
@ -182,6 +191,9 @@ ObjectMessageDistDeliverer::Visit(PlayerMapType &m)
{
if( !i_dist || iter->getSource()->GetDistance(&i_object) <= i_dist )
{
if( !i_object.InSamePhase(iter->getSource()))
continue;
if(WorldSession* session = iter->getSource()->GetSession())
session->SendPacket(i_message);
}