Show
Ignore:
Timestamp:
11/19/08 13:43:15 (17 years ago)
Author:
yumileroy
Message:

[svn] Implemented player on player and player on creature possession:
* Implemented packet and vision forwarding through possessed units
* Added new OnPossess? script call alerting scripts on when possession is applied/removed
* Moved fall damage and fall under map calculations into the Player class
* Added new PossessedAI that is applied only while possession on creature is active
* Implemented summon possessed spell effect
* Fixed Eyes of the Beast

Original author: gvcoman
Date: 2008-11-05 20:51:05-06:00

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/game/GridNotifiers.cpp

    r102 r174  
    4141        iter->getSource()->UpdateVisibilityOf(&i_player); 
    4242        i_player.UpdateVisibilityOf(iter->getSource()); 
     43        if (i_player.isPossessedByPlayer()) 
     44            ((Player*)i_player.GetCharmer())->UpdateVisibilityOf(iter->getSource()); 
    4345    } 
    4446} 
     
    140142} 
    141143 
    142 void 
    143 MessageDeliverer::Visit(PlayerMapType &m) 
    144 { 
    145     for(PlayerMapType::iterator iter=m.begin(); iter != m.end(); ++iter) 
    146     { 
    147         if( i_toSelf || iter->getSource() != &i_player) 
    148         { 
    149             if(WorldSession* session = iter->getSource()->GetSession()) 
    150                 session->SendPacket(i_message); 
    151         } 
    152     } 
    153 } 
    154  
    155 void 
    156 ObjectMessageDeliverer::Visit(PlayerMapType &m) 
    157 { 
    158     for(PlayerMapType::iterator iter=m.begin(); iter != m.end(); ++iter) 
    159     { 
    160         if(WorldSession* session = iter->getSource()->GetSession()) 
     144void  
     145Deliverer::Visit(PlayerMapType &m) 
     146{ 
     147    for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter) 
     148    { 
     149        if (!i_dist || iter->getSource()->GetDistance(&i_source) <= i_dist) 
     150        { 
     151            // Send packet to possessor 
     152            if (iter->getSource()->isPossessedByPlayer()) 
     153                SendPacket((Player*)iter->getSource()->GetCharmer()); 
     154            VisitObject(iter->getSource()); 
     155        } 
     156    } 
     157} 
     158 
     159void  
     160Deliverer::Visit(CreatureMapType &m) 
     161{ 
     162    for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter) 
     163    { 
     164        if (!i_dist || iter->getSource()->GetDistance(&i_source) <= i_dist) 
     165        { 
     166            // Send packet to possessor 
     167            if (iter->getSource()->isPossessedByPlayer()) 
     168                SendPacket((Player*)iter->getSource()->GetCharmer()); 
     169        } 
     170    } 
     171} 
     172 
     173void 
     174Deliverer::SendPacket(Player* plr) 
     175{ 
     176    if (!plr) 
     177        return; 
     178    // Don't send the packet to possesor if not supposed to 
     179    if (!i_toPossessor && plr->isPossessing() && plr->GetCharmGUID() == i_source.GetGUID()) 
     180        return; 
     181 
     182    if (plr_list.find(plr->GetGUID()) == plr_list.end()) 
     183    { 
     184        if (WorldSession* session = plr->GetSession()) 
    161185            session->SendPacket(i_message); 
    162     } 
    163 } 
    164  
    165 void 
    166 MessageDistDeliverer::Visit(PlayerMapType &m) 
    167 { 
    168     for(PlayerMapType::iterator iter=m.begin(); iter != m.end(); ++iter) 
    169     { 
    170         if( (i_toSelf || iter->getSource() != &i_player ) && 
    171             (!i_ownTeamOnly || iter->getSource()->GetTeam() == i_player.GetTeam() ) && 
    172             (!i_dist || iter->getSource()->GetDistance(&i_player) <= i_dist) ) 
    173         { 
    174             if(WorldSession* session = iter->getSource()->GetSession()) 
    175                 session->SendPacket(i_message); 
    176         } 
    177     } 
    178 } 
    179  
    180 void 
    181 ObjectMessageDistDeliverer::Visit(PlayerMapType &m) 
    182 { 
    183     for(PlayerMapType::iterator iter=m.begin(); iter != m.end(); ++iter) 
    184     { 
    185         if( !i_dist || iter->getSource()->GetDistance(&i_object) <= i_dist ) 
    186         { 
    187             if(WorldSession* session = iter->getSource()->GetSession()) 
    188                 session->SendPacket(i_message); 
    189         } 
     186        plr_list.insert(plr->GetGUID()); 
     187    } 
     188} 
     189 
     190void 
     191MessageDeliverer::VisitObject(Player* plr) 
     192{ 
     193    if (i_toSelf || plr != &i_source) 
     194        SendPacket(plr); 
     195} 
     196 
     197void 
     198MessageDistDeliverer::VisitObject(Player* plr) 
     199{ 
     200    if( (i_toSelf || plr != &i_source ) && 
     201        (!i_ownTeamOnly || (i_source.GetTypeId() == TYPEID_PLAYER && plr->GetTeam() == ((Player&)i_source).GetTeam())) ) 
     202    { 
     203        SendPacket(plr); 
    190204    } 
    191205}