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

📄 gridsystem.cpp

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

#include "stdafx.h"
#include "GridSystem.h"
#include "Object.h"
#include "GridTable.h"
#include "PackedData.h"
#include "Network.h"
#include "CharMove.h"
#include "ServerTable.h"
#include "BattleSystem_Server.h"
#include "GeneralGridTable.h"
#include "MurimGridTable.h"
#include "ChannelSystem.h"
#include "Player.h"

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

CGridSystem::CGridSystem()
{
//	m_pGridTable = NULL;
	m_GridTable.Initialize(10);
}

CGridSystem::~CGridSystem()
{
	Release();
}

void CGridSystem::Init()
{
	m_TempAddList.Initialize(16);
	
//	CreateGridTable(0, eGridType_General, nMaxLength);
	/*	m_pGridTable = new CGridTable[GRID_MAX_LEVEL];
	for(n=0;n<GRID_MAX_LEVEL;++n)
	{
		m_pGridTable[n].Init(GRID_MINIMUM_BIT+n,nMaxLength);
	}*/
}

void CGridSystem::Release()
{
	CGridTable* pInfo;
	m_GridTable.SetPositionHead();
	while(pInfo = m_GridTable.GetData())
	{
		pInfo->Release();
		delete pInfo;
	}
	m_GridTable.RemoveAll();

	m_TempAddList.RemoveAll();
	
/*	if(m_pGridTable)
	{
		for(int n=0;n<GRID_MAX_LEVEL;++n)
		{
			m_pGridTable[n].Release();
		}
		delete [] m_pGridTable;
		m_pGridTable = NULL;
	}
	*/
}

void CGridSystem::DeleteGridTable(DWORD GridID)
{
	CGridTable* pGridTable = (CGridTable*)m_GridTable.GetData(GridID);
	ASSERT(pGridTable);
	pGridTable->OnDelete();
	m_GridTable.Remove(GridID);
	delete pGridTable;
}

void CGridSystem::GridProcess()
{
	m_TempAddList.SetPositionHead();
	CObject* pObject;
	while(pObject = (CObject*)m_TempAddList.GetData())
	{
		if(pObject->GetInited() == TRUE)
		{
			m_TempAddList.Remove(pObject->GetID());
			RealAddObject(pObject,CCharMove::GetPosition(pObject));
		}
	}
}

void CGridSystem::ChangeGrid(CObject* pObject,VECTOR3* pPos)
{	
	if(pObject->GetInited() ==FALSE)
		return;
	if(pObject->GetInitedGrid() == FALSE)
		return;

	CGridTable* pGridTable = GetGridTable(pObject);
	if(pGridTable == NULL)
		return;

	pGridTable->ChangeGrid(pObject, pPos);

/*	int firstx = TransToGridCoordinate(pPos->x);
	int firstz = TransToGridCoordinate(pPos->z);
	int nx;
	int nz;

	for(int n=0;n<GRID_MAX_LEVEL;++n)
	{
		nx = firstx >> (GRID_MINIMUM_BIT+n);
		nz = firstz >> (GRID_MINIMUM_BIT+n);

		if(nx == pObject->GridPos[n].x && nz == pObject->GridPos[n].z)
			break;
		
		pObject->GridPos[n].LastX = pObject->GridPos[n].x;
		pObject->GridPos[n].LastZ = pObject->GridPos[n].z;
		
		pObject->GridPos[n].x = nx;
		pObject->GridPos[n].z = nz;
		
		pGridTable[n].RemoveObject(pObject->GridPos[n].LastX,pObject->GridPos[n].LastZ,pObject);
		pGridTable[n].AddObject(pObject->GridPos[n].x,pObject->GridPos[n].z,pObject);		
	}

	if(n > GRID_MOVE_LEVEL)		// 捞悼俊 措茄 弊府靛 饭骇 捞惑捞 函拳 沁阑锭
	{
		static char Msg[1024] = {0,};
		int MsgLen;
		
		// 货肺甸绢哎 弊府靛俊 乐带 局甸俊霸 货肺 甸绢 吭澜阑 舅妨霖促
		PACKEDDATA_OBJ->Init(g_pServerTable->GetMaxServerConnectionIndex());
		AddGridToPackedDataExceptLastGrid(GRID_MOVE_LEVEL,&pObject->GridPos[GRID_MOVE_LEVEL],
			pObject->GetID(),PACKEDDATA_OBJ);
		pObject->SetAddMsg(Msg,&MsgLen,0,FALSE);
		
		if(MsgLen)
			PACKEDDATA_OBJ->Send(Msg,MsgLen);


		// 货肺甸绢哎 弊府靛俊 乐带 局甸狼 沥焊甫 焊郴霖促
		pGridTable[GRID_MOVE_LEVEL].SendCurrentObjectInfo(
			pObject->GridPos[GRID_MOVE_LEVEL].x,pObject->GridPos[GRID_MOVE_LEVEL].z,
			pObject->GridPos[GRID_MOVE_LEVEL].LastX,pObject->GridPos[GRID_MOVE_LEVEL].LastZ,
			pObject);
		

		// 扁粮俊 乐带 弊府靛狼 局甸俊霸 唱艾澜阑 舅赴促.
		PACKEDDATA_OBJ->Init(g_pServerTable->GetMaxServerConnectionIndex());
		AddLastGridToPackedDataExceptCurrentGrid(GRID_MOVE_LEVEL,&pObject->GridPos[GRID_MOVE_LEVEL],
			pObject->GetID(),PACKEDDATA_OBJ);		
		pObject->SetRemoveMsg(Msg,&MsgLen,0);
		
		if(MsgLen)
			PACKEDDATA_OBJ->Send(Msg,MsgLen);


		// 扁粮俊 乐带 局甸阑 Remove窍扼绰 皋技瘤甫 焊辰促.		
		pGridTable[GRID_MOVE_LEVEL].SendRemoveObjectInfo(
			pObject->GridPos[GRID_MOVE_LEVEL].x,pObject->GridPos[GRID_MOVE_LEVEL].z,
			pObject->GridPos[GRID_MOVE_LEVEL].LastX,pObject->GridPos[GRID_MOVE_LEVEL].LastZ,
			pObject);
	}
	*/
}

void CGridSystem::RealAddObject(CObject* pObject,VECTOR3* pPos)
{
	CGridTable* pGridTable;
	pGridTable = GetGridTable(pObject);
	if(pGridTable == NULL)
		return;

	pGridTable->AddObject(pObject, pPos);
	
	static char Msg[1024] = {0,};
	WORD MsgLen;
	
	pObject->SetAddMsg(Msg,&MsgLen,0,TRUE);
	
	if(MsgLen)
	{
		PACKEDDATA_OBJ->QuickSendExceptObjectSelf(pObject,(MSGBASE*)Msg,MsgLen);
	}
	
	pGridTable->SendCurrentObjectInfo(
			pObject->GridPos.x,pObject->GridPos.z,-1,-1,pObject);
	
	pObject->SetInitedGrid();
}

void CGridSystem::AddObject(CObject* pObject,VECTOR3* pPos)
{
	if(pObject->GetObjectKind() == eObjectKind_Player)
		m_TempAddList.Add(pObject,pObject->GetID());
	else
		RealAddObject(pObject,pPos);
}

void CGridSystem::RemoveObject(CObject* pObject)
{
	if(m_TempAddList.GetData(pObject->GetID()))
		m_TempAddList.Remove(pObject->GetID());
	else
	{
		if(pObject->m_bGridInited == FALSE)
			return;
		
		static char Msg[1024] = {0,};
		WORD MsgLen;
		
		CGridTable* pGridTable = GetGridTable(pObject);
		if(pGridTable == NULL)
			return;
		pObject->SetRemoveMsg(Msg,&MsgLen,0);
		if(MsgLen)
		{
			PACKEDDATA_OBJ->QuickSendExceptObjectSelf(pObject,(MSGBASE*)Msg,MsgLen);
		}
		
		pGridTable->RemoveObject(pObject);
		pObject->GridPos.x = -1;
		pObject->GridPos.z = -1;
		pObject->GridPos.LastX = -1;
		pObject->GridPos.LastZ = -1;

		pObject->m_bGridInited = FALSE;
	}
}

void CGridSystem::AddGridToPackedData(GridPosition* pGridPosition,CPackedData* pPackedData, CObject* pObject)
{
	CGridTable * pGridTable = GetGridTable(pObject);
	if(pGridTable == NULL)
		return;
	pGridTable->AddGridToPackedData(pGridPosition, pPackedData);
//	m_pGridTable[Level].AddGridToPackedData(GridNumX,GridNumZ,pPackedData);
}

void CGridSystem::AddGridToPackedDataWithoutOne(GridPosition* pGridPosition,DWORD dwID,CPackedData* pPackedData, CObject* pObject)
{
	CGridTable * pGridTable = GetGridTable(pObject);
	if(pGridTable == NULL)
		return;
	pGridTable->AddGridToPackedDataWithoutOne(pGridPosition, dwID, pPackedData);
	
//	m_pGridTable[Level].AddGridToPackedDataWithoutOne(GridNumX,GridNumZ,dwID,pPackedData);
}

void CGridSystem::AddGridToPackedDataExceptLastGrid(GridPosition* pGridPosition,DWORD ExceptID,CPackedData* pPackedData, CObject* pObject)
{	
	CGridTable * pGridTable = GetGridTable(pObject);
	if(pGridTable == NULL)
		return;
	pGridTable->AddGridToPackedDataExceptLastGrid(pGridPosition, ExceptID, pPackedData);
	
//	m_pGridTable[Level].AddGridToPackedDataExceptLastGrid(pGridPosition,ExceptID,pPackedData);
}

void CGridSystem::AddLastGridToPackedDataExceptCurrentGrid(GridPosition* pGridPosition,DWORD ExceptID,CPackedData* pPackedData, CObject* pObject)
{
	CGridTable * pGridTable = GetGridTable(pObject);
	if(pGridTable == NULL)
		return;
	pGridTable->AddLastGridToPackedDataExceptCurrentGrid(pGridPosition,ExceptID,pPackedData);

//	m_pGridTable[Level].AddLastGridToPackedDataExceptCurrentGrid(pGridPosition,ExceptID,pPackedData);
}

CObject* CGridSystem::FindPlayerInRange(VECTOR3* pPos,float Range, CObject* pObject, BYTE flag)
{
	int firstx = TransToGridCoordinate(pPos->x);
	int firstz = TransToGridCoordinate(pPos->z);

	GridPosition GridPos;
	GridPos.x = firstx >> GRID_BIT;
	GridPos.z = firstz >> GRID_BIT;
	CGridTable * pGridTable = GetGridTable(pObject);
	if(pGridTable == NULL)
		return NULL;

	return pGridTable->FindPlayerInRange(pObject,&GridPos, pPos, Range, flag);
}
CObject* CGridSystem::FindMonsterInRange(VECTOR3* pPos,float Range, CObject* pObject,BYTE flag)
{
	int firstx = TransToGridCoordinate(pPos->x);
	int firstz = TransToGridCoordinate(pPos->z);

	GridPosition GridPos;
	GridPos.x = firstx >> GRID_BIT;
	GridPos.z = firstz >> GRID_BIT;
	CGridTable * pGridTable = GetGridTable(pObject);
	if(pGridTable == NULL)
		return NULL;

	return pGridTable->FindMonsterInRange(pObject,&GridPos, pPos, Range, flag);
}

CGridTable* CGridSystem::GetGridTable(CObject* pObject)
{
	DWORD GridID = pObject->GetGridID();
	CGridTable* pGridTable = (CGridTable*)m_GridTable.GetData(GridID);
	ASSERT(pGridTable);
	
	return pGridTable;
}

MAPTYPE CGridSystem::GetGridMapNum(DWORD GridID)
{
	CGridTable* pGridTable = (CGridTable*)m_GridTable.GetData(GridID);
	ASSERT(pGridTable);
	
	return pGridTable->GetMapNum();
}

void CGridSystem::CreateGridTable(DWORD GridID, BYTE Kind, int MaxWidth, int MaxHeight, MAPTYPE MapNum)
{
	CGridTable* pGridTable = (CGridTable*)m_GridTable.GetData(GridID);
	ASSERT(pGridTable == NULL);

	CGridTable* pInfo = NULL;
	switch(Kind)
	{
	case eGridType_General:
		{
			pInfo = new CGeneralGridTable;
			pInfo->Init(GridID, MaxWidth, MaxHeight);
		}
		break;
	case eGridType_Murim:
		{
			pInfo = new CMurimGridTable;
			pInfo->Init(GridID, MaxWidth, MaxHeight);
		}
		break;
	}
	ASSERT(pInfo);
	if(pInfo == NULL)
		return;

	pInfo->SetMapNum(MapNum);

	m_GridTable.Add(pInfo, GridID);
}

BOOL CGridSystem::GetGridChangeTime(CObject* pObject,VECTOR3* pStartPos,VECTOR3* pTargetPos,float MoveSpeed,DWORD& dwChangeTime)
{
	CGridTable * pGridTable = GetGridTable(pObject);
	if(pGridTable == NULL)
		return FALSE;
	return pGridTable->GetGridChangeTime(pStartPos,pTargetPos,MoveSpeed,dwChangeTime);
}

⌨️ 快捷键说明

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