📄 gamemap.cpp
字号:
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 + -