diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/server/game/Entities/Creature/Creature.cpp | 10 | ||||
| -rwxr-xr-x | src/server/game/Entities/GameObject/GameObject.cpp | 12 | ||||
| -rwxr-xr-x | src/server/game/Globals/ObjectMgr.cpp | 178 | ||||
| -rwxr-xr-x | src/server/game/Globals/ObjectMgr.h | 38 | ||||
| -rwxr-xr-x | src/server/game/Instances/InstanceSaveMgr.cpp | 2 | ||||
| -rwxr-xr-x | src/server/game/Maps/Map.cpp | 127 | ||||
| -rwxr-xr-x | src/server/game/Maps/Map.h | 34 | ||||
| -rwxr-xr-x | src/server/game/Maps/MapInstanced.cpp | 2 | ||||
| -rwxr-xr-x | src/server/game/Maps/MapManager.cpp | 1 | ||||
| -rw-r--r-- | src/server/game/Movement/Spline/MoveSplineInit.cpp | 3 | ||||
| -rwxr-xr-x | src/server/game/OutdoorPvP/OutdoorPvP.cpp | 4 | ||||
| -rwxr-xr-x | src/server/game/World/World.cpp | 6 | ||||
| -rw-r--r-- | src/server/shared/Database/Implementation/CharacterDatabase.cpp | 17 | ||||
| -rw-r--r-- | src/server/shared/Database/Implementation/CharacterDatabase.h | 1 | 
14 files changed, 187 insertions, 248 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index e8ec686daf5..07e8e37e82a 100755 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -486,7 +486,7 @@ void Creature::Update(uint32 diff)                      break;                  uint64 dbtableHighGuid = MAKE_NEW_GUID(m_DBTableGuid, GetEntry(), HIGHGUID_UNIT); -                time_t linkedRespawntime = sObjectMgr->GetLinkedRespawnTime(dbtableHighGuid, GetMap()->GetInstanceId()); +                time_t linkedRespawntime = GetMap()->GetLinkedRespawnTime(dbtableHighGuid);                  if (!linkedRespawntime)             // Can respawn                      Respawn();                  else                                // the master is dead @@ -1303,7 +1303,7 @@ bool Creature::LoadCreatureFromDB(uint32 guid, Map* map, bool addToMap)      m_respawnDelay = data->spawntimesecs;      m_deathState = ALIVE; -    m_respawnTime  = sObjectMgr->GetCreatureRespawnTime(m_DBTableGuid, GetInstanceId()); +    m_respawnTime  = GetMap()->GetCreatureRespawnTime(m_DBTableGuid);      if (m_respawnTime)                          // respawn on Update      {          m_deathState = DEAD; @@ -1398,7 +1398,7 @@ void Creature::DeleteFromDB()          return;      } -    sObjectMgr->RemoveCreatureRespawnTime(m_DBTableGuid, GetInstanceId()); +    GetMap()->RemoveCreatureRespawnTime(m_DBTableGuid);      sObjectMgr->DeleteCreatureData(m_DBTableGuid);      SQLTransaction trans = WorldDatabase.BeginTransaction(); @@ -1598,7 +1598,7 @@ void Creature::Respawn(bool force)      if (getDeathState() == DEAD)      {          if (m_DBTableGuid) -            sObjectMgr->RemoveCreatureRespawnTime(m_DBTableGuid, GetInstanceId()); +            GetMap()->RemoveCreatureRespawnTime(m_DBTableGuid);          sLog->outStaticDebug("Respawning creature %s (GuidLow: %u, Full GUID: " UI64FMTD " Entry: %u)", GetName(), GetGUIDLow(), GetGUID(), GetEntry());          m_respawnTime = 0; @@ -2013,7 +2013,7 @@ void Creature::SaveRespawnTime()      if (isSummon() || !m_DBTableGuid || (m_creatureData && !m_creatureData->dbData))          return; -    sObjectMgr->SaveCreatureRespawnTime(m_DBTableGuid, GetInstanceId(), m_respawnTime); +    GetMap()->SaveCreatureRespawnTime(m_DBTableGuid, m_respawnTime);  }  // this should not be called by petAI or diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 5101d01899d..58440095075 100755 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -338,7 +338,7 @@ void GameObject::Update(uint32 diff)                  if (m_respawnTime <= now)            // timer expired                  {                      uint64 dbtableHighGuid = MAKE_NEW_GUID(m_DBTableGuid, GetEntry(), HIGHGUID_GAMEOBJECT); -                    time_t linkedRespawntime = sObjectMgr->GetLinkedRespawnTime(dbtableHighGuid, GetMap()->GetInstanceId()); +                    time_t linkedRespawntime = GetMap()->GetLinkedRespawnTime(dbtableHighGuid);                      if (linkedRespawntime)             // Can't respawn, the master is dead                      {                          uint64 targetGuid = sObjectMgr->GetLinkedRespawnGuid(dbtableHighGuid); @@ -761,13 +761,13 @@ bool GameObject::LoadGameObjectFromDB(uint32 guid, Map* map, bool addToMap)          else          {              m_respawnDelayTime = data->spawntimesecs; -            m_respawnTime = sObjectMgr->GetGORespawnTime(m_DBTableGuid, map->GetInstanceId()); +            m_respawnTime = GetMap()->GetGORespawnTime(m_DBTableGuid);              // ready to respawn              if (m_respawnTime && m_respawnTime <= time(NULL))              {                  m_respawnTime = 0; -                sObjectMgr->RemoveGORespawnTime(m_DBTableGuid, GetInstanceId()); +                GetMap()->RemoveGORespawnTime(m_DBTableGuid);              }          }      } @@ -788,7 +788,7 @@ bool GameObject::LoadGameObjectFromDB(uint32 guid, Map* map, bool addToMap)  void GameObject::DeleteFromDB()  { -    sObjectMgr->RemoveGORespawnTime(m_DBTableGuid, GetInstanceId()); +    GetMap()->RemoveGORespawnTime(m_DBTableGuid);      sObjectMgr->DeleteGOData(m_DBTableGuid);      PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_GAMEOBJECT); @@ -863,7 +863,7 @@ Unit* GameObject::GetOwner() const  void GameObject::SaveRespawnTime()  {      if (m_goData && m_goData->dbData && m_respawnTime > time(NULL) && m_spawnedByDefault) -        sObjectMgr->SaveGORespawnTime(m_DBTableGuid, GetInstanceId(), m_respawnTime); +        GetMap()->SaveGORespawnTime(m_DBTableGuid, m_respawnTime);  }  bool GameObject::IsAlwaysVisibleFor(WorldObject const* seer) const @@ -908,7 +908,7 @@ void GameObject::Respawn()      if (m_spawnedByDefault && m_respawnTime > 0)      {          m_respawnTime = time(NULL); -        sObjectMgr->RemoveGORespawnTime(m_DBTableGuid, GetInstanceId()); +        GetMap()->RemoveGORespawnTime(m_DBTableGuid);      }  } diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index df6018faf39..65f2ccff476 100755 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -1872,71 +1872,6 @@ void ObjectMgr::RemoveGameobjectFromGrid(uint32 guid, GameObjectData const* data      }  } -void ObjectMgr::LoadCreatureRespawnTimes() -{ -    uint32 oldMSTime = getMSTime(); - -    uint32 count = 0; - -    PreparedQueryResult result = CharacterDatabase.Query(CharacterDatabase.GetPreparedStatement(CHAR_SEL_CREATURE_RESPAWNS)); -    if (!result) -    { -        sLog->outString(">> Loaded 0 creature respawn time."); -        sLog->outString(); -        return; -    } - -    do -    { -        Field* fields = result->Fetch(); - -        uint32 loguid       = fields[0].GetUInt32(); -        uint32 respawn_time = fields[1].GetUInt32(); -        uint32 instance     = fields[2].GetUInt32(); - -        _creatureRespawnTimes[MAKE_PAIR64(loguid, instance)] = time_t(respawn_time); - -        ++count; -    } while (result->NextRow()); - -    sLog->outString(">> Loaded %lu creature respawn times in %u ms", (unsigned long)_creatureRespawnTimes.size(), GetMSTimeDiffToNow(oldMSTime)); -    sLog->outString(); -} - -void ObjectMgr::LoadGameobjectRespawnTimes() -{ -    uint32 oldMSTime = getMSTime(); - -    // Remove outdated data -    CharacterDatabase.DirectExecute("DELETE FROM gameobject_respawn WHERE respawnTime <= UNIX_TIMESTAMP(NOW())"); - -    uint32 count = 0; - -    PreparedQueryResult result = CharacterDatabase.Query(CharacterDatabase.GetPreparedStatement(CHAR_SEL_GO_RESPAWNS)); -    if (!result) -    { -        sLog->outString(">> Loaded 0 gameobject respawn times. DB table `gameobject_respawn` is empty!"); -        sLog->outString(); -        return; -    } - -    do -    { -        Field* fields = result->Fetch(); - -        uint32 loguid       = fields[0].GetUInt32(); -        uint32 respawn_time = fields[1].GetUInt32(); -        uint32 instance     = fields[2].GetUInt32(); - -        _goRespawnTimes[MAKE_PAIR64(loguid, instance)] = time_t(respawn_time); - -        ++count; -    } while (result->NextRow()); - -    sLog->outString(); -    sLog->outString(">> Loaded %lu gameobject respawn times in %u ms", (unsigned long)_goRespawnTimes.size(), GetMSTimeDiffToNow(oldMSTime)); -} -  Player* ObjectMgr::GetPlayerByLowGUID(uint32 lowguid) const  {      uint64 guid = MAKE_NEW_GUID(lowguid, 0, HIGHGUID_PLAYER); @@ -7172,44 +7107,6 @@ void ObjectMgr::LoadNPCSpellClickSpells()      sLog->outString();  } -void ObjectMgr::SaveCreatureRespawnTime(uint32 loguid, uint32 instance, time_t t) -{ -    if (!t) -    { -        // Delete only -        RemoveCreatureRespawnTime(loguid, instance); -        return; -    } - -    // This function can be called from various map threads concurrently -    { -        _creatureRespawnTimesMutex.acquire(); -        _creatureRespawnTimes[MAKE_PAIR64(loguid, instance)] = t; -        _creatureRespawnTimesMutex.release(); -    } - -    PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CREATURE_RESPAWN); -    stmt->setUInt32(0, loguid); -    stmt->setUInt32(1, uint32(t)); -    stmt->setUInt32(2, instance); -    CharacterDatabase.Execute(stmt); -} - -void ObjectMgr::RemoveCreatureRespawnTime(uint32 loguid, uint32 instance) -{ -    // This function can be called from various map threads concurrently -    { -        _creatureRespawnTimesMutex.acquire(); -        _creatureRespawnTimes[MAKE_PAIR64(loguid, instance)] = 0; -        _creatureRespawnTimesMutex.release(); -    } - -    PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN); -    stmt->setUInt32(0, loguid); -    stmt->setUInt32(1, instance); -    CharacterDatabase.Execute(stmt); -} -  void ObjectMgr::DeleteCreatureData(uint32 guid)  {      // remove mapid*cellid -> guid_set map @@ -7220,81 +7117,6 @@ void ObjectMgr::DeleteCreatureData(uint32 guid)      _creatureDataStore.erase(guid);  } -void ObjectMgr::SaveGORespawnTime(uint32 loguid, uint32 instance, time_t t) -{ -    if (!t) -    { -        // Delete only -        RemoveGORespawnTime(loguid, instance); -        return; -    } - -    // This function can be called from different map threads concurrently -    { -        _goRespawnTimesMutex.acquire(); -        _goRespawnTimes[MAKE_PAIR64(loguid, instance)] = t; -        _goRespawnTimesMutex.release(); -    } - -    PreparedStatement *stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GO_RESPAWN); -    stmt->setUInt32(0, loguid); -    stmt->setUInt64(1, uint64(t)); -    stmt->setUInt32(2, instance); -    CharacterDatabase.Execute(stmt); -} - -void ObjectMgr::RemoveGORespawnTime(uint32 loguid, uint32 instance) -{ -    // This function can be called from different map threads concurrently -    { -        _goRespawnTimesMutex.acquire(); -        _goRespawnTimes[MAKE_PAIR64(loguid, instance)] = 0; -        _goRespawnTimesMutex.release(); -    } - -    PreparedStatement *stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GO_RESPAWN); -    stmt->setUInt32(0, loguid); -    stmt->setUInt32(1, instance); -    CharacterDatabase.Execute(stmt); -} - -void ObjectMgr::DeleteRespawnTimeForInstance(uint32 instance) -{ -    // This function can be called from different map threads concurrently -    RespawnTimes::iterator next; - -    { -        _goRespawnTimesMutex.acquire(); -        for (RespawnTimes::iterator itr = _goRespawnTimes.begin(); itr != _goRespawnTimes.end(); itr = next) -        { -            next = itr; -            ++next; - -            if (GUID_HIPART(itr->first) == instance) -                _goRespawnTimes.erase(itr); -        } -        _goRespawnTimesMutex.release(); -    } -    { -        _creatureRespawnTimesMutex.acquire(); -        for (RespawnTimes::iterator itr = _creatureRespawnTimes.begin(); itr != _creatureRespawnTimes.end(); itr = next) -        { -            next = itr; -            ++next; - -            if (GUID_HIPART(itr->first) == instance) -                _creatureRespawnTimes.erase(itr); -        } -        _creatureRespawnTimesMutex.release(); -    } -    PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE); -    stmt->setUInt32(0, instance); -    CharacterDatabase.Execute(stmt); -    stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GO_RESPAWN_BY_INSTANCE); -    stmt->setUInt32(0, instance); -    CharacterDatabase.Execute(stmt); -} -  void ObjectMgr::DeleteGOData(uint32 guid)  {      // remove mapid*cellid -> guid_set map diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index f81e7f1f074..97c2f0234ba 100755 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -367,8 +367,6 @@ struct CellObjectGuids  typedef UNORDERED_MAP<uint32/*cell_id*/, CellObjectGuids> CellObjectGuidsMap;  typedef UNORDERED_MAP<uint32/*(mapid, spawnMode) pair*/, CellObjectGuidsMap> MapObjectGuids; -typedef UNORDERED_MAP<uint64/*(instance, guid) pair*/, time_t> RespawnTimes; -  // Trinity string ranges  #define MIN_TRINITY_STRING_ID           1                    // 'trinity_string'  #define MAX_TRINITY_STRING_ID           2000000000 @@ -854,13 +852,11 @@ class ObjectMgr          void LoadCreatures();          void LoadLinkedRespawn();          bool SetCreatureLinkedRespawn(uint32 guid, uint32 linkedGuid); -        void LoadCreatureRespawnTimes();          void LoadCreatureAddons();          void LoadCreatureModelInfo();          void LoadEquipmentTemplates();          void LoadGameObjectLocales();          void LoadGameobjects(); -        void LoadGameobjectRespawnTimes();          void LoadItemTemplates();          void LoadItemLocales();          void LoadItemSetNames(); @@ -1048,36 +1044,6 @@ class ObjectMgr          void AddCorpseCellData(uint32 mapid, uint32 cellid, uint32 player_guid, uint32 instance);          void DeleteCorpseCellData(uint32 mapid, uint32 cellid, uint32 player_guid); -        time_t GetLinkedRespawnTime(uint64 guid, uint32 instance) -        { -            uint64 linkedGuid = GetLinkedRespawnGuid(guid); -            switch (GUID_HIPART(linkedGuid)) -            { -                case HIGHGUID_UNIT: -                    return GetCreatureRespawnTime(GUID_LOPART(linkedGuid), instance); -                case HIGHGUID_GAMEOBJECT: -                    return GetGORespawnTime(GUID_LOPART(linkedGuid), instance); -                default: -                    return 0; -             } -        } - -        time_t GetCreatureRespawnTime(uint32 loguid, uint32 instance) -        { -            TRINITY_GUARD(ACE_Thread_Mutex, _creatureRespawnTimesMutex); -            return _creatureRespawnTimes[MAKE_PAIR64(loguid, instance)]; -        } -        void SaveCreatureRespawnTime(uint32 loguid, uint32 instance, time_t t); -        void RemoveCreatureRespawnTime(uint32 loguid, uint32 instance); -        time_t GetGORespawnTime(uint32 loguid, uint32 instance) -        { -            TRINITY_GUARD(ACE_Thread_Mutex, _goRespawnTimesMutex); -            return _goRespawnTimes[MAKE_PAIR64(loguid, instance)]; -        } -        void SaveGORespawnTime(uint32 loguid, uint32 instance, time_t t); -        void RemoveGORespawnTime(uint32 loguid, uint32 instance); -        void DeleteRespawnTimeForInstance(uint32 instance); -          // grid objects          void AddCreatureToGrid(uint32 guid, CreatureData const* data);          void RemoveCreatureFromGrid(uint32 guid, CreatureData const* data); @@ -1307,10 +1273,6 @@ class ObjectMgr          TrinityStringLocaleContainer _trinityStringLocaleStore;          GossipMenuItemsLocaleContainer _gossipMenuItemsLocaleStore;          PointOfInterestLocaleContainer _pointOfInterestLocaleStore; -        RespawnTimes _creatureRespawnTimes; -        ACE_Thread_Mutex _creatureRespawnTimesMutex; -        RespawnTimes _goRespawnTimes; -        ACE_Thread_Mutex _goRespawnTimesMutex;          CacheVendorItemContainer _cacheVendorItemStore;          CacheTrainerSpellContainer _cacheTrainerSpellStore; diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index 8078a91d082..2e0d1e47c92 100755 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -543,7 +543,7 @@ void InstanceSaveManager::_ResetInstance(uint32 mapid, uint32 instanceId)      if (iMap && iMap->IsDungeon())          ((InstanceMap*)iMap)->Reset(INSTANCE_RESET_RESPAWN_DELAY); -    sObjectMgr->DeleteRespawnTimeForInstance(instanceId);   // even if map is not loaded +    iMap->DeleteRespawnTimes();      // Free up the instance id and allow it to be reused      sMapMgr->FreeInstanceId(instanceId); diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 162dd12d121..6f19fdcbc0a 100755 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2632,7 +2632,7 @@ void InstanceMap::UnloadAll()      ASSERT(!HavePlayers());      if (m_resetAfterUnload == true) -        sObjectMgr->DeleteRespawnTimeForInstance(GetInstanceId()); +        DeleteRespawnTimes();      Map::UnloadAll();  } @@ -2781,3 +2781,128 @@ void Map::UpdateIteratorBack(Player* player)      if (m_mapRefIter == player->GetMapRef())          m_mapRefIter = m_mapRefIter->nocheck_prev();  } + +void Map::SaveCreatureRespawnTime(uint32 dbGuid, time_t respawnTime) +{ +    if (!respawnTime) +    { +        // Delete only +        RemoveCreatureRespawnTime(dbGuid); +        return; +    } + +    _creatureRespawnTimes[dbGuid] = respawnTime; + +    PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CREATURE_RESPAWN); +    stmt->setUInt32(0, dbGuid); +    stmt->setUInt32(1, uint32(respawnTime)); +    stmt->setUInt16(2, GetId()); +    stmt->setUInt32(3, GetInstanceId()); +    CharacterDatabase.Execute(stmt); +} + +void Map::RemoveCreatureRespawnTime(uint32 dbGuid) +{ +    _creatureRespawnTimes.erase(dbGuid); + +    PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN); +    stmt->setUInt32(0, dbGuid); +    stmt->setUInt16(1, GetId()); +    stmt->setUInt32(2, GetInstanceId()); +    CharacterDatabase.Execute(stmt); +} + +void Map::SaveGORespawnTime(uint32 dbGuid, time_t respawnTime) +{ +    if (!respawnTime) +    { +        // Delete only +        RemoveGORespawnTime(dbGuid); +        return; +    } + +    _goRespawnTimes[dbGuid] = respawnTime; + +    PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GO_RESPAWN); +    stmt->setUInt32(0, dbGuid); +    stmt->setUInt32(1, uint32(respawnTime)); +    stmt->setUInt16(2, GetId()); +    stmt->setUInt32(3, GetInstanceId()); +    CharacterDatabase.Execute(stmt); +} + +void Map::RemoveGORespawnTime(uint32 dbGuid) +{ +    _goRespawnTimes.erase(dbGuid); + +    PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GO_RESPAWN); +    stmt->setUInt32(0, dbGuid); +    stmt->setUInt16(1, GetId()); +    stmt->setUInt32(2, GetInstanceId()); +    CharacterDatabase.Execute(stmt); +} + +void Map::LoadRespawnTimes() +{ +    PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CREATURE_RESPAWNS); +    stmt->setUInt16(0, GetId()); +    stmt->setUInt32(1, GetInstanceId()); +    if (PreparedQueryResult result = CharacterDatabase.Query(stmt)) +    { +        do +        { +            Field* fields = result->Fetch(); +            uint32 loguid      = fields[0].GetUInt32(); +            uint32 respawnTime = fields[1].GetUInt32(); + +            _creatureRespawnTimes[loguid] = time_t(respawnTime); +        } while (result->NextRow()); +    } + +    stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GO_RESPAWNS); +    stmt->setUInt16(0, GetId()); +    stmt->setUInt32(1, GetInstanceId()); +    if (PreparedQueryResult result = CharacterDatabase.Query(stmt)) +    { +        do +        { +            Field* fields = result->Fetch(); +            uint32 loguid      = fields[0].GetUInt32(); +            uint32 respawnTime = fields[1].GetUInt32(); + +            _goRespawnTimes[loguid] = time_t(respawnTime); +        } while (result->NextRow()); +    } +} + +void Map::DeleteRespawnTimes() +{ +    _creatureRespawnTimes.clear(); +    _goRespawnTimes.clear(); + +    PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE); +    stmt->setUInt16(0, GetId()); +    stmt->setUInt32(1, GetInstanceId()); +    CharacterDatabase.Execute(stmt); + +    stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GO_RESPAWN_BY_INSTANCE); +    stmt->setUInt16(0, GetId()); +    stmt->setUInt32(1, GetInstanceId()); +    CharacterDatabase.Execute(stmt); +} + +time_t Map::GetLinkedRespawnTime(uint64 guid) const +{ +    uint64 linkedGuid = sObjectMgr->GetLinkedRespawnGuid(guid); +    switch (GUID_HIPART(linkedGuid)) +    { +        case HIGHGUID_UNIT: +            return GetCreatureRespawnTime(GUID_LOPART(linkedGuid)); +        case HIGHGUID_GAMEOBJECT: +            return GetGORespawnTime(GUID_LOPART(linkedGuid)); +        default: +            break; +    } + +    return time_t(0); +} diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 6ba08646f25..94a64126da1 100755 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -443,6 +443,36 @@ class Map : public GridRefManager<NGridType>          void Insert(const GameObjectModel& mdl) { _dynamicTree.insert(mdl); }          bool Contains(const GameObjectModel& mdl) const { return _dynamicTree.contains(mdl);}          bool getObjectHitPos(uint32 phasemask, float x1, float y1, float z1, float x2, float y2, float z2, float& rx, float &ry, float& rz, float modifyDist); + +        /* +            RESPAWN TIMES +        */ +        time_t GetLinkedRespawnTime(uint64 guid) const; +        time_t GetCreatureRespawnTime(uint32 dbGuid) const +        { +            UNORDERED_MAP<uint32 /*dbGUID*/, time_t>::const_iterator itr = _creatureRespawnTimes.find(dbGuid); +            if (itr != _creatureRespawnTimes.end()) +                return itr->second; + +            return time_t(0); +        } + +        time_t GetGORespawnTime(uint32 dbGuid) const +        { +            UNORDERED_MAP<uint32 /*dbGUID*/, time_t>::const_iterator itr = _goRespawnTimes.find(dbGuid); +            if (itr != _goRespawnTimes.end()) +                return itr->second; + +            return time_t(0); +        } + +        void SaveCreatureRespawnTime(uint32 dbGuid, time_t respawnTime); +        void RemoveCreatureRespawnTime(uint32 dbGuid); +        void SaveGORespawnTime(uint32 dbGuid, time_t respawnTime); +        void RemoveGORespawnTime(uint32 dbGuid); +        void LoadRespawnTimes(); +        void DeleteRespawnTimes(); +      private:          void LoadMapAndVMap(int gx, int gy);          void LoadVMap(int gx, int gy); @@ -488,6 +518,7 @@ class Map : public GridRefManager<NGridType>          void ScriptsProcess();          void UpdateActiveCells(const float &x, const float &y, const uint32 t_diff); +      protected:          void SetUnloadReferenceLock(const GridCoord &p, bool on) { getNGrid(p.x_coord, p.y_coord)->setUnloadReferenceLock(on); } @@ -570,6 +601,9 @@ class Map : public GridRefManager<NGridType>              else                  m_activeNonPlayers.erase(obj);          } + +        UNORDERED_MAP<uint32 /*dbGUID*/, time_t> _creatureRespawnTimes; +        UNORDERED_MAP<uint32 /*dbGUID*/, time_t> _goRespawnTimes;  };  enum InstanceResetMethod diff --git a/src/server/game/Maps/MapInstanced.cpp b/src/server/game/Maps/MapInstanced.cpp index 5543251e115..2c1bdb00834 100755 --- a/src/server/game/Maps/MapInstanced.cpp +++ b/src/server/game/Maps/MapInstanced.cpp @@ -211,6 +211,8 @@ InstanceMap* MapInstanced::CreateInstance(uint32 InstanceId, InstanceSave* save,      InstanceMap* map = new InstanceMap(GetId(), GetGridExpiry(), InstanceId, difficulty, this);      ASSERT(map->IsDungeon()); +    map->LoadRespawnTimes(); +      bool load_data = save != NULL;      map->CreateInstanceData(load_data); diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index eb09538721d..e9de3ae001f 100755 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -110,6 +110,7 @@ Map* MapManager::CreateBaseMap(uint32 id)          else          {              map = new Map(id, i_gridCleanUpDelay, 0, REGULAR_DIFFICULTY); +            map->LoadRespawnTimes();          }          i_maps[id] = map;      } diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index ffc09a10e22..c539dd3cc39 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -129,8 +129,7 @@ namespace Movement      void MoveSplineInit::SetFacing(const Unit * target)      {          args.flags.EnableFacingTarget(); -        //args.facing.target = target->GetObjectGuid().GetRawValue(); -        args.facing.target = target->GetUInt64Value(OBJECT_FIELD_GUID); +        args.facing.target = target->GetGUID();      }      void MoveSplineInit::SetFacing(float angle) diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp index 465fca75030..dfdd4fc4ffc 100755 --- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp @@ -166,8 +166,10 @@ bool OPvPCapturePoint::DelCreature(uint32 type)      //if (Map* map = sMapMgr->FindMap(cr->GetMapId()))      //    map->Remove(cr, false);      // delete respawn time for this creature -    PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN_BY_GUID); +    PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN);      stmt->setUInt32(0, guid); +    stmt->setUInt16(1, cr->GetMapId()); +    stmt->setUInt32(2, 0);  // instance id, always 0 for world maps      CharacterDatabase.Execute(stmt);      cr->AddObjectToRemoveList(); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 6e32d33a7bb..5bd5961a05b 100755 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1410,15 +1410,9 @@ void World::SetInitialWorldSettings()      sLog->outString("Loading Creature Addon Data...");      sObjectMgr->LoadCreatureAddons();                            // must be after LoadCreatureTemplates() and LoadCreatures() -    sLog->outString("Loading Creature Respawn Data...");         // must be after PackInstances() -    sObjectMgr->LoadCreatureRespawnTimes(); -      sLog->outString("Loading Gameobject Data...");      sObjectMgr->LoadGameobjects(); -    sLog->outString("Loading Gameobject Respawn Data...");       // must be after PackInstances() -    sObjectMgr->LoadGameobjectRespawnTimes(); -      sLog->outString("Loading Creature Linked Respawn...");      sObjectMgr->LoadLinkedRespawn();                             // must be after LoadCreatures(), LoadGameObjects() diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index d315c6417ea..89cc6ab25e5 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -314,18 +314,17 @@ void CharacterDatabaseConnection::DoPrepareStatements()      PREPARE_STATEMENT(CHAR_DEL_OLD_CORPSES, "DELETE FROM corpse WHERE corpseType = 0 OR time < (UNIX_TIMESTAMP(NOW()) - ?)", CONNECTION_ASYNC)      // Creature respawn -    PREPARE_STATEMENT(CHAR_SEL_CREATURE_RESPAWNS, "SELECT guid, respawnTime, instanceId FROM creature_respawn", CONNECTION_SYNCH) -    PREPARE_STATEMENT(CHAR_REP_CREATURE_RESPAWN, "REPLACE INTO creature_respawn (guid, respawnTime, instanceId) VALUES (?, ?, ?)", CONNECTION_ASYNC) -    PREPARE_STATEMENT(CHAR_DEL_CREATURE_RESPAWN, "DELETE FROM creature_respawn WHERE guid = ? AND instanceId = ?", CONNECTION_ASYNC) -    PREPARE_STATEMENT(CHAR_DEL_CREATURE_RESPAWN_BY_GUID, "DELETE FROM creature_respawn WHERE guid = ?", CONNECTION_ASYNC) -    PREPARE_STATEMENT(CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE, "DELETE FROM creature_respawn WHERE instanceId = ?", CONNECTION_ASYNC) +    PREPARE_STATEMENT(CHAR_SEL_CREATURE_RESPAWNS, "SELECT guid, respawnTime FROM creature_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH) +    PREPARE_STATEMENT(CHAR_REP_CREATURE_RESPAWN, "REPLACE INTO creature_respawn (guid, respawnTime, mapId, instanceId) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC) +    PREPARE_STATEMENT(CHAR_DEL_CREATURE_RESPAWN, "DELETE FROM creature_respawn WHERE guid = ? AND mapId = ? AND instanceId = ?", CONNECTION_ASYNC) +    PREPARE_STATEMENT(CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE, "DELETE FROM creature_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_ASYNC)      PREPARE_STATEMENT(CHAR_SEL_MAX_CREATURE_RESPAWNS, "SELECT MAX(respawnTime), instanceId FROM creature_respawn WHERE instanceId > 0 GROUP BY instanceId", CONNECTION_SYNCH)      // Gameobject respawn -    PREPARE_STATEMENT(CHAR_SEL_GO_RESPAWNS, "SELECT guid, respawnTime, instanceId FROM gameobject_respawn", CONNECTION_SYNCH) -    PREPARE_STATEMENT(CHAR_REP_GO_RESPAWN, "REPLACE INTO gameobject_respawn (guid, respawnTime, instanceId) VALUES (?, ?, ?)", CONNECTION_ASYNC) -    PREPARE_STATEMENT(CHAR_DEL_GO_RESPAWN, "DELETE FROM gameobject_respawn WHERE guid = ? AND instanceId = ?", CONNECTION_ASYNC) -    PREPARE_STATEMENT(CHAR_DEL_GO_RESPAWN_BY_INSTANCE, "DELETE FROM gameobject_respawn WHERE instanceId = ?", CONNECTION_ASYNC) +    PREPARE_STATEMENT(CHAR_SEL_GO_RESPAWNS, "SELECT guid, respawnTime FROM gameobject_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH) +    PREPARE_STATEMENT(CHAR_REP_GO_RESPAWN, "REPLACE INTO gameobject_respawn (guid, respawnTime, mapId, instanceId) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC) +    PREPARE_STATEMENT(CHAR_DEL_GO_RESPAWN, "DELETE FROM gameobject_respawn WHERE guid = ? AND mapId = ? AND instanceId = ?", CONNECTION_ASYNC) +    PREPARE_STATEMENT(CHAR_DEL_GO_RESPAWN_BY_INSTANCE, "DELETE FROM gameobject_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_ASYNC)      // GM Tickets      PREPARE_STATEMENT(CHAR_SEL_GM_TICKETS, "SELECT ticketId, guid, name, message, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, completed, escalated, viewed FROM gm_tickets", CONNECTION_SYNCH) diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h index cf6bbd7bdfa..e1530f36e44 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h @@ -296,7 +296,6 @@ enum CharacterDatabaseStatements      CHAR_SEL_CREATURE_RESPAWNS,      CHAR_REP_CREATURE_RESPAWN,      CHAR_DEL_CREATURE_RESPAWN, -    CHAR_DEL_CREATURE_RESPAWN_BY_GUID,      CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE,      CHAR_SEL_MAX_CREATURE_RESPAWNS,  | 
