World.h
Put this somewhere near the top.
Code:
#include <functional>
Update:
Code:
inline void for_Linkmap(CWorld* p_World, const D3DXVECTOR3& vPos, const int nRange, DWORD dwLinkType, int nLayer, std::function<void(CObj* p_Obj)> lambda) { int nLinkX = int(vPos.x / p_World->m_iMPU); int nLinkZ = int(vPos.z / p_World->m_iMPU); #ifdef __WORLDSERVER for (int i = 0; i < p_World->m_linkMap.GetMaxLinkLevel(dwLinkType, nLayer); i++) { int nWidthLink = p_World->m_linkMap.GetLinkWidth(dwLinkType, i, nLayer); CObj** p_Objs = p_World->m_linkMap.GetObj(dwLinkType, i, nLayer); ASSERT(p_Objs); #else for( int i = 0; i < MAX_LINKLEVEL; i++ ) { int nWidthLink = CLandscape::m_nWidthLinkMap[i]; #endif int nMaxWidth = nWidthLink * p_World->m_nLandWidth; int nMaxHeight = nWidthLink * p_World->m_nLandHeight; int nUnit = (MAP_SIZE * p_World->m_nLandWidth) / nMaxWidth; int nX = (nLinkX / nUnit) * nUnit * p_World->m_iMPU; int nZ = (nLinkZ / nUnit) * nUnit * p_World->m_iMPU; int d = nUnit * p_World->m_iMPU / 2; nX = (int(vPos.x) - nX > d) ? 1 : 0; nZ = (int(vPos.z) - nZ > d) ? 1 : 0; int nLinkXMin = ( (nLinkX - nRange) / nUnit) + (nX - 1); int nLinkZMin = ( (nLinkZ - nRange) / nUnit) + (nZ - 1); if( nLinkXMin < 0 ) nLinkXMin = 0; if( nLinkZMin < 0 ) nLinkZMin = 0; int nLinkXMax = ( (nLinkX + nRange) / nUnit) + nX; int nLinkZMax = ( (nLinkZ + nRange) / nUnit) + nZ; if( nLinkXMax >= nMaxWidth ) nLinkXMax = nMaxWidth - 1; if( nLinkZMax >= nMaxHeight ) nLinkZMax = nMaxHeight - 1; for (int j = nLinkZMin; j <= nLinkZMax; j++) { for (int k = nLinkXMin; k <= nLinkXMax; k++) { #ifdef __WORLDSERVER { int nPos = j * nMaxWidth + k; CObj* pObj = p_Objs[nPos]; int limit = 1000; while( pObj && limit-- ) { #else CLandscape* pLand = p_World->m_apLand[(j / nWidthLink) * p_World->m_nLandWidth + (k / nWidthLink)]; if (pLand) { int nPos = (j % nWidthLink) * nWidthLink + (k % nWidthLink); CObj** p_Objs = pLand->GetObjLink(dwLinkType, i); ASSERT(p_Objs); CObj* pObj = p_Objs[nPos]; while (pObj) if (IsValidObj(pObj)) { #endif lambda(pObj); pObj = pObj->GetNextNode(); } } } } } }
Now you can do stuff like
Code:
forLinkmap( GetWorld(), vPos, nRange, CObj::linkDynamic, GetLayer(), [] (CObj* p_Obj) { // Do Stuff } );