📄 mapgroup.cpp
字号:
// UserManager.cpp: implementation of the CMapGroup class.
//
//////////////////////////////////////////////////////////////////////
#include "MessagePort.h"
#pragma warning(disable:4786)
#include "AllMsg.h"
#include "MapGroup.h"
#pragma warning(disable:4786)
#include "protocol.h"
#include "itemtype.h"
#include "MapManager.h"
#include "ActionDefine.h"
#include "WantedList.h"
#include "DeadLoop.h"
//#include "DropRuleMap.h" //add by zlong 2003-11-15
//MYHEAP_IMPLEMENTATION(CMapGroup,s_heap)
//////////////////////////////////////////////////////////////////////
// 全局对象
CMapGroup::MAPGROUP_SET CMapGroup::m_setMapGroup;
CItemType* g_pItemType = NULL;
CDropRuleMap* g_pDropRuleMap = NULL; //add by zlong 2003-11-15
IStaticMapSet* g_setStaticMap = NULL;
ITaskSet* g_setTask = NULL;
IActionSet* g_setAction = NULL;
ILevupexpSet* g_setLevupexp = NULL;
IMagicTypeSet* g_setMagicType = NULL;
IMagicTrackSet* g_setMagicTrack = NULL;
IMagicTypeSet* g_setAutoMagicType = NULL;
IAddPointSet* g_setAddPoint = NULL;
ITrapTypeSet* g_setTrapType = NULL;
IMonsterTypeSet* g_setMonsterType = NULL;
IRebirthSet* g_setRebirth = NULL;
CItemAddition* g_pItemAddition = NULL;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMapGroup::CMapGroup()
{
m_idProcess = NULL;
m_pSocket = NULL;
m_pDb = NULL;
m_pMsgPort = NULL;
m_pRoleManager = NULL;
m_pUserManager = NULL;
m_pMapManager = NULL;
m_pNpcManager = NULL;
m_pSynManager = NULL;
m_pLeaveWord = NULL;
m_pGameAction = NULL;
m_pMercenaryTask= NULL;
m_pAnnounce = NULL;
}
//////////////////////////////////////////////////////////////////////
bool CMapGroup::Create(PROCESS_ID idProcess, ISocket* pSocket, IDatabase* pDb, IMessagePort* pMsgPort)
{
m_idProcess = idProcess;
m_pSocket = pSocket;
m_pDb = pDb;
m_pMsgPort = pMsgPort;
// 初始化所有DATA类的表结构。(注:所有要写盘的DATA类都需要在此初始化,并同时在Destroy()中清除。)
char szSQL[11][1024];
sprintf(szSQL[0], "SELECT * FROM %s WHERE id=0 LIMIT 1", _TBL_ITEM);
sprintf(szSQL[1], "SELECT * FROM %s WHERE id=0 LIMIT 1", _TBL_USER);
sprintf(szSQL[2], "SELECT * FROM %s WHERE id=0 LIMIT 1", _TBL_MAP);
sprintf(szSQL[3], "SELECT * FROM %s WHERE id=0 LIMIT 1", _TBL_WEAPONSKILL);
sprintf(szSQL[4], "SELECT * FROM %s WHERE id=0 LIMIT 1", _TBL_MAGIC);
sprintf(szSQL[5], "SELECT * FROM %s WHERE id=0 LIMIT 1", _TBL_SYNDICATE);
sprintf(szSQL[6], "SELECT * FROM %s WHERE id=0 LIMIT 1", _TBL_SYNATTR);
sprintf(szSQL[7], "SELECT * FROM %s WHERE id=0 LIMIT 1", _TBL_PET);
sprintf(szSQL[8], "SELECT * FROM %s WHERE id=0 LIMIT 1", _TBL_DYNANPC);
sprintf(szSQL[9], "SELECT * FROM %s WHERE id=0 LIMIT 1", _TBL_DYNAMAP);
sprintf(szSQL[10], "SELECT * FROM %s WHERE id=0 LIMIT 1", _TBL_EUDEMON);
if(!(
(m_pGameItemDataDefault = Database()->CreateNewRecordset(szSQL[0], false))
&& (m_pUserDataDefault = Database()->CreateNewRecordset(szSQL[1], false))
&& (m_pGameMapDataDefault = Database()->CreateNewRecordset(szSQL[2], false))
&& (m_pUserWeaponSkillDefault = Database()->CreateNewRecordset(szSQL[3], false))
&& (m_pMagicDataDefault = Database()->CreateNewRecordset(szSQL[4], false))
&& (m_pSynDataDefault = Database()->CreateNewRecordset(szSQL[5], false))
&& (m_pSynAttrDataDefault = Database()->CreateNewRecordset(szSQL[6], false))
&& (m_pPetDataDefault = Database()->CreateNewRecordset(szSQL[7], false))
&& (m_pDynaNpcDataDefault = Database()->CreateNewRecordset(szSQL[8], false))
&& (m_pDynaMapDataDefault = Database()->CreateNewRecordset(szSQL[9], false))
&& (m_pEudemonDataDefault = Database()->CreateNewRecordset(szSQL[10], false))
))
return false;
// 创建全局常量对象
if(m_idProcess == MSGPORT_MAPGROUP_FIRST)
{
g_pItemType = CItemType::CreateNew();
IF_NOT(g_pItemType && g_pItemType->Create(pDb))
return false;
//add by zlong 2003-11-15
g_pDropRuleMap = CDropRuleMap::CreateNew();
IF_NOT(g_pDropRuleMap && g_pDropRuleMap->Create(pDb))
return false;
char szSQL[1024];
sprintf(szSQL, "SELECT * FROM %s", _TBL_MAP);
g_setStaticMap = CStaticMapSet::CreateNew(true);
IF_NOT_(g_setStaticMap && g_setStaticMap->Create(szSQL, pDb))
return false;
sprintf(szSQL, "SELECT * FROM %s", _TBL_TASK);
g_setTask = CTaskSet::CreateNew(true);
IF_NOT_(g_setTask && g_setTask->Create(szSQL, Database()))
return false;
sprintf(szSQL, "SELECT * FROM %s", _TBL_ACTION);
g_setAction = CActionSet::CreateNew(true);
IF_NOT_(g_setAction && g_setAction->Create(szSQL, Database()))
return false;
sprintf(szSQL, "SELECT * FROM %s", _TBL_LEVEXP);
g_setLevupexp = CLevupexpSet::CreateNew(true);
IF_NOT_(g_setLevupexp && g_setLevupexp->Create(szSQL, Database()))
return false;
sprintf(szSQL, "SELECT * FROM %s", _TBL_POINTALLOT);
g_setAddPoint = CAddPointSet::CreateNew(true);
IF_NOT_(g_setAddPoint && g_setAddPoint->Create(szSQL, Database()))
return false;
sprintf(szSQL, "SELECT * FROM %s", _TBL_TRACK);
g_setMagicTrack = CMagicTrackSet::CreateNew(true);
IF_NOT (g_setMagicTrack && g_setMagicTrack->Create(szSQL, Database()))
return false;
sprintf(szSQL, "SELECT * FROM %s", _TBL_MAGICTYPE);
g_setMagicType = CMagicTypeSet::CreateNew(true);
IF_NOT_(g_setMagicType && g_setMagicType->Create(szSQL, Database()))
return false;
sprintf(szSQL, "SELECT * FROM %s WHERE auto_learn!=0", _TBL_MAGICTYPE);
g_setAutoMagicType = CMagicTypeSet::CreateNew(true);
IF_NOT_(g_setAutoMagicType && g_setAutoMagicType->Create(szSQL, Database()))
return false;
IF_NOT(CWantedList::s_WantedList.Create(Database()))
return false;
sprintf(szSQL, "SELECT * FROM %s", _TBL_TRAPTYPE);
g_setTrapType = CTrapTypeSet::CreateNew(true);
IF_NOT_(g_setTrapType && g_setTrapType->Create(szSQL, Database()))
return false;
sprintf(szSQL, "SELECT * FROM %s", _TBL_MONSTERTYPE);
g_setMonsterType = CMonsterTypeSet::CreateNew(true);
IF_NOT_(g_setMonsterType && g_setMonsterType->Create(szSQL, Database()))
return false;
sprintf(szSQL, "SELECT * FROM %s", _TBL_REBIRTH);
g_setRebirth = CRebirthSet::CreateNew(true);
IF_NOT_(g_setRebirth && g_setRebirth->Create(szSQL, Database()))
return false;
g_pItemAddition = CItemAddition::CreateNew();
IF_NOT(g_pItemAddition && g_pItemAddition->Create(pDb))
return false;
/* sprintf(szSQL, "DELETE FROM %s WHERE state = 2", _TBL_AUCTION);//LW每次起动服务器时删除已拍买过的物品
Database()->ExecuteSQL(szSQL);*/
}
CMapManager* pMapManager = new CMapManager(m_idProcess);
if (!pMapManager || !pMapManager->Create())
{
ASSERT(!"pMapManager->Create");
return false;
}
m_pMapManager = pMapManager->GetInterface();
CRoleManager* pRoleManager = new CRoleManager(m_idProcess);
if (!pRoleManager || !pRoleManager->Create())
{
ASSERT(!"pRoleManager->Create");
return false;
}
m_pRoleManager = pRoleManager->GetInterface();
CUserManager* pUserManager = new CUserManager(m_idProcess);
if (!pUserManager || !pUserManager->Create())
{
ASSERT(!"pUserManager->Create");
return false;
}
m_pUserManager = pUserManager->GetInterface();
m_pSynManager = new CSynManager(m_idProcess);
if (!m_pSynManager || !m_pSynManager->Create())
{
ASSERT(!"m_pSynManager->Create");
return false;
}
CNpcManager* pNpcManager = new CNpcManager(m_idProcess);
if (!pNpcManager || !pNpcManager->Create())
{
ASSERT(!"pNpcManager->Create");
return false;
}
m_pNpcManager = pNpcManager->GetInterface();
m_pLeaveWord = new CLeaveWord();
if (!m_pLeaveWord || !m_pLeaveWord->Create(m_idProcess))
{
ASSERT(!"m_pLeaveWord->Create");
return false;
}
m_pGameAction = CGameAction::CreateNew(m_idProcess);
if (!m_pGameAction)
{
ASSERT(!"m_pGameAction->Create");
return false;
}
m_pMercenaryTask = CMercenaryTask::CreateNew();
IF_NOT(m_pMercenaryTask && m_pMercenaryTask->Create(m_idProcess))
return false;
m_pAnnounce = CAnnounce::CreateNew();
if(!m_pAnnounce)
{
ASSERT(!"CAnnounce::CreateNew()");
return false;
}
CONST INTERVAL_EVENT = 60; // seconds
m_tmEvent.Startup(INTERVAL_EVENT);
return true;
}
//////////////////////////////////////////////////////////////////////
void CMapGroup::Destroy()
{
SAFE_RELEASE (m_pMercenaryTask);
SAFE_RELEASE (m_pGameAction);
SAFE_RELEASE (m_pLeaveWord);
SAFE_RELEASE (m_pNpcManager);
SAFE_RELEASE (m_pUserManager);
SAFE_RELEASE (m_pRoleManager);
SAFE_RELEASE (m_pSynManager);
SAFE_RELEASE (m_pMapManager);
SAFE_RELEASE (m_pAnnounce);
// 清除全局常量对象
if(m_idProcess == MSGPORT_MAPGROUP_FIRST) //@ 可能有问题
{
CWantedList::s_WantedList.Release();
SAFE_RELEASE (g_setRebirth);
SAFE_RELEASE (g_setMonsterType);
SAFE_RELEASE (g_setTrapType);
SAFE_RELEASE (g_setMagicTrack);
SAFE_RELEASE (g_setAutoMagicType);
SAFE_RELEASE (g_setMagicType);
SAFE_RELEASE (g_setAddPoint);
SAFE_RELEASE (g_setLevupexp);
SAFE_RELEASE(g_setAction);
SAFE_RELEASE(g_setTask);
SAFE_RELEASE (g_setStaticMap);
SAFE_RELEASE (g_pItemType);
// add by zlong 2003-11-15
SAFE_RELEASE (g_pDropRuleMap);
SAFE_RELEASE (g_pItemAddition);
}
SAFE_RELEASE (m_pEudemonDataDefault);
SAFE_RELEASE (m_pDynaMapDataDefault);
SAFE_RELEASE (m_pDynaNpcDataDefault);
SAFE_RELEASE (m_pPetDataDefault);
SAFE_RELEASE (m_pSynAttrDataDefault);
SAFE_RELEASE (m_pSynDataDefault);
SAFE_RELEASE (m_pMagicDataDefault);
SAFE_RELEASE (m_pUserWeaponSkillDefault);
SAFE_RELEASE (m_pGameItemDataDefault);
SAFE_RELEASE (m_pUserDataDefault);
SAFE_RELEASE (m_pGameMapDataDefault);
}
//////////////////////////////////////////////////////////////////////
void CMapGroup::OnTimer(time_t tCurr)
{
DEBUG_TRY
DEADLOOP_CHECK(PID, "RoleManager()->OnTimer")
RoleManager()->OnTimer(tCurr);
DEBUG_CATCH("RoleManager()->OnTimer(tCurr);")
DEBUG_TRY
DEADLOOP_CHECK(PID, "MapManager()->OnTimer")
MapManager()->OnTimer(tCurr);
DEBUG_CATCH("MapManager()->OnTimer(tCurr);")
DEBUG_TRY
DEADLOOP_CHECK(PID, "UserManager()->OnTimer")
UserManager()->OnTimer(tCurr);
DEBUG_CATCH("UserManager()->OnTimer(tCurr);")
DEBUG_TRY
DEADLOOP_CHECK(PID, "LeaveWord()->OnTimer")
LeaveWord()->OnTimer(tCurr);
DEBUG_CATCH("LeaveWord()->OnTimer(tCurr);")
DEBUG_TRY
DEADLOOP_CHECK(PID, "ProcessEvent")
clock_t tStart = clock();
if (m_tmEvent.ToNextTime())
this->ProcessEvent();
clock_t tUsed = clock()-tStart;
if(tUsed > 1000)
ASSERT(!"EVENT定时任务超时!");
DEBUG_CATCH("ProcessEvent();")
DEBUG_TRY
DEADLOOP_CHECK(PID, "MercenaryTask()->OnTimer")
MercenaryTask()->OnTimer(tCurr);
DEBUG_CATCH("MercenaryTask()->Ontimer(tCurr);")
}
//////////////////////////////////////////////////////////////////////
BOOL CMapGroup::CheckTime(const DWORD dwType, const char* pszParam)
{
if (!pszParam)
return false;
time_t ltime;
time( <ime );
struct tm *pTime;
pTime = localtime( <ime ); /* Convert to local time. */
int nCurYear, nCurMonth, nCurDay, nCurWeekDay, nCurYearDay, nCurHour, nCurMinute;
nCurYear =pTime->tm_year+1900;
nCurMonth =pTime->tm_mon+1;
nCurDay =pTime->tm_mday;
nCurWeekDay =pTime->tm_wday;
nCurYearDay =pTime->tm_yday;
nCurHour =pTime->tm_hour;
nCurMinute =pTime->tm_min;
int nYear0=0, nMonth0=0, nDay0=0, nHour0=0, nMinute0=0;
int nYear1=0, nMonth1=0, nDay1=0, nHour1=0, nMinute1=0;
if (dwType == 0) //精确时间
{
if (10 == sscanf(pszParam, "%d-%d-%d %d:%d %d-%d-%d %d:%d",
&nYear0, &nMonth0, &nDay0, &nHour0, &nMinute0,
&nYear1, &nMonth1, &nDay1, &nHour1, &nMinute1))
{
struct tm time0, time1;
memset(&time0, 0L, sizeof(tm));
memset(&time1, 0L, sizeof(tm));
time0.tm_year =nYear0-1900;
time0.tm_mon =nMonth0-1;
time0.tm_mday =nDay0;
time0.tm_hour =nHour0;
time0.tm_min =nMinute0;
time0.tm_isdst =pTime->tm_isdst;
time1.tm_year =nYear1-1900;
time1.tm_mon =nMonth1-1;
time1.tm_mday =nDay1;
time1.tm_hour =nHour1;
time1.tm_min =nMinute1;
time1.tm_isdst =pTime->tm_isdst;
time_t t0 =mktime(&time0);
time_t t1 =mktime(&time1);
if (ltime >= t0 && ltime<= t1)
return true;
}
}
else if (dwType == 1) //年时间
{
if (8 == sscanf(pszParam, "%d-%d %d:%d %d-%d %d:%d",
&nMonth0, &nDay0, &nHour0, &nMinute0,
&nMonth1, &nDay1, &nHour1, &nMinute1))
{
struct tm time0, time1;
memset(&time0, 0L, sizeof(tm));
memset(&time1, 0L, sizeof(tm));
time0.tm_year =pTime->tm_year;
time0.tm_mon =nMonth0-1;
time0.tm_mday =nDay0;
time0.tm_hour =nHour0;
time0.tm_min =nMinute0;
time0.tm_isdst =pTime->tm_isdst;
time1.tm_year =pTime->tm_year;
time1.tm_mon =nMonth1-1;
time1.tm_mday =nDay1;
time1.tm_hour =nHour1;
time1.tm_min =nMinute1;
time1.tm_isdst =pTime->tm_isdst;
time_t t0 =mktime(&time0);
time_t t1 =mktime(&time1);
if (ltime >= t0 && ltime<= t1)
return true;
}
}
else if (dwType == 2) //月时间
{
if (6 == sscanf(pszParam, "%d %d:%d %d %d:%d",
&nDay0, &nHour0, &nMinute0,
&nDay1, &nHour1, &nMinute1))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -