Changeset 174 for trunk/src/game/Map.cpp

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/Map.cpp

    r173 r174  
    256256{ 
    257257    // add to world object registry in grid 
    258     if(obj->isPet()) 
     258    if(obj->isPet() || obj->isPossessedByPlayer()) 
    259259    { 
    260260        (*grid)(cell.CellX(), cell.CellY()).AddWorldObject<Creature>(obj, obj->GetGUID()); 
     
    300300{ 
    301301    // remove from world object registry in grid 
    302     if(obj->isPet()) 
     302    if(obj->isPet() || obj->isPossessedByPlayer()) 
    303303    { 
    304304        (*grid)(cell.CellX(), cell.CellY()).RemoveWorldObject<Creature>(obj, obj->GetGUID()); 
     
    310310    } 
    311311} 
     312 
     313template<class T> 
     314void Map::SwitchGridContainers(T* obj, bool active) 
     315{ 
     316    CellPair pair = Trinity::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY()); 
     317    Cell cell(pair); 
     318    NGridType *grid = getNGrid(cell.GridX(), cell.GridY()); 
     319 
     320    if (active) 
     321    { 
     322        (*grid)(cell.CellX(), cell.CellY()).RemoveGridObject<T>(obj, obj->GetGUID()); 
     323        (*grid)(cell.CellX(), cell.CellY()).AddWorldObject<T>(obj, obj->GetGUID()); 
     324    } else 
     325    { 
     326        (*grid)(cell.CellX(), cell.CellY()).RemoveWorldObject<T>(obj, obj->GetGUID()); 
     327        (*grid)(cell.CellX(), cell.CellY()).AddGridObject<T>(obj, obj->GetGUID()); 
     328    } 
     329} 
     330 
     331template void Map::SwitchGridContainers(Creature *, bool); 
     332template void Map::SwitchGridContainers(Corpse *, bool); 
    312333 
    313334template<class T> 
     
    468489} 
    469490 
    470 void Map::MessageBroadcast(Player *player, WorldPacket *msg, bool to_self) 
     491void Map::MessageBroadcast(Player *player, WorldPacket *msg, bool to_self, bool to_possessor) 
    471492{ 
    472493    CellPair p = Trinity::ComputeCellPair(player->GetPositionX(), player->GetPositionY()); 
     
    484505        return; 
    485506 
    486     Trinity::MessageDeliverer post_man(*player, msg, to_self); 
     507    Trinity::MessageDeliverer post_man(*player, msg, to_possessor, to_self); 
    487508    TypeContainerVisitor<Trinity::MessageDeliverer, WorldTypeMapContainer > message(post_man); 
    488509    CellLock<ReadGuard> cell_lock(cell, p); 
     
    490511} 
    491512 
    492 void Map::MessageBroadcast(WorldObject *obj, WorldPacket *msg) 
     513void Map::MessageBroadcast(WorldObject *obj, WorldPacket *msg, bool to_possessor) 
    493514{ 
    494515    CellPair p = Trinity::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY()); 
     
    507528        return; 
    508529 
    509     Trinity::ObjectMessageDeliverer post_man(msg); 
     530    Trinity::ObjectMessageDeliverer post_man(*obj, msg, to_possessor); 
    510531    TypeContainerVisitor<Trinity::ObjectMessageDeliverer, WorldTypeMapContainer > message(post_man); 
    511532    CellLock<ReadGuard> cell_lock(cell, p); 
     
    513534} 
    514535 
    515 void Map::MessageDistBroadcast(Player *player, WorldPacket *msg, float dist, bool to_self, bool own_team_only) 
     536void Map::MessageDistBroadcast(Player *player, WorldPacket *msg, float dist, bool to_self, bool own_team_only, bool to_possessor) 
    516537{ 
    517538    CellPair p = Trinity::ComputeCellPair(player->GetPositionX(), player->GetPositionY()); 
     
    529550        return; 
    530551 
    531     Trinity::MessageDistDeliverer post_man(*player, msg, dist, to_self, own_team_only); 
     552    Trinity::MessageDistDeliverer post_man(*player, msg, to_possessor, dist, to_self, own_team_only); 
    532553    TypeContainerVisitor<Trinity::MessageDistDeliverer , WorldTypeMapContainer > message(post_man); 
    533554    CellLock<ReadGuard> cell_lock(cell, p); 
     
    535556} 
    536557 
    537 void Map::MessageDistBroadcast(WorldObject *obj, WorldPacket *msg, float dist) 
     558void Map::MessageDistBroadcast(WorldObject *obj, WorldPacket *msg, float dist, bool to_possessor) 
    538559{ 
    539560    CellPair p = Trinity::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY()); 
     
    552573        return; 
    553574 
    554     Trinity::ObjectMessageDistDeliverer post_man(*obj, msg,dist); 
     575    Trinity::ObjectMessageDistDeliverer post_man(*obj, msg, to_possessor, dist); 
    555576    TypeContainerVisitor<Trinity::ObjectMessageDistDeliverer, WorldTypeMapContainer > message(post_man); 
    556577    CellLock<ReadGuard> cell_lock(cell, p); 
     
    650671 
    651672    obj->RemoveFromWorld(); 
     673 
    652674    RemoveFromGrid(obj,grid,cell); 
    653675 
     
    698720    UpdatePlayerVisibility(player,new_cell,new_val); 
    699721    UpdateObjectsVisibilityFor(player,new_cell,new_val); 
     722 
     723    // also update what possessing player sees 
     724    if(player->isPossessedByPlayer()) 
     725        UpdateObjectsVisibilityFor((Player*)player->GetCharmer(), new_cell, new_val); 
     726 
    700727    PlayerRelocationNotify(player,new_cell,new_val); 
    701728    NGridType* newGrid = getNGrid(new_cell.GridX(), new_cell.GridY()); 
     
    726753        AddCreatureToMoveList(creature,x,y,z,ang); 
    727754        // in diffcell/diffgrid case notifiers called at finishing move creature in Map::MoveAllCreaturesInMoveList 
     755        if(creature->isPossessedByPlayer()) 
     756            EnsureGridLoadedForPlayer(new_cell, (Player*)creature->GetCharmer(), false); 
    728757    } 
    729758    else 
    730759    { 
    731760        creature->Relocate(x, y, z, ang); 
     761        // Update visibility back to player who is controlling the creature 
     762        if(creature->isPossessedByPlayer()) 
     763            UpdateObjectsVisibilityFor((Player*)creature->GetCharmer(), new_cell, new_val); 
     764 
    732765        CreatureRelocationNotify(creature,new_cell,new_val); 
    733766    }