Gente seguinte, eu to com o server de um jogo online, e queria rodar ele, o problema é que eu so tenho o source, e não os mapas, então eu pensei eu recrio meu mapinha e pronto, mas ai eu não tenho nem um mapa de exemplo para começar os meus, então eu pensei ja que eu tenho o source, eu posso ler o source e ver como os mapas funcionam pelo source.
Bem aqui esta a função que le o arquivo do mapa, se alguem por favor poder ajudar, eu ficaria muito agradecido:
// SMP Á¤º¸ ÆÄÀÏÀ» ¿¬´Ù.
string SMPFilename = g_pConfig->getProperty("HomePath") + "/data/" + pZoneInfo->getSMPFilename();
ifstream SMP(SMPFilename.c_str(), ios::in | ios::binary | ios::nocreate);
if (!SMP)
{
strcpy(lwrFilename, SMPFilename.c_str());
strlwr( lwrFilename );
SMP.open(lwrFilename, ios::in | ios::binary | ios::nocreate);
//cout << "second chk : " << lwrFilename.c_str() << endl;
if (!SMP)
{
StringStream msg;
msg << SMPFilename << " not exist or cannot open it";
cerr << msg.toString() << endl;
throw FileNotExistException(msg.toString());
}
}
// read zone version
SMP.read(&versionLen,szDWORD);
SMP.read(version,versionLen);
version[versionLen] = 0;
// read zone id
SMP.read(&zoneID,szWORD);
// read zone group id (no use)
SMP.read(&zoneGroupID,szWORD);
// read zone name
SMP.read(&zonenameLen,szDWORD);
if (zonenameLen > 0)
{
SMP.read(zonename,zonenameLen);
zonename[zonenameLen] = 0;
}
// read zone type & level
SMP.read(&zoneType,szBYTE);
SMP.read(&zoneLevel,szBYTE);
// read zone description
SMP.read(&descLen,szDWORD);
if (descLen > 0)
{
pDesc = new char[descLen+1];
SMP.read(pDesc,descLen);
pDesc[descLen] = 0;
SAFE_DELETE_ARRAY(pDesc); // add '_ARRAY' moved to here.. by sigi 2002.5.2
}
// read zone width & height
SMP.read(&m_Width, szWORD);
SMP.read(&m_Height ,szWORD);
Assert(m_Width <= maxZoneWidth);
Assert(m_Height <= maxZoneHeight);
// ŸÀÏÀ» 2Â÷¿ø¹è¿·Î ¸¸µé¾î ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù.
m_pTiles = new Tile* [ m_Width ];
for (uint i = 0; i < m_Width; i++)
{
m_pTiles[i] = new Tile [m_Height];
}
// ¼½Å͸¦ 2Â÷¿ø ¹è¿·Î ¸¸µé¾î ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù.
m_SectorWidth = (int)ceil((float)m_Width/(float)SECTOR_SIZE);
m_SectorHeight = (int)ceil((float)m_Height/(float)SECTOR_SIZE);
m_pSectors = new (Sector*)[m_SectorWidth];
for (int x=0; x<m_SectorWidth; x++)
{
m_pSectors[x] = new Sector[m_SectorHeight];
}
// °¢°¢ÀÇ Å¸ÀÏ¿¡´Ù°¡ ¼½ÅÍ Æ÷ÀÎÅ͸¦ ¼¼ÆÃÇÑ´Ù.
for (int x=0; x<m_Width; x++)
{
for (int y=0; y<m_Height; y++)
{
int sx = x/SECTOR_SIZE;
int sy = y/SECTOR_SIZE;
Assert(sx < m_SectorWidth && sy < m_SectorHeight);
m_pTiles[x][y].setSector(&m_pSectors[sx][sy]);
}
}
// ¼½Åͳ¢¸® ¿¬°áÀ» ÇÑ´Ù.
VSRect srect(0, 0, m_SectorWidth-1, m_SectorHeight-1);
for (int x=0; x<m_SectorWidth; x++)
{
for (int y=0; y<m_SectorHeight; y++)
{
for (uint d=0; d<9; d++)
{
int sectorx = x + dirMoveMask[d].x;
int sectory = y + dirMoveMask[d].y;
if (srect.ptInRect(sectorx, sectory))
{
m_pSectors[x][y].setNearbySector(d, &m_pSectors[sectorx][sectory]);
}
}
}
}
// MonsterAI¸¦ À§ÇØ Á¸ÀÇ ¿µ¿ªÀ» ±¸ºÐÁö¾î³õÀº »ç°¢ÇüÀ» »ý¼ºÇÑ´Ù.
m_OuterRect.set(0, 0, m_Width-1, m_Height-1);
if (m_Width > 64 && m_Height > 64)
{
m_InnerRect.set(15, 15, m_Width-15, m_Height-15);
m_CoreRect.set(25, 25, m_Width-25, m_Height-25);
}
char str[80];
char str2[80];
for (ZoneCoord_t y=0; y<m_Height; y++)
{
for (ZoneCoord_t x=0; x<m_Width; x++)
{
BYTE flag = 0;
SMP.read(&flag, szBYTE);
// ¼ø¼´ë·Î ÁöÇÏ, Áö»ó, °øÁß ºí·Ï
if (flag & 0x01) m_pTiles[x][y].setBlocked(Creature::MOVE_MODE_BURROWING);
if (flag & 0x02) m_pTiles[x][y].setBlocked(Creature::MOVE_MODE_WALKING);
if (flag & 0x04) m_pTiles[x][y].setBlocked(Creature::MOVE_MODE_FLYING);
// ¾Æ¹«°Íµµ ¾ø´Â °æ¿ì..
// ¸÷ »ý¼ºÀ» À§ÇÑ ÁÂÇ¥Á¤º¸¸¦ ¸¸µé¾îµÐ´Ù.
if (flag==0 && m_InnerRect.ptInRect( x, y ))
{
m_MonsterRegenPositions.push_back( BPOINT( (BYTE)x, (BYTE)y ) );
}
// ¸¶½ºÅÍ ·¹¾îÀÎ °æ¿ì: blockÀÌ Çϳª¶óµµ ¾È µÈ °÷À» ã´Â´Ù.
if ((flag & 0x07)!=0x07 && (isMasterLair() || m_ZoneID == 3002))
{
m_EmptyTilePositions.push_back( BPOINT( (BYTE)x, (BYTE)y ) );
}
// Æ÷Å» Á¤º¸
if (flag & 0x80)
{
BYTE type;
ZoneID_t targetZoneID;
BYTE targetX, targetY;
SMP.read(&type, szBYTE);
PortalType_t portalType = PORTAL_NORMAL;
bool bAddPortal = true;
if (type == PORTAL_NORMAL)
{
SMP.read(&targetZoneID, szZoneID);
SMP.read(&targetX, szBYTE);
SMP.read(&targetY, szBYTE);
// Æ÷Å»À» »ý¼ºÇØ ÁØ´Ù.
NormalPortal* pNormalPortal = new NormalPortal();
pNormalPortal->setObjectType(PORTAL_NORMAL);
pNormalPortal->setZoneID(targetZoneID);
pNormalPortal->setX(targetX);
pNormalPortal->setY(targetY);
getObjectRegistry().registerObject(pNormalPortal);
m_pTiles[x][y].addPortal(pNormalPortal);
if (bOutput)
{
cout << "Normal(" << (int)x << "," << (int)y << "," << (int)targetZoneID << "," << (int)targetX << "," << (int)targetY << ")" << endl;
}
}
else if (type == PORTAL_SLAYER)
{
SMP.read(&targetZoneID, szZoneID);
SMP.read(&targetX, szBYTE);
SMP.read(&targetY, szBYTE);
// Æ÷Å»À» »ý¼ºÇØ ÁØ´Ù.
NormalPortal* pNormalPortal = new NormalPortal();
pNormalPortal->setObjectType(PORTAL_SLAYER);
pNormalPortal->setZoneID(targetZoneID);
pNormalPortal->setX(targetX);
pNormalPortal->setY(targetY);
getObjectRegistry().registerObject(pNormalPortal);
m_pTiles[x][y].addPortal(pNormalPortal);
portalType = PORTAL_SLAYER;
if (bOutput)
{
cout << "Slayer(" << (int)x << "," << (int)y << "," << (int)targetZoneID << "," << (int)targetX << "," << (int)targetY << ")" << endl;
}
}
else if (type == PORTAL_VAMPIRE)
{
SMP.read(&targetZoneID, szZoneID);
SMP.read(&targetX, szBYTE);
SMP.read(&targetY, szBYTE);
// Æ÷Å»À» »ý¼ºÇØ ÁØ´Ù.
NormalPortal* pNormalPortal = new NormalPortal();
pNormalPortal->setObjectType(PORTAL_VAMPIRE);
pNormalPortal->setZoneID(targetZoneID);
pNormalPortal->setX(targetX);
pNormalPortal->setY(targetY);
getObjectRegistry().registerObject(pNormalPortal);
m_pTiles[x][y].addPortal(pNormalPortal);
portalType = PORTAL_VAMPIRE;
if (bOutput)
{
cout << "Vampire(" << (int)x << "," << (int)y << "," << (int)targetZoneID << "," << (int)targetX << "," << (int)targetY << ")" << endl;
}
}
else if (type == PORTAL_MULTI_TARGET)
{
BYTE size;
SMP.read(&size, szBYTE);
// Æ÷Å»À» »ý¼ºÇØ ÁØ´Ù.
MultiPortal* pMultiPortal = new MultiPortal();
for(int i = 0; i < size; i++)
{
SMP.read(&targetZoneID, szZoneID);
SMP.read(&targetX, szBYTE);
SMP.read(&targetY, szBYTE);
pMultiPortal->setObjectType(PORTAL_SLAYER);
// Ÿ°Ù ÀÎÆ÷¸¦ ±¸¼ºÇÑ´Ù.
PortalTargetInfo* pPortalTargetInfo = new PortalTargetInfo();
pPortalTargetInfo->setZoneID(targetZoneID);
pPortalTargetInfo->setX(targetX);
pPortalTargetInfo->setY(targetY);
pMultiPortal->setPortalTargetInfo(pPortalTargetInfo);
}
getObjectRegistry().registerObject(pMultiPortal);
m_pTiles[x][y].addPortal(pMultiPortal);
portalType = PORTAL_SLAYER;
if (bOutput)
{
cout << "Multi(" << (int)x << "," << (int)y << "," << (int)targetZoneID << "," << (int)targetX << "," << (int)targetY << ")" << endl;
}
}
else if ( type == PORTAL_GUILD )
{
SMP.read(&targetZoneID, szZoneID);
SMP.read(&targetX, szBYTE);
SMP.read(&targetY, szBYTE);
// Æ÷Å»À» »ý¼ºÇØ ÁØ´Ù.
GuildPortal* pGuildPortal = new GuildPortal();
pGuildPortal->setObjectType( PORTAL_GUILD );
pGuildPortal->setZoneID( targetZoneID );
pGuildPortal->setX( targetX );
pGuildPortal->setY( targetY );
getObjectRegistry().registerObject(pGuildPortal);
m_pTiles[x][y].addPortal(pGuildPortal);
if (bOutput)
{
cout << "Guild(" << (int)x << "," << (int)y << "," << (int)targetZoneID << "," << (int)targetX << "," << (int)targetY << ")" << endl;
}
}
else if ( type == PORTAL_BATTLE )
{
SMP.read(&targetZoneID, szZoneID);
SMP.read(&targetX, szBYTE);
SMP.read(&targetY, szBYTE);
// Æ÷Å»À» »ý¼ºÇØ ÁØ´Ù.
NormalPortal* pNormalPortal = new NormalPortal();
pNormalPortal->setObjectType(PORTAL_NORMAL);
pNormalPortal->setZoneID(targetZoneID);
pNormalPortal->setX(targetX);
pNormalPortal->setY(targetY);
getObjectRegistry().registerObject(pNormalPortal);
m_pTiles[x][y].addPortal(pNormalPortal);
if (bOutput)
{
cout << "Slayer(" << (int)x << "," << (int)y << "," << (int)targetZoneID << "," << (int)targetX << "," << (int)targetY << ")" << endl;
}
}
else if (type == PORTAL_OUSTERS)
{
SMP.read(&targetZoneID, szZoneID);
SMP.read(&targetX, szBYTE);
SMP.read(&targetY, szBYTE);
// Æ÷Å»À» »ý¼ºÇØ ÁØ´Ù.
NormalPortal* pNormalPortal = new NormalPortal();
pNormalPortal->setObjectType(PORTAL_OUSTERS);
pNormalPortal->setZoneID(targetZoneID);
pNormalPortal->setX(targetX);
pNormalPortal->setY(targetY);
getObjectRegistry().registerObject(pNormalPortal);
m_pTiles[x][y].addPortal(pNormalPortal);
portalType = PORTAL_OUSTERS;
if (bOutput)
{
cout << "Ousters(" << (int)x << "," << (int)y << "," << (int)targetZoneID << "," << (int)targetX << "," << (int)targetY << ")" << endl;
}
}
else
{
bAddPortal = false;
}
// Æ÷Å»ÀÌ Ãß°¡µÈ °æ¿ì¿¡
// ¸ñÀûÁö Á¸ÀÌ À¯·áÁ¸À̶ó¸é
// TriggeredPortalÀ» ¼³Á¤ÇØ¾ß ÇÑ´Ù.
if (bAddPortal)
{
ZoneInfo* pTargetZoneInfo = NULL;
try {
pTargetZoneInfo = g_pZoneInfoManager->getZoneInfo(targetZoneID);
} catch (NoSuchElementException& t) {
throw Error("±×·± Á¸ÀÌ ¾ø´Ù³×");
}
Assert(pTargetZoneInfo!=NULL);
// ±âÁ¸ÀÇ PortalÀ» Áö¿ï±î?
bool bDeleteOldPortal = false;
if (pTargetZoneInfo->isPayPlay()
|| pTargetZoneInfo->isMasterLair()
|| pTargetZoneInfo->isCastle()
)
{
bDeleteOldPortal = true;
}
Tile& rTile = m_pTiles[x][y];
// ±âÁ¸ÀÇ PortalÀ» Áö¿ì´Â °æ¿ì
if (bDeleteOldPortal)
{
// ±âÁ¸¿¡ ÀÖ´ø portalÀ» Á¦°ÅÇÑ´Ù.
if (rTile.hasPortal())
{
Portal* pOldPortal = rTile.getPortal();
rTile.deletePortal();
delete pOldPortal;
}
}
// Æ÷Å»À» »ý¼ºÇϰí, µî·ÏÇÑ´Ù.
//----------------------------------------
// ¸¶½ºÅÍ ·¹¾îÀÎ °æ¿ì
// by sigi. 2002.9.2
//----------------------------------------
if (pTargetZoneInfo->isMasterLair())
{
TriggeredPortal* pPortal = new TriggeredPortal();
getObjectRegistry().registerObject(pPortal);
// Æ÷Å» ³»¿ëÀ» ·ÎµåÇÑ´Ù.
pPortal->setObjectType(portalType);
//pPortal->load(m_ZoneID, left, top, right, bottom);
TriggerManager& tm = pPortal->getTriggerManager();
Trigger* pTrigger = new Trigger();
pTrigger->setTriggerID( 0 ); // Àǹ̾ø´Ù.
pTrigger->setTriggerType("QUEST");
sprintf(str, "ConditionType : EnterMasterLair\n\t TargetZoneID : %d\n\t", (int)pTargetZoneInfo->getZoneID());
pTrigger->setConditions( str );
sprintf(str, "ActionType : ActivatePortal\n\t ZoneID : %d\n\t X : %d\n\t Y : %d\n\t", targetZoneID, targetX, targetY);
pTrigger->setActions(str);
// sprintf( str2, "ActionType : SystemMessage\n\t Content : %s",
// g_pStringPool->c_str( STRID_CANNOT_ENTER ) );
sprintf( str2, "ActionType : SystemMessage\n\t Content : %d", STRID_CANNOT_ENTER );
pTrigger->setCounterActions( str2 );
// pTrigger->setCounterActions("ActionType : SystemMessage\n\t Content : Áö±ÝÀº µé¾î°¥ ¼ö ¾ø½À´Ï´Ù.");
tm.addTrigger(pTrigger);
// ŸÀÏ¿¡´Ù Æ÷Å»À» ºÙÀδÙ.
rTile.addPortal(pPortal);
//cout << "[" << (int)pTargetZoneInfo->getZoneID() << "] is MasterLair"
// << endl;
}
//----------------------------------------
// ¾Æ´ãÀÇ ¼ºÁö·Î µé¾î°¥·Á°í ÇÒ ¶§
//----------------------------------------
else if (pTargetZoneInfo->isHolyLand()
&& !pZoneInfo->isHolyLand())
{
TriggeredPortal* pPortal = new TriggeredPortal();
getObjectRegistry().registerObject(pPortal);
// Æ÷Å» ³»¿ëÀ» ·ÎµåÇÑ´Ù.
pPortal->setObjectType(portalType);
//pPortal->load(m_ZoneID, left, top, right, bottom);
TriggerManager& tm = pPortal->getTriggerManager();
Trigger* pTrigger = new Trigger();
pTrigger->setTriggerID( 0 ); // Àǹ̾ø´Ù.
pTrigger->setTriggerType("QUEST");
sprintf(str, "ConditionType : EnterHolyLand\n\t TargetZoneID : %d\n\t", (int)pTargetZoneInfo->getZoneID());
pTrigger->setConditions( str );
sprintf(str, "ActionType : ActivatePortal\n\t ZoneID : %d\n\t X : %d\n\t Y : %d\n\t", targetZoneID, targetX, targetY);
pTrigger->setActions(str);
// sprintf( str2, "ActionType : SystemMessage\n\t Content : %s",
// g_pStringPool->c_str( STRID_CANNOT_ENTER_DURING_RACE_WAR ) );
sprintf( str2, "ActionType : SystemMessage\n\t Content : %d", STRID_CANNOT_ENTER_DURING_RACE_WAR );
pTrigger->setCounterActions( str2 );
// pTrigger->setCounterActions("ActionType : SystemMessage\n\t Content : Á¾Á·ÀüÀï Áß¿¡´Â ½ÅûÀ» ÇÏÁö ¾Ê¾ÒÀ¸¸é µé¾î°¥ ¼ö ¾ø½À´Ï´Ù.");
tm.addTrigger(pTrigger);
// ŸÀÏ¿¡´Ù Æ÷Å»À» ºÙÀδÙ.
rTile.addPortal(pPortal);
//cout << "[" << (int)pTargetZoneInfo->getZoneID() << "] is MasterLair"
// << endl;
}
//----------------------------------------
// CastleÀÎ °æ¿ì
// ±×·¯³ª, ÀÌ¹Ì Castle¿¡ ¼ÓÇÑ Á¸ÀÌ ¾Æ´Ñ °æ¿ì
// by bezz, Sequoia 2003. 1.20.
//----------------------------------------
else if (pTargetZoneInfo->isCastle()
&& !g_pCastleInfoManager->isCastleZone(targetZoneID, m_ZoneID))
{
TriggeredPortal* pPortal = new TriggeredPortal();
getObjectRegistry().registerObject(pPortal);
// Æ÷Å» ³»¿ëÀ» ·ÎµåÇÑ´Ù.
pPortal->setObjectType(portalType);
//pPortal->load(m_ZoneID, left, top, right, bottom);
TriggerManager& tm = pPortal->getTriggerManager();
Trigger* pTrigger = new Trigger();
pTrigger->setTriggerID( 0 ); // Àǹ̾ø´Ù.
pTrigger->setTriggerType("QUEST");
sprintf(str, "ConditionType : EnterCastle\n\t TargetZoneID : %d\n\t", (int)pTargetZoneInfo->getZoneID());
pTrigger->setConditions( str );
sprintf(str, "ActionType : ActivatePortal\n\t ZoneID : %d\n\t X : %d\n\t Y : %d\n\t", targetZoneID, targetX, targetY);
pTrigger->setActions(str);
// sprintf( str2, "ActionType : SystemMessage\n\t Content : %s",
// g_pStringPool->c_str( STRID_CANNOT_ENTER ) );
sprintf( str2, "ActionType : SystemMessage\n\t Content : %d", STRID_CANNOT_ENTER );
pTrigger->setCounterActions( str2 );
// pTrigger->setCounterActions("ActionType : SystemMessage\n\t Content : µé¾î°¡½Ç ¼ö ¾ø½À´Ï´Ù.");
tm.addTrigger(pTrigger);
// ŸÀÏ¿¡´Ù Æ÷Å»À» ºÙÀδÙ.
rTile.addPortal(pPortal);
//cout << "[" << (int)pTargetZoneInfo->getZoneID() << "] is MasterLair"
// << endl;
}
//----------------------------------------
// ¼º ÁöÇÏ ´øÁ¯À¸·Î µé¾î°¡´Â ÀÔ±¸
// by Sequoia
//----------------------------------------
else if (isCastle()
&& g_pCastleInfoManager->isCastleZone( m_ZoneID, pTargetZoneInfo->getZoneID() ) )
{
TriggeredPortal* pPortal = new TriggeredPortal();
getObjectRegistry().registerObject(pPortal);
// Æ÷Å» ³»¿ëÀ» ·ÎµåÇÑ´Ù.
pPortal->setObjectType(portalType);
&nbs
hehe ta falando serio? quer q alguem faca isso pra vc? ahsushuahusa, www.google.com (http://www.google.com) e ache um bom curso de C
Eu mesmo ja criei uma tool que cria os smp, mas faltam os ssi, isso pq eu nunca tinha codado nada com ifstream antes, ai eu nao sabia pra que, que servia.
Vai la se divertir com o seu 1 shellbot vai.