Changeset 120

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

[svn] * Allow WorldObjects? to keep the grid active, and prevent it from being unloaded. This can be done through calling WorldObject::setActive(bool) from the scripting library. Note that entire instances are still unloaded if no player is present on that map to save resources. This behavior can be changed if the need arises.

Original author: w12x
Date: 2008-10-27 08:41:55-05:00

Location:
trunk/src/game
Files:
13 modified

Legend:

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

    r102 r120  
    4848    ///- Register the dynamicObject for guid lookup 
    4949    if(!IsInWorld()) ObjectAccessor::Instance().AddObject(this); 
    50     Object::AddToWorld(); 
     50    WorldObject::AddToWorld(); 
    5151} 
    5252 
     
    5555    ///- Remove the dynamicObject from the accessor 
    5656    if(IsInWorld()) ObjectAccessor::Instance().RemoveObject(this); 
    57     Object::RemoveFromWorld(); 
     57    WorldObject::RemoveFromWorld(); 
    5858} 
    5959 
  • trunk/src/game/GameObject.cpp

    r102 r120  
    8383    ///- Register the gameobject for guid lookup 
    8484    if(!IsInWorld()) ObjectAccessor::Instance().AddObject(this); 
    85     Object::AddToWorld(); 
     85    WorldObject::AddToWorld(); 
    8686} 
    8787 
     
    9090    ///- Remove the gameobject from the accessor 
    9191    if(IsInWorld()) ObjectAccessor::Instance().RemoveObject(this); 
    92     Object::RemoveFromWorld(); 
     92    WorldObject::RemoveFromWorld(); 
    9393} 
    9494 
  • trunk/src/game/GridStates.cpp

    r102 r120  
    3737    if( info.getTimeTracker().Passed() ) 
    3838    { 
    39         if( grid.ActiveObjectsInGrid() == 0 && !ObjectAccessor::Instance().PlayersNearGrid(x, y, m.GetId(), m.GetInstanceId()) ) 
     39        if( grid.ActiveObjectsInGrid() == 0 && !ObjectAccessor::Instance().ActiveObjectsNearGrid(x, y, m.GetId(), m.GetInstanceId()) ) 
    4040        { 
    4141            ObjectGridStoper stoper(grid); 
  • trunk/src/game/Map.cpp

    r118 r120  
    879879 
    880880    { 
    881         if(!pForce && ObjectAccessor::Instance().PlayersNearGrid(x, y, i_id, i_InstanceId) ) 
     881        if(!pForce && ObjectAccessor::Instance().ActiveObjectsNearGrid(x, y, i_id, i_InstanceId) ) 
    882882            return false; 
    883883 
  • trunk/src/game/Object.cpp

    r119 r120  
    975975 
    976976    mSemaphoreTeleport  = false; 
     977 
     978    m_isActive          = false; 
     979} 
     980 
     981WorldObject::~WorldObject() 
     982{ 
     983    if(m_isActive && IsInWorld()) 
     984        ObjectAccessor::Instance().RemoveActiveObject(this); 
     985} 
     986 
     987void WorldObject::setActive(bool isActive) 
     988{ 
     989    // if already in the same activity state as we try to set, do nothing 
     990    if(isActive == m_isActive) 
     991        return; 
     992    m_isActive = isActive; 
     993    if(IsInWorld()) 
     994    { 
     995        if(isActive) 
     996            ObjectAccessor::Instance().AddActiveObject(this); 
     997        else 
     998            ObjectAccessor::Instance().RemoveActiveObject(this); 
     999    } 
     1000} 
     1001 
     1002void WorldObject::AddToWorld() 
     1003{ 
     1004    Object::AddToWorld(); 
     1005    if(m_isActive) 
     1006        ObjectAccessor::Instance().AddActiveObject(this); 
     1007} 
     1008 
     1009void WorldObject::RemoveFromWorld() 
     1010{ 
     1011    if(m_isActive) 
     1012        ObjectAccessor::Instance().RemoveActiveObject(this); 
     1013    Object::RemoveFromWorld(); 
    9771014} 
    9781015 
  • trunk/src/game/Object.h

    r119 r120  
    2828#include "GameSystem/GridReference.h" 
    2929#include "ObjectDefines.h" 
     30#include "GridDefines.h" 
    3031 
    3132#include <set> 
     
    324325{ 
    325326    public: 
    326         virtual ~WorldObject ( ) {} 
     327        virtual ~WorldObject ( ); 
     328 
     329        virtual void AddToWorld(); 
     330 
     331        virtual void RemoveFromWorld(); 
    327332 
    328333        virtual void Update ( uint32 /*time_diff*/ ) { } 
     
    449454        Creature* SummonCreature(uint32 id, float x, float y, float z, float ang,TempSummonType spwtype,uint32 despwtime); 
    450455        GameObject* SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime); 
     456        bool isActive() const { return m_isActive; } 
     457        virtual void setActive(bool isActive); 
    451458    protected: 
    452459        explicit WorldObject(); 
    453460        std::string m_name; 
     461        bool m_isActive; 
    454462 
    455463    private: 
  • trunk/src/game/ObjectAccessor.cpp

    r102 r120  
    506506 
    507507void 
     508ObjectAccessor::AddActiveObject( WorldObject * obj ) 
     509{ 
     510    i_activeobjects.insert(obj); 
     511} 
     512 
     513void 
     514ObjectAccessor::RemoveActiveObject( WorldObject * obj ) 
     515{ 
     516    i_activeobjects.erase(obj); 
     517} 
     518 
     519void 
    508520ObjectAccessor::Update(uint32 diff) 
    509521{ 
    510522    { 
    511         typedef std::multimap<uint32, Player *> CreatureLocationHolderType; 
    512         CreatureLocationHolderType creature_locations; 
    513         //TODO: Player guard 
     523        // player update might remove the player from grid, and that causes crashes. We HAVE to update players first, and then the active objects. 
    514524        HashMapHolder<Player>::MapType& playerMap = HashMapHolder<Player>::GetContainer(); 
    515525        for(HashMapHolder<Player>::MapType::iterator iter = playerMap.begin(); iter != playerMap.end(); ++iter) 
     
    518528            { 
    519529                iter->second->Update(diff); 
    520                 creature_locations.insert( CreatureLocationHolderType::value_type(iter->second->GetMapId(), iter->second) ); 
    521530            } 
     531        } 
     532 
     533        // clone the active object list, because update might remove from it 
     534        std::set<WorldObject *> activeobjects(i_activeobjects); 
     535 
     536        std::set<WorldObject *>::const_iterator itr; 
     537        for(itr = activeobjects.begin(); itr != activeobjects.end(); ++itr) 
     538        { 
     539            (*itr)->GetMap()->resetMarkedCells(); 
    522540        } 
    523541 
     
    530548        TypeContainerVisitor<Trinity::ObjectUpdater, WorldTypeMapContainer > world_object_update(updater); 
    531549 
    532         for(CreatureLocationHolderType::iterator iter=creature_locations.begin(); iter != creature_locations.end(); ++iter) 
    533         { 
    534             MapManager::Instance().GetMap((*iter).first, (*iter).second)->resetMarkedCells(); 
    535         } 
    536  
    537         for(CreatureLocationHolderType::iterator iter=creature_locations.begin(); iter != creature_locations.end(); ++iter) 
    538         { 
    539             Player *player = (*iter).second; 
    540             map = MapManager::Instance().GetMap((*iter).first, player); 
    541  
    542             CellPair standing_cell(Trinity::ComputeCellPair(player->GetPositionX(), player->GetPositionY())); 
     550        for(itr = activeobjects.begin(); itr != activeobjects.end(); ++itr) 
     551        { 
     552            WorldObject *obj = (*itr); 
     553            map = obj->GetMap(); 
     554 
     555            CellPair standing_cell(Trinity::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY())); 
    543556 
    544557            // Check for correctness of standing_cell, it also avoids problems with update_cell 
     
    577590 
    578591bool 
    579 ObjectAccessor::PlayersNearGrid(uint32 x, uint32 y, uint32 m_id, uint32 i_id) const 
     592ObjectAccessor::ActiveObjectsNearGrid(uint32 x, uint32 y, uint32 m_id, uint32 i_id) const 
    580593{ 
    581594    CellPair cell_min(x*MAX_NUMBER_OF_CELLS, y*MAX_NUMBER_OF_CELLS); 
     
    586599    cell_max += 2; 
    587600 
    588     //TODO: Guard player 
    589     HashMapHolder<Player>::MapType& playerMap = HashMapHolder<Player>::GetContainer(); 
    590     for(HashMapHolder<Player>::MapType::const_iterator iter=playerMap.begin(); iter != playerMap.end(); ++iter) 
    591     { 
    592         if( m_id != iter->second->GetMapId() || i_id != iter->second->GetInstanceId() ) 
     601    for(std::set<WorldObject*>::const_iterator itr = i_activeobjects.begin(); itr != i_activeobjects.end(); ++itr) 
     602    { 
     603        if( m_id != (*itr)->GetMapId() || i_id != (*itr)->GetInstanceId() ) 
    593604            continue; 
    594605 
    595         CellPair p = Trinity::ComputeCellPair(iter->second->GetPositionX(), iter->second->GetPositionY()); 
     606        CellPair p = Trinity::ComputeCellPair((*itr)->GetPositionX(), (*itr)->GetPositionY()); 
    596607        if( (cell_min.x_coord <= p.x_coord && p.x_coord <= cell_max.x_coord) && 
    597608            (cell_min.y_coord <= p.y_coord && p.y_coord <= cell_max.y_coord) ) 
    598609            return true; 
     610 
    599611    } 
    600612 
  • trunk/src/game/ObjectAccessor.h

    r102 r120  
    194194        Corpse* ConvertCorpseForPlayer(uint64 player_guid); 
    195195 
    196         bool PlayersNearGrid(uint32 x,uint32 y,uint32 m_id,uint32 i_id) const; 
     196        bool ActiveObjectsNearGrid(uint32 x,uint32 y,uint32 m_id,uint32 i_id) const; 
    197197 
    198198        static void UpdateObject(Object* obj, Player* exceptPlayer); 
     
    201201        static void UpdateObjectVisibility(WorldObject* obj); 
    202202        static void UpdateVisibilityForPlayer(Player* player); 
     203 
     204        void AddActiveObject(WorldObject*); 
     205        void RemoveActiveObject(WorldObject*); 
    203206    private: 
    204207        struct WorldObjectChangeAccumulator 
     
    221224        void _update(void); 
    222225        std::set<Object *> i_objects; 
     226        std::set<WorldObject *> i_activeobjects; 
    223227        LockType i_playerGuard; 
    224228        LockType i_updateGuard; 
  • trunk/src/game/Pet.cpp

    r102 r120  
    9797    m_autospells.clear(); 
    9898    m_declinedname = NULL; 
     99    m_isActive = true; 
    99100} 
    100101 
  • trunk/src/game/Pet.h

    r102 r120  
    123123        void AddToWorld(); 
    124124        void RemoveFromWorld(); 
     125        // always active 
     126        void setActive() {} 
    125127 
    126128        PetType getPetType() const { return m_petType; } 
  • trunk/src/game/Player.cpp

    r111 r120  
    426426 
    427427    m_declinedname = NULL; 
     428 
     429    m_isActive = true; 
    428430} 
    429431 
  • trunk/src/game/Player.h

    r102 r120  
    903903        void AddToWorld(); 
    904904        void RemoveFromWorld(); 
     905        // always active 
     906        void setActive() {} 
    905907 
    906908        bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options = 0); 
  • trunk/src/game/Unit.cpp

    r111 r120  
    98279827void Unit::AddToWorld() 
    98289828{ 
    9829     Object::AddToWorld(); 
     9829    WorldObject::AddToWorld(); 
    98309830} 
    98319831 
     
    98389838    } 
    98399839 
    9840     Object::RemoveFromWorld(); 
     9840    WorldObject::RemoveFromWorld(); 
    98419841} 
    98429842