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

📄 gamemap.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
📖 第 1 页 / 共 3 页
字号:

	return true;
}

//////////////////////////////////////////////////////////////////////
void CGameMap::SendMapInfo(CUser* pUser)
{
	IF_NOT (pUser)
		return;

	CMsgMapInfo msg;
	IF_OK (msg.Create(this))
		pUser->SendMsg(&msg);
}

//////////////////////////////////////////////////////////////////////
void CGameMap::SetSynID(OBJID idSyn, bool bWithAllNpc)
{
	if(!IsDynaMap())
		m_pData->SetInt(GAMEMAPDATA_OWNERTYPE, OWNER_SYN);
	if(m_pData->GetInt(GAMEMAPDATA_OWNERTYPE) == OWNER_SYN)
	{
		m_pData->SetInt(GAMEMAPDATA_OWNERID_, idSyn);
		if(IsDynaMap())
			m_pData->Update();
	}

	if(bWithAllNpc)
	{
		for(IRoleSet::Iter i = RoleManager()->QuerySet()->Begin(); i != RoleManager()->QuerySet()->End(); i++)
		{
			IRole* pRole = RoleManager()->QuerySet()->GetObjByIter(i);
			CNpc* pNpc;
			if(pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)) && pNpc->GetInt(NPCDATA_OWNERTYPE) == OWNER_SYN)
				pNpc->SetSynOwnerID(idSyn, true);		// true: with link map
		}
	}


}

//////////////////////////////////////////////////////////////////////
void CGameMap::SetUserID(OBJID idUser, bool bWithAllNpc)
{
	if(m_pData->GetInt(GAMEMAPDATA_OWNERTYPE) == OWNER_USER)
	{
		m_pData->SetInt(GAMEMAPDATA_OWNERID_, idUser);
		if(IsDynaMap())
			m_pData->Update();
	}

	if(bWithAllNpc)
	{
		for(IRoleSet::Iter i = RoleManager()->QuerySet()->Begin(); i != RoleManager()->QuerySet()->End(); i++)
		{
			IRole* pRole = RoleManager()->QuerySet()->GetObjByIter(i);
			CNpc* pNpc;
			if(pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)) && pNpc->GetInt(NPCDATA_OWNERTYPE) == OWNER_SYN)
				pNpc->SetUserOwnerID(idUser, true);		// true: with link map
		}
	}
}

//////////////////////////////////////////////////////////////////////
OBJID CGameMap::CreateDynaMap(PROCESS_ID idProcess, const NewMapInfo* pInfo)
{
	m_idProcess		= idProcess;
	CHECKF(pInfo);

	m_pData	= CGameMapData::CreateNew();
	if(!m_pData || !m_pData->Create(GameDataDefault()->GetDynaMap(), ID_NONE))
		return false;
	m_pData->SetStr(GAMEMAPDATA_NAME, pInfo->szName, _MAX_NAMESIZE);
	m_pData->SetInt(GAMEMAPDATA_OWNERTYPE,		pInfo->nOwnerType);
	m_pData->SetInt(GAMEMAPDATA_OWNERID_,		pInfo->idOwner);
	m_pData->SetInt(GAMEMAPDATA_MAPDOC,			pInfo->nMapDoc);
	m_pData->SetInt(GAMEMAPDATA_TYPE,			pInfo->nType);
	m_pData->SetInt(GAMEMAPDATA_MAPGROUP,		pInfo->nMapGroup);
	m_pData->SetInt(GAMEMAPDATA_LINKMAP,		pInfo->idLikeMap);
	m_pData->SetInt(GAMEMAPDATA_LINK_X,			pInfo->nLinkX);
	m_pData->SetInt(GAMEMAPDATA_LINK_Y,			pInfo->nLinkY);
	m_pData->SetInt(GAMEMAPDATA_PORTAL0_X,		pInfo->nPortalX);
	m_pData->SetInt(GAMEMAPDATA_PORTAL0_Y,		pInfo->nPortalY);
	m_pData->SetInt(GAMEMAPDATA_REBORN_MAPID,	pInfo->idRebornMap);
	m_pData->SetInt(GAMEMAPDATA_REBORN_PORTAL,	pInfo->nRebornPortal);
	m_pData->SetInt(GAMEMAPDATA_RESOURCE_LEV,	pInfo->nResLev);
	OBJID idMap = m_pData->InsertRecord();
	CHECKF(idMap != ID_NONE);

//*
	LOGMSG("加载动态地图文件[%d]...", m_pData->GetInt(GAMEMAPDATA_MAPDOC));
	m_pMapData	= IMapData::CreateNew(m_pData->GetInt(GAMEMAPDATA_MAPDOC), MAPDATA_VERSION);
	if(!m_pMapData)
	{
		LOGERROR("动态地图文件[%d]加载失败!", m_pData->GetInt(GAMEMAPDATA_MAPDOC));
		return ID_NONE;
	}

	// 装载地图
	m_setBlock.resize(GetWidthOfBlock());
	for(int i = 0; i < m_setBlock.size(); i++)
	{
		m_setBlock[i].resize(GetHeightOfBlock());
		for(int j = 0; j < m_setBlock[i].size(); j++)
			m_setBlock[i][j].Create();
	}
//*/
	m_setRegion = CRegionSet::CreateNew(true);
	CHECKF(m_setRegion);
	SQLBUF	szSQL;
	sprintf(szSQL, "SELECT * FROM %s WHERE mapid=%u", szRegionTable, m_pData->GetID());
	IF_NOT(m_setRegion->Create(szSQL, Database()))
		return ID_NONE;

	m_setWeather	= CWeatherSet::CreateNew(true);
	CHECKF(m_setWeather);
	for( i = 0; i < m_setRegion->GetAmount(); i++)
	{
		CRegionData*	pData = m_setRegion->GetObjByIndex(i);
		if(pData && pData->GetInt(REGIONDATA_TYPE) == REGION_WEATHER)
		{
			CWeatherRegion* pWeather = CWeatherRegion::CreateNew();
			CHECKF(pWeather);
			IF_OK(pWeather->Create(pData, idProcess))
				m_setWeather->AddObj(pWeather);
			else
				pWeather->ReleaseByOwner();
		}
	}

	return idMap;
}

//////////////////////////////////////////////////////////////////////
bool CGameMap::EraseMap()
{
	CHECKF(IsDynaMap());

	CRoleSet::Iterator	pRole = RoleManager()->QuerySet()->NewEnum();
	while(pRole.Next())
	{
		if(pRole && pRole->GetMap()->GetID() == GetID())
		{
			CUser* pUser;
			CNpc* pNpc;
			if(pRole->QueryObj(OBJ_USER, IPP_OF(pUser)))
				return false;
			else if(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)) && pNpc->IsLinkNpc())
				return false;
		}
	}

	pRole.Reset();
	while(pRole.Next())
	{
		DEBUG_TRY	// VVVVVVVVVVVVVV
		if(pRole && pRole->GetMap()->GetID() == GetID())
		{
			RoleManager()->QuerySet()->DelObj(pRole->GetID());
		}
		DEBUG_CATCH("EraseMap()")	// AAAAAAAAAAAAAAA
	}

	//??? 未处理Booth,估计不会在动态地图中摆摊

	CMapItemSet::Iterator pMapItem = MapManager()->QueryMapItemSet()->NewEnum();
	while(pMapItem.Next())
	{
		if(pMapItem && pMapItem->GetMap()->GetID() == GetID())
		{
			MapManager()->QueryMapItemSet()->DelObj(pMapItem->GetID());
		}
	}

	SQLBUF	szSQL;
	sprintf(szSQL, "UPDATE %s SET del_flag=1 WHERE id=%u LIMIT 1", _TBL_DYNAMAP, GetID());
	Database()->ExecuteSQL(szSQL);

	MapManager()->QuerySet()->DelObj(GetID());

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CGameMap::ChangeMapDoc(OBJID idDoc)						// false: user in map, can't change
{
/*	CUserManager::Iterator pUser = UserManager()->NewEnum();
	while(pUser.Next())
	{
		if(pUser->GetMapID() == GetID())
			return false;
	}

	IMapData* pMapData	= IMapData::CreateNew(idDoc, MAPDATA_VERSION);	// VVVVVVVVVVVVVVVVVVVVVVVVVV
	if(!pMapData)
	{
		LOGERROR("地图文件[%d]加载失败!", idDoc);
		return false;
	}
	CHECKF(pMapData->GetMapWidth() == m_pMapData->GetMapWidth());
	CHECKF(pMapData->GetMapHeight() == m_pMapData->GetMapHeight());
*/
	int nOldDoc = m_pData->GetInt(GAMEMAPDATA_MAPDOC);
	m_pData->SetInt(GAMEMAPDATA_MAPDOC, idDoc);
	m_pData->Update();
	m_pData->SetInt(GAMEMAPDATA_MAPDOC, nOldDoc);
	m_pData->ClearUpdateFlags();
/*
	IF_OK(m_pMapData)
		m_pMapData->Release();
	m_pMapData	= pMapData;		// AAAAAAAAAAAAAAAAA

	// synchro ai server
	CMsgAction	msg;
	IF_OK(msg.Create(GetID(), 0, 0, 0, actionChangeMapDoc, idDoc))
		MapGroup(PID)->QueryIntraMsg()->SendNpcMsg(ID_NONE, &msg);
*/
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CGameMap::AddTerrainObj(OBJID idOwner, int x, int y, OBJID idTerrainObj)
{
	if(m_pMapData->AddTerrainItem(idOwner, x, y, idTerrainObj))
	{
		CMsgAction	msg;
		IF_OK(msg.Create(GetID(), x, y, 0, actionAddTerrainObj, idOwner))
			MapGroup(PID)->QueryIntraMsg()->SendNpcMsg(idTerrainObj, &msg);

		return true;
	}
	return false;
}

//////////////////////////////////////////////////////////////////////
bool CGameMap::DelTerrainObj(OBJID idOwner)
{
	if(m_pMapData->DelTerrainItem(idOwner))
	{
		CMsgAction	msg;
		IF_OK(msg.Create(GetID(), 0, 0, 0, actionDelTerrainObj, idOwner))
			MapGroup(PID)->QueryIntraMsg()->SendNpcMsg(ID_NONE, &msg);

		return true;
	}
	return false;
}

//////////////////////////////////////////////////////////////////////
void CGameMap::DelNpcByType(int nType)
{
	for(IRoleSet::Iter i = RoleManager()->QuerySet()->Begin(); i != RoleManager()->QuerySet()->End(); )
	{
		IRole* pRole = RoleManager()->QuerySet()->GetObjByIter(i);
		i++;		// 要删除,提前移动

		CNpc* pNpc;
		if(pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)) && pNpc->GetMapID() == GetID() && pNpc->GetType() == nType)
		{
			if(!pNpc->IsDeleted())
			{
				ASSERT(pNpc->DelNpc());
			}
		}
	}
}

//////////////////////////////////////////////////////////////////////
void CGameMap::ProcessRpc(CEventPack &pack)
{
	switch(pack.GetAction())
	{
	case	RPC_MAP_DELNPC:
		{
			int nType = 0;
			pack >> nType;
			this->DelNpcByType(nType);
		}
	default:
		ASSERT(!"CGameMap::ProcessRpc");
	}
}

//check castle class          add huang 2003.12.30
//bool CGameMap::IsNormalCastle(OBJID idMap)
//{
//	if(idMap == SYNDICATE_CASTLE_1_ID)
//		return true;
//	else if(idMap == SYNDICATE_CASTLE_2_ID)
//		return true;
//	else if(idMap == SYNDICATE_CASTLE_3_ID)
//		return true;
//	else
//		return false;
//}
//
//bool CGameMap::IsCentreCastle(OBJID idMap)
//{
//	if(idMap == SYNDICATE_CASTLE_CENTR_ID)
//		return true;
//	else
//		return false;
//得到帮派地图中的帮派标志NPC
CNpc* CGameMap::GetNpcSynFlag()
{
	if(!IsSynMap() || !IsDynaMap())	
		return NULL;
	CNpc* pNpc;
	CRoleSet::Iterator pRole = RoleManager()->QuerySet()->NewEnum();
	while(pRole.Next())
	{
		if(pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)) && pNpc->GetMapID()==this->GetID() &&
			pNpc->IsDynaNpc()&&pNpc->IsAlive() && pNpc->GetMaxLife() && pNpc->IsSynFlag() )
			return pNpc;
	}
	return NULL;
		
}
//得到 帮派地图中的 战书NPC
CNpc* CGameMap::GetNpcSynWarLetter()
{
	if(!IsSynMap() || !IsDynaMap())
		return NULL;	
	CNpc* pNpc;
	CRoleSet::Iterator pRole = RoleManager()->QuerySet()->NewEnum();
	while(pRole.Next())
	{
		if(pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc))
			&& pNpc->GetMapID()==this->GetID()&&pNpc->IsSynWarLetter() )			
			return pNpc;
	}
	return NULL;
}
//根据NPC计算城市的价值,地图中DYNNPC的生命
int CGameMap::GetSynMapValue()
{
	if(!IsSynMap())
		return -1; //不是帮派地图

	int nMoneySum = 0;

	CNpc* pNpc;
	CRoleSet::Iterator pRole = RoleManager()->QuerySet()->NewEnum();
	while(pRole.Next())
	{
		if(pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)) && pNpc->GetMapID()==this->GetID()
			&&pNpc->IsDynaNpc()&&pNpc->IsAlive() && pNpc->GetMaxLife() && pNpc->IsSynNpc())			
		{
			nMoneySum = ::AddToTop(pNpc->GetMaxFixMoney()-pNpc->GetLostFixMoney(), nMoneySum, SYNMONEY_LIMIT);			
		}
	}

	return nMoneySum;
}
//得到战争后,NPC丢失的生命与原来的生命的比例,和价值
void CGameMap::GetAllNpcLostLifeScaleAndValue(int &nScale, int &nValue)
{
	if(!IsSynMap() || !IsDynaMap())
		return ; //不是帮派地图
	int nMoneySum = 0;
	int nLostLife=0, nAllLife=0;
	CNpc* pNpc;
	CRoleSet::Iterator pRole = RoleManager()->QuerySet()->NewEnum();
	while(pRole.Next())
	{
		if(pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)) && pNpc->GetMapID()==this->GetID()
			&&pNpc->IsDynaNpc()&&pNpc->IsAlive() && pNpc->GetMaxLife() && pNpc->IsSynNpc())			
		{
			nMoneySum = AddToTop(pNpc->GetLostFixMoney(),nMoneySum,SYNMONEY_LIMIT);			
			int nLostLifeTmp = pNpc->GetMaxLife() - pNpc->GetLife() ;			
			nLostLife = ::CutTrail(nLostLife +nLostLifeTmp,nLostLifeTmp);				
			nAllLife = ::CutTrail(nAllLife + pNpc->GetMaxLife(),pNpc->GetMaxLife());
		}
	}
	nScale =  CutRange(MulDiv(nLostLife,100,nAllLife),0,100);	
	nValue = nMoneySum;
}

void CGameMap::SetSynOccupyTime()
{
	//将占领的帮派城市的时间存到 帮派地图中的 战书NPC中
	{
		CNpc * pNpc = this->GetNpcSynWarLetter();
		if(pNpc)
			pNpc->SetOccupyTime();
	}
}
//得到地图的随机位置
bool CGameMap::GetRandomPos(int &nX,int &nY)
{
	int nWidth = this->GetWidth();
	int nHeight = this->GetHeight();

	int nNum=0;

	while(nNum<20)
	{
		nX = ::RandGet(nWidth);
		nY = ::RandGet(nHeight);
		if(this->IsStandEnable(nX,nY))
			return true;
		else
		{
			nNum++;
			continue;
		}
	}

	return false;
}

⌨️ 快捷键说明

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