/*
* Ascent MMORPG Server
* Copyright (C) 2005-2007 Ascent Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
#ifndef __INSTANCESAVEMGR_H
#define __INSTANCESAVEMGR_H
struct InactiveInstance
{
uint32 InstanceId;
uint32 MapId;
uint32 Creation;
uint32 GroupSignature;
uint32 Creator;
uint32 ExpireTime;
uint32 difficulty;
};
//-------------------------------------------------------------------//
//Instance Map InstanceId Holder
//Description: Holds information a saved instanceid
//-------------------------------------------------------------------//
struct Instance_Map_InstanceId_Holder
{
public:
typedef HM_NAMESPACE::hash_map PlayerList;
typedef HM_NAMESPACE::hash_map NpcList;
Instance_Map_InstanceId_Holder();
~Instance_Map_InstanceId_Holder();
bool FindPlayer(uint64 guid);
bool RemovePlayer(uint64 guid);
bool ClearAllPlayers();
void AddPlayer(uint64 guid);
void AddObject(uint32 entry);
bool FindObject(uint32 entry);
bool ClearAllObjects();
uint32 GetGroupSignature() { return mGroupSignature; }
void SetGroupSignature(uint32 iGroupSignature) { mGroupSignature = iGroupSignature; }
inline MapInfo *GetMapInfo() { return m_pMapInfo; }
inline void SetMapInfo(MapInfo *pMapInfo) { m_pMapInfo = pMapInfo; }
uint32 GetInstanceID() { return m_instanceid; }
void SetInstanceID(uint32 instanceid) { m_instanceid = instanceid; }
//timers
time_t GetCreationTime() { return CreationTime; }
time_t GetRaidExpireTime() { return ExpireTime; }
void SetCreationTime(time_t time) { CreationTime = time; }
void SetRaidExpireTime(time_t time) { ExpireTime = time; }
uint32 GetDifficulty() { return difficulty; }
void SetDifficulty(uint32 mode) { difficulty = mode; }
//save functions
void SaveInstanceToDB();
bool IsSaved;
private:
PlayerList mPlayerList;
NpcList mNpcList;
Mutex playerListMutex;
Mutex npcListMutex;
uint32 mGroupSignature;
MapInfo *m_pMapInfo;
time_t CreationTime;
time_t ExpireTime;
uint32 m_instanceid;
uint32 difficulty;
};
//-------------------------------------------------------------------//
//Instance MapId Info Holder
//Description: Holds information about mapids that were saved.
//-------------------------------------------------------------------//
struct Instance_Map_Info_Holder
{
public:
typedef HM_NAMESPACE::hash_map InstanceIdList;
Instance_Map_Info_Holder();
~Instance_Map_Info_Holder();
bool FindPlayer(uint64 guid, uint32 iGroupSignature, uint32 difficulty);
bool IsPlayerSavedToInstanceId(uint64 guid, uint32 instanceid);
bool RemovePlayer(uint64 guid, uint32 InstanceID);
bool RemovePlayer(uint64 guid);
bool RemoveGroup(uint32 iGroupSignature);
void RemoveInstanceId(uint32 instanceid);
void AddPlayer(uint64 guid, uint32 InstanceID);
void AddInstanceId(MapMgr *pInstance);
void AddInstanceId(InactiveInstance * ia);
Instance_Map_InstanceId_Holder *GetInstanceId(uint32 instanceid);
Instance_Map_InstanceId_Holder *getInstanceIdByPlayer(uint64 guid, uint32 difficulty, bool iIgnoreDifficulty = false);
inline MapInfo *GetMapInfo() { return m_pMapInfo; }
inline void SetMapInfo(MapInfo *pMapInfo) { m_pMapInfo = pMapInfo; }
private:
InstanceIdList mInstanceIdList;
Mutex instanceIdListMutex;
MapInfo *m_pMapInfo;
};
//-------------------------------------------------------------------//
//Instance Saving Management class
//Description: Holds information about instances saved.
//-------------------------------------------------------------------//
class InstanceSavingManagement : public Singleton < InstanceSavingManagement >
{
public:
InstanceSavingManagement();
~InstanceSavingManagement();
typedef HM_NAMESPACE::hash_map InstanceInfo;
Instance_Map_Info_Holder *SaveInstance(MapMgr *pInstance);
void SavePlayerToInstance(Player *pPlayer, uint32 mapid);
void ResetSavedInstancesForPlayer(Player *pPlayer);
void RemoveSavedInstance(uint32 mapid, uint32 instanceid, bool bHardReset);
void DeleteInstanceFromDB(uint32 instanceid);
void BuildSavedInstancesForPlayer(Player *pPlayer);
void BuildRaidSavedInstancesForPlayer(Player *pPlayer);
bool IsPlayerSavedToMap(uint32 mapid, Player *pPlayer);
bool IsPlayerSavedToInstanceId(uint32 mapid, uint32 instanceid, Player *pPlayer);
void LoadSavedInstances();
void RepopulateSavedData(uint32 mapid, uint32 instanceid, const char *cNpc, const char *cPlayer);
void SaveInstanceIdToDB(uint32 instanceid, uint32 mapid);
void SaveObjectStateToInstance(Unit *pUnit);
Instance_Map_InstanceId_Holder *GetInstance(uint32 mapid, uint32 instanceid);
Instance_Map_InstanceId_Holder *GetRaidAndMMInstance(uint32 mapid, Player * pPlayer);
//INACTIVE INSTANCE FUNCTIONS.
void SaveInstance(InactiveInstance *ia);
InactiveInstance * GetInactiveInstance(uint32 instance_id);
void AddInactiveInstance(InactiveInstance * ia);
void CreateInactiveInstance(MapMgr * mgr);
void RemoveSavedInstance(uint32 instance_id);
private:
InstanceInfo mInstanceInfoList;
Mutex _busy;
Mutex inactiveInstancesMutex;
Mutex instanceInfoListMutex;
map inactiveInstances;
};
#define sInstanceSavingManager InstanceSavingManagement::getSingleton()
#endif