[Ajuda] Recriando Arquivo

Started by Wuefez, 14 de June , 2007, 10:19:37 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Wuefez

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


"Quem fala não faz."

anakim

hehe ta falando serio? quer q alguem faca isso pra vc? ahsushuahusa, www.google.com e ache um bom curso de C  ;D
Why use Windows? If I have the door ;-)

Wuefez

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.


"Quem fala não faz."