⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grid.cpp

📁 墨香最新私服
💻 CPP
字号:
// Grid.cpp: implementation of the CGrid class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Grid.h"
#include "PackedData.h"
#include "Network.h"
#include "CharMove.h"
#include "Object.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGrid::CGrid()
{
	m_CharacterHashTable.Initialize(10);
}

CGrid::~CGrid()
{
	m_CharacterHashTable.RemoveAll();
}

void CGrid::AddObject(CObject* pObject)
{
	CObject* pPreObject = m_CharacterHashTable.GetData(pObject->GetID());
	if(pPreObject)
	{
		char temp[256];
		sprintf(temp,"PreObj %d,  %s,   %d", pPreObject->GetID(),pPreObject->GetObjectName(),pPreObject);
		ASSERTMSG(0,temp);
		sprintf(temp,"NewObj %d,  %s,   %d", pObject->GetID(),pObject->GetObjectName(),pObject);
		ASSERTMSG(0,temp);
		return;
	}
	m_CharacterHashTable.Add(pObject,pObject->GetID());
}

void CGrid::RemoveObject(CObject* pObject)
{
	ASSERT(m_CharacterHashTable.GetData(pObject->GetID()) != NULL);
	m_CharacterHashTable.Remove(pObject->GetID());
}

void CGrid::AddNeighborGrid(CGrid* pGrid)
{
	m_NeighborGrid.AddTail(pGrid);
}

void CGrid::AddGridToPackedData(CPackedData* pPackedData)
{
	POS pos = m_NeighborGrid.GetFirstPos();
	CGrid* pGrid;
	
	AddObjectToPacket(0,pPackedData);
	while(pGrid = m_NeighborGrid.GetNextPos(pos))
	{
		pGrid->AddObjectToPacket(0,pPackedData);
	}
}

void CGrid::AddGridToPackedDataWithoutOne(DWORD dwID,CPackedData* pPackedData)
{
	POS pos = m_NeighborGrid.GetFirstPos();
	CGrid* pGrid;
	
	AddObjectToPacket(dwID,pPackedData);
	while(pGrid = m_NeighborGrid.GetNextPos(pos))
	{
		pGrid->AddObjectToPacket(dwID,pPackedData);
	}
}

void CGrid::AddObjectToPacket(DWORD ExceptID,CPackedData* pPackedData)
{
	m_CharacterHashTable.SetPositionHead();
	CObject* pObject;
	while(pObject = (CObject*)m_CharacterHashTable.GetData())
	{
		if(pObject->GetObjectKind() != eObjectKind_Player)
			continue;
		if(ExceptID == pObject->GetID())
			continue;
		
		pPackedData->AddObject(pObject);
		//pObject->SendMsg(pPackedData->GetMsg(),pPackedData->GetMsgLen());
	}
}

void CGrid::AddGridToPackedDataExceptLastGrid(DWORD ExceptID,CGrid* pLastGrid,CPackedData* pPackedData)
{
	if(pLastGrid == NULL)
	{
		AddGridToPackedDataWithoutOne(ExceptID,pPackedData);
		return;
	}
	
	POS pos = m_NeighborGrid.GetFirstPos();
	CGrid* pGrid;
	
	if(!pLastGrid->IsNeighborGrid(this))
		AddObjectToPacket(ExceptID,pPackedData);
	
	while(pGrid = m_NeighborGrid.GetNextPos(pos))
	{
		if(!pLastGrid->IsNeighborGrid(pGrid))
			pGrid->AddObjectToPacket(ExceptID,pPackedData);
	}
}

BOOL CGrid::IsNeighborGrid(CGrid* pGrid)
{
	if(pGrid == this)
		return TRUE;
	
	CGrid* pNeighborGrid;
	POS pos = m_NeighborGrid.GetFirstPos();
	while(pNeighborGrid = m_NeighborGrid.GetNextPos(pos))
	{
		if(pNeighborGrid == pGrid)
			return TRUE;
	}
	return FALSE;
}

BOOL gDebugAddError = FALSE;

void CGrid::SendCurrentCharacterMsg(CObject* pNewObject)
{
	if(pNewObject->GetObjectKind() & eObjectKind_Monster)
		return;

	static char pSendMsg[1024] = {0,};
	WORD MsgLen;
	
	m_CharacterHashTable.SetPositionHead();
	CObject* pObject;
	while(pObject = (CObject*)m_CharacterHashTable.GetData())
	{
		if(pNewObject->GetID() == pObject->GetID())
			continue;
				
		pObject->SetAddMsg(pSendMsg,&MsgLen,pNewObject->GetID(),FALSE);
		
		if(MsgLen)
			g_Network.Send2Server(pNewObject->GetAgentNum(),pSendMsg,MsgLen);

		
		//////////////////////////////////////////////////////////////////////////
		// test code
		if(gDebugAddError && MsgLen)
		{
			if(strcmp(pNewObject->GetObjectName(),"彬档") == 0)
			{
				FILE* fp = fopen("gDebugAddError.txt","a+");
				fprintf(fp,"Add to 彬档 %s %d,%d   %d,%d\n",pObject->GetObjectName(),
					pNewObject->GetGridPosition()->x,pNewObject->GetGridPosition()->z,
					pObject->GetGridPosition()->x,pObject->GetGridPosition()->z);
				fclose(fp);
			}
		}
		//////////////////////////////////////////////////////////////////////////


	}	
}
/*
void CGrid::SendCurrentItemMsg(CObject* pNewObject)
{
	static char pSendMsg[1024] = {0,};
	int MsgLen;
	
	m_ItemHashTable.SetPositionHead();
	CObject* pObject;
	while(pObject = (CObject*)m_ItemHashTable.GetData())
	{
		pObject->SetAddMsg(pSendMsg,&MsgLen,pNewObject->GetID());
		
		
		if(MsgLen)
			g_Network.Send2Server(pNewObject->GetAgentNum(),pSendMsg,MsgLen);
	}	
}
*/

void CGrid::SendCurrentObjectInfo(CObject* pNewObject,CGrid* pLastGrid)
{
	POS pos = m_NeighborGrid.GetFirstPos();
	CGrid* pGrid;
	
	if(pLastGrid == NULL)
	{
		SendCurrentCharacterMsg(pNewObject);
		while(pGrid = m_NeighborGrid.GetNextPos(pos))
		{
			pGrid->SendCurrentCharacterMsg(pNewObject);
		}
	}
	else
	{
		if(!pLastGrid->IsNeighborGrid(this))
		{
			SendCurrentCharacterMsg(pNewObject);
		}
		while(pGrid = m_NeighborGrid.GetNextPos(pos))
		{
			if(!pLastGrid->IsNeighborGrid(pGrid))
			{
				pGrid->SendCurrentCharacterMsg(pNewObject);
			}
		}
	}
}


void CGrid::SendRemoveCharacterMsg(CObject* pLeavedObject)
{
	static char Msg[1024] = {0,};
	WORD MsgLen;
	
	m_CharacterHashTable.SetPositionHead();
	CObject* pObject;
	while(pObject = (CObject*)m_CharacterHashTable.GetData())
	{
		if(pLeavedObject->GetID() == pObject->GetID())
			continue;
		
		pObject->SetRemoveMsg(Msg,&MsgLen,pLeavedObject->GetID());
		
		g_Network.Send2Server(pLeavedObject->GetAgentNum(),Msg,MsgLen);
		
		//////////////////////////////////////////////////////////////////////////
		// test code
		if(gDebugAddError && MsgLen)
		{
			if(strcmp(pLeavedObject->GetObjectName(),"彬档") == 0)
			{
				FILE* fp = fopen("gDebugAddError.txt","a+");
				fprintf(fp,"Remove From 彬档 %s %d,%d   %d,%d\n",pObject->GetObjectName(),
					pLeavedObject->GetGridPosition()->x,pLeavedObject->GetGridPosition()->z,
					pObject->GetGridPosition()->x,pObject->GetGridPosition()->z);
				fclose(fp);
			}
		}
		//////////////////////////////////////////////////////////////////////////
	}	
}
/*
void CGrid::SendRemoveItemMsg(CObject* pLeavedObject)
{
	static char Msg[1024] = {0,};
	int MsgLen;
	
	m_ItemHashTable.SetPositionHead();
	CObject* pObject;
	while(pObject = (CObject*)m_ItemHashTable.GetData())
	{
		if(pLeavedObject->GetID() == pObject->GetID())
			continue;
		
		pObject->SetRemoveMsg(Msg,&MsgLen,pLeavedObject->GetID());
		
		g_Network.Send2Server(pLeavedObject->GetAgentNum(),Msg,MsgLen);
	}	
}
*/
void CGrid::SendRemoveObjectInfo(CObject* pLeavedObject,CGrid* pCurGrid)
{
	POS pos = m_NeighborGrid.GetFirstPos();
	CGrid* pGrid;
	
	if(pCurGrid == NULL)
	{
		SendRemoveCharacterMsg(pLeavedObject);
	//	SendRemoveItemMsg(pLeavedObject);
		while(pGrid = m_NeighborGrid.GetNextPos(pos))
		{
			pGrid->SendRemoveCharacterMsg(pLeavedObject);
	//		pGrid->SendRemoveItemMsg(pLeavedObject);
		}
	}
	else
	{
		if(!pCurGrid->IsNeighborGrid(this))
		{
			SendRemoveCharacterMsg(pLeavedObject);
	//		SendRemoveItemMsg(pLeavedObject);
		}
		
		while(pGrid = m_NeighborGrid.GetNextPos(pos))
		{
			if(!pCurGrid->IsNeighborGrid(pGrid))
			{
				pGrid->SendRemoveCharacterMsg(pLeavedObject);
	//			pGrid->SendRemoveItemMsg(pLeavedObject);
			}
		}
	}
}

void CGrid::FindPlayerInRange(CObject* pFinder,VECTOR3* pPos,float Range,float& MinRange,CObject** ppObject)
{
	MinRange = Range;
	*ppObject = NULL;
	float dist;
	
	m_CharacterHashTable.SetPositionHead();
	CObject* pObject;
	while(pObject = (CObject*)m_CharacterHashTable.GetData())
	{
		if(pObject->GetObjectKind() != eObjectKind_Player)
			continue;
		
		if(pObject->GetState() == eObjectState_Die || pObject->GetState() == eObjectState_Immortal)
			continue;
		
		dist = CalcDistanceXZ(pPos,CCharMove::GetPosition(pObject));
		if(dist < MinRange)
		{
			if(pFinder != pObject)
			{
				MinRange = dist;
				*ppObject = pObject;
			}
		}
	}
}

CObject* CGrid::FindPlayerInRange(CObject* pFinder,VECTOR3* pPos,float Range)
{
	POS pos = m_NeighborGrid.GetFirstPos();
	CGrid* pGrid;
	CObject* pObject;
	CObject* pClosestObject;
	float dist;
	float mindist;
	
	FindPlayerInRange(pFinder,pPos,Range,mindist,&pClosestObject);
	while(pGrid = m_NeighborGrid.GetNextPos(pos))
	{
		pGrid->FindPlayerInRange(pFinder,pPos,Range,dist,&pObject);
		if(dist < mindist)
		{
			mindist = dist;
			pClosestObject = pObject;
		}
	}
	
	return pClosestObject;
}

void CGrid::FindFirstPlayerInRange(CObject* pFinder,VECTOR3* pPos,float Range,CObject** ppObject)
{
	*ppObject = NULL;
	float dist;
	
	m_CharacterHashTable.SetPositionHead();
	CObject* pObject;
	while(pObject = (CObject*)m_CharacterHashTable.GetData())
	{
		if(pObject->GetObjectKind() != eObjectKind_Player)
			continue;
		
		if(pObject->GetState() == eObjectState_Die || pObject->GetState() == eObjectState_Immortal)
			continue;
		
		dist = CalcDistanceXZ(pPos,CCharMove::GetPosition(pObject));
		if(dist < Range)
		{
			if(pFinder != pObject)
			{
				*ppObject = pObject;
				return;
			}
		}
	}
}

CObject* CGrid::FindFirstPlayerInRange(CObject* pFinder,VECTOR3* pPos,float Range)
{
	POS pos = m_NeighborGrid.GetFirstPos();
	CGrid* pGrid;
	CObject* pObject;
	
	FindFirstPlayerInRange(pFinder,pPos,Range,&pObject);
	if(pObject)
		return pObject;

	while(pGrid = m_NeighborGrid.GetNextPos(pos))
	{
		pGrid->FindFirstPlayerInRange(pFinder,pPos,Range,&pObject);
		if(pObject)
			return pObject;
	}
	
	return NULL;

}



void CGrid::FindMonsterInRange(CObject* pFinder,VECTOR3* pPos,float Range,float& MinRange,CObject** ppObject)
{
	MinRange = Range;
	*ppObject = NULL;
	float dist;
	
	m_CharacterHashTable.SetPositionHead();
	CObject* pObject;
	while(pObject = (CObject*)m_CharacterHashTable.GetData())
	{
		if(pObject->GetObjectKind() != eObjectKind_Monster)
			continue;
		
		if(pObject->GetState() == eObjectState_Die || pObject->GetState() == eObjectState_Immortal)
			continue;
		
		dist = CalcDistanceXZ(pPos,CCharMove::GetPosition(pObject));
		if(dist < MinRange)
		{
			if(pFinder != pObject)
			{
				MinRange = dist;
				*ppObject = pObject;
			}
		}
	}
}

CObject* CGrid::FindMonsterInRange(CObject* pFinder,VECTOR3* pPos,float Range)
{
	POS pos = m_NeighborGrid.GetFirstPos();
	CGrid* pGrid;
	CObject* pObject;
	CObject* pClosestObject;
	float dist;
	float mindist;
	
	FindMonsterInRange(pFinder,pPos,Range,mindist,&pClosestObject);
	while(pGrid = m_NeighborGrid.GetNextPos(pos))
	{
		pGrid->FindMonsterInRange(pFinder,pPos,Range,dist,&pObject);
		if(dist < mindist)
		{
			mindist = dist;
			pClosestObject = pObject;
		}
	}
	
	return pClosestObject;
}

void CGrid::FindFirstMonsterInRange(CObject* pFinder,VECTOR3* pPos,float Range,CObject** ppObject)
{
	*ppObject = NULL;
	float dist;
	
	m_CharacterHashTable.SetPositionHead();
	CObject* pObject;
	while(pObject = (CObject*)m_CharacterHashTable.GetData())
	{
		if(pObject->GetObjectKind() != eObjectKind_Monster)
			continue;
		
		if(pObject->GetState() == eObjectState_Die || pObject->GetState() == eObjectState_Immortal)
			continue;
		
		dist = CalcDistanceXZ(pPos,CCharMove::GetPosition(pObject));
		if(dist < Range)
		{
			if(pFinder != pObject)
			{
				*ppObject = pObject;
				return;
			}
		}
	}
}

CObject* CGrid::FindFirstMonsterInRange(CObject* pFinder,VECTOR3* pPos,float Range)
{
	POS pos = m_NeighborGrid.GetFirstPos();
	CGrid* pGrid;
	CObject* pObject;
	
	FindFirstMonsterInRange(pFinder,pPos,Range,&pObject);
	if(pObject)
		return pObject;

	while(pGrid = m_NeighborGrid.GetNextPos(pos))
	{
		pGrid->FindFirstMonsterInRange(pFinder,pPos,Range,&pObject);
		if(pObject)
			return pObject;
	}
	
	return NULL;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -