DragonNest/Server/DNVillageServer/DNFarm.cpp
2024-12-19 09:48:26 +08:00

210 lines
5 KiB
C++

#include "Stdafx.h"
#include "DNFarm.h"
CDNFarm * g_pFarm = NULL;
CDNFarm::CDNFarm()
{
m_vFarmList.clear();
m_bIsInitWorld = false;
}
CDNFarm::~CDNFarm()
{
ScopeLock <CSyncLock> sync(m_Sync);
std::vector <TFarmItem*>::iterator ii;
for (ii = m_vFarmList.begin(); ii != m_vFarmList.end(); ii++)
delete (*ii);
m_vFarmList.clear();
}
#if defined( PRE_ADD_VIP_FARM ) || defined( PRE_ADD_FARM_DOWNSCALE )
bool CDNFarm::AddFarmList( const TFarmItemFromDB* pFarm )
{
if( pFarm == NULL || wcslen(pFarm->wszFarmName) == 0 )
return false;
ScopeLock <CSyncLock> sync(m_Sync);
if( IsExistAsync(pFarm->iFarmDBID) == true )
{
_DANGER_POINT(); //ÀÌ¹Ì ÀÖ¾î¶ó~
return false;
}
TFarmItem * pFarmItem = new TFarmItem;
if( pFarmItem == NULL )
return false;
memset( pFarmItem, 0, sizeof(TFarmItem) );
pFarmItem->iFarmDBID = pFarm->iFarmDBID;
pFarmItem->iFarmMapID = pFarm->iFarmMapID;
pFarmItem->iFarmMaxUser = pFarm->iFarmMaxUser;
pFarmItem->bStartActivate = pFarm->bStartActivate;
#if defined( PRE_ADD_FARM_DOWNSCALE )
pFarmItem->iAttr = pFarm->iAttr;
#else
pFarmItem->Attr = pFarm->Attr;
#endif // #if defined( PRE_ADD_FARM_DOWNSCALE )
_wcscpy( pFarmItem->wszFarmName, _countof(pFarmItem->wszFarmName), pFarm->wszFarmName, (int)wcslen(pFarm->wszFarmName) );
m_vFarmList.push_back(pFarmItem);
return true;
}
#else
bool CDNFarm::AddFarmList( int nFarmDBID, int nFarmMapID, int nFarmMaxUser, const WCHAR * pFarmName, bool bStart)
{
if (pFarmName == NULL) return false;
ScopeLock <CSyncLock> sync(m_Sync);
if (IsExistAsync(nFarmDBID))
{
_DANGER_POINT(); //ÀÌ¹Ì ÀÖ¾î¶ó~
return false;
}
TFarmItem * pFarmItem = new TFarmItem;
if (!pFarmItem) return false;
memset(pFarmItem, 0, sizeof(TFarmItem));
pFarmItem->iFarmDBID = nFarmDBID;
pFarmItem->iFarmMapID = nFarmMapID;
pFarmItem->iFarmMaxUser = nFarmMaxUser;
pFarmItem->bStartActivate = bStart;
_wcscpy( pFarmItem->wszFarmName, _countof(pFarmItem->wszFarmName), pFarmName, (int)wcslen(pFarmName) );
m_vFarmList.push_back(pFarmItem);
return true;
}
#endif // #if defined( PRE_ADD_VIP_FARM ) || defined( PRE_ADD_FARM_DOWNSCALE )
void CDNFarm::GetFarmList(TFarmItemFromDB * pFarm, BYTE &cCount)
{
ScopeLock <CSyncLock> sync(m_Sync);
cCount = 0;
std::vector <TFarmItem*>::iterator ii;
for (ii = m_vFarmList.begin(); ii != m_vFarmList.end(); ii++)
{
pFarm[cCount].bEnableFlag = (*ii)->bEnableFlag;
pFarm[cCount].iFarmDBID = (*ii)->iFarmDBID;
pFarm[cCount].iFarmMapID = (*ii)->iFarmMapID;
pFarm[cCount].iFarmMaxUser = (*ii)->iFarmMaxUser;
pFarm[cCount].bStartActivate = (*ii)->bStartActivate;
#if defined( PRE_ADD_FARM_DOWNSCALE )
pFarm[cCount].iAttr = (*ii)->iAttr;
#elif defined( PRE_ADD_VIP_FARM )
pFarm[cCount].Attr = (*ii)->Attr;
#endif // #if defined( PRE_ADD_FARM_DOWNSCALE )
_wcscpy(pFarm[cCount].wszFarmName, _countof(pFarm[cCount].wszFarmName), (*ii)->wszFarmName, (int)wcslen((*ii)->wszFarmName));
cCount++;
}
}
void CDNFarm::GetActivateFarmList(TFarmItem * pFarm, BYTE &cCount)
{
ScopeLock <CSyncLock> sync(m_Sync);
cCount = 0;
std::vector <TFarmItem*>::iterator ii;
for (ii = m_vFarmList.begin(); ii != m_vFarmList.end(); ii++)
{
if ((*ii)->bActivate != true) continue;
memcpy(&pFarm[cCount], (*ii), sizeof(TFarmItem));
cCount++;
}
}
bool CDNFarm::GetFarmMapID(UINT nFarmDBID, int &nFarmMapID)
{
ScopeLock <CSyncLock> sync(m_Sync);
std::vector <TFarmItem*>::iterator ii;
for (ii = m_vFarmList.begin(); ii != m_vFarmList.end(); ii++)
{
if ((*ii)->iFarmDBID == nFarmDBID)
{
nFarmMapID = (*ii)->iFarmMapID;
return true;
}
}
return false;
}
#if defined( PRE_ADD_FARM_DOWNSCALE )
bool CDNFarm::GetFarmAttr( UINT nFarmDBID, int& iAttr )
{
ScopeLock <CSyncLock> sync(m_Sync);
std::vector <TFarmItem*>::iterator ii;
for (ii = m_vFarmList.begin(); ii != m_vFarmList.end(); ii++)
{
if ((*ii)->iFarmDBID == nFarmDBID)
{
iAttr = (*ii)->iAttr;
return true;
}
}
return false;
}
#elif defined( PRE_ADD_VIP_FARM )
bool CDNFarm::GetFarmAttr( UINT nFarmDBID, Farm::Attr::eType& Attr )
{
ScopeLock <CSyncLock> sync(m_Sync);
std::vector <TFarmItem*>::iterator ii;
for (ii = m_vFarmList.begin(); ii != m_vFarmList.end(); ii++)
{
if ((*ii)->iFarmDBID == nFarmDBID)
{
Attr = (*ii)->Attr;
return true;
}
}
return false;
}
#endif // #if defined( PRE_ADD_FARM_DOWNSCALE )
void CDNFarm::UpdateFarmInfo(TFarmInfo * pInfo, BYTE cCount)
{
if (pInfo == NULL) return;
ScopeLock <CSyncLock> sync(m_Sync);
std::vector <TFarmItem*>::iterator ii;
for (ii = m_vFarmList.begin(); ii != m_vFarmList.end(); ii++)
{
int nCount = 0;
for ( ;nCount <= cCount; nCount++)
{
if (pInfo[nCount].nFarmDBID == (*ii)->iFarmDBID)
{
(*ii)->iFarmCurUser = pInfo[nCount].nFarmCurUserCount;
(*ii)->bActivate = pInfo[nCount].bActivate;
}
if (cCount == nCount)
break;
}
}
}
bool CDNFarm::IsExistAsync(UINT nFarmDBID)
{
std::vector <TFarmItem*>::iterator ii;
for (ii = m_vFarmList.begin(); ii != m_vFarmList.end(); ii++)
if ((*ii)->iFarmDBID == nFarmDBID)
return true;
return false;
}