Metin2 Karakter Seçme Ekranı Silah Gösterme

  • Konuyu açan Konuyu açan Darklovers
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 8
  • Gösterim Gösterim 579

Darklovers

Gold Üye
Gold Üye
Usta Üye
Mesaj
239
Çözümler
15
Beğeni
965
Puan
839
Ticaret Puanı
0
Bilgisayarı Temizlerken Denk Geldi Uzun Zaman Önce Yapmıştım Ama Hiç Kullanmadım Bildiğim Kadarıyla Galiba Tek Sorunu Client Kapatıp Açınca Silah Görünmüyor muydu Yada Farklı Bir Silah mı Görünüyordu Emin Değilim



Önizleme.webp


 

Dosya Eklentileri

Son düzenleme:
Eline sağlık

shining efektleride gösterme yapılsa aslında iyi olur
 
Sistemi inceledim ve kurdum. Bazı eksiklikler ve ciddi problemler mevcut.

game/char.cpp:
Genişlet Daralt Kopyala
//ARA :
    case PART_HAIR:
        return GetPart(PART_HAIR);

//ALTINA EKLE :
    case PART_WEAPON:
        return GetPart(PART_WEAPON);

CHARACTER::GetOriginalPart fonksiyonunda PART_WEAPON 0 döndürmeli aksi takdirde silah çıkarıldığında model hala görünür olur.

Sanıyorum istemciyi kapattığınızda modellerin gözükmeme sebebi CClientManager::RESULT_LOGIN fonksiyonundaki else bloğunu düzenlemeyi ıskalamış olmanız.

db\ClientManagerLogin.cpp:
Genişlet Daralt Kopyala
        else
        {
            ++info->account_index;

            char queryStr[512];
            extern std::string g_stLocale;
            if (g_stLocale == "gb2312")
            {
                snprintf(queryStr, sizeof(queryStr),
                        "SELECT id, name, job, level, alignment, st, ht, dx, iq, part_main, part_hair, x, y, skill_group, change_name FROM player%s WHERE account_id=%u",
                        GetTablePostfix(), info->pAccountTable->id);
            }
            else
            {
                snprintf(queryStr, sizeof(queryStr),
                        "SELECT id, name, job, level, playtime, st, ht, dx, iq, part_main, part_hair, x, y, skill_group, change_name FROM player%s WHERE account_id=%u",
                        GetTablePostfix(), info->pAccountTable->id);
            }

            CDBManager::instance().ReturnQuery(queryStr, QID_LOGIN, peer->GetHandle(), info);
        }
        return;

Aşağıdaki gibi düzenlemeniz yeterlidir, makro ismini değiştirmeyi unutmayın.

db\ClientManagerLogin.cpp:
Genişlet Daralt Kopyala
        else
        {
            ++info->account_index;

            char queryStr[512];
            extern std::string g_stLocale;
            
#ifdef MACRO
            if (g_stLocale == "gb2312")
            {
                snprintf(queryStr, sizeof(queryStr),
                        "SELECT id, name, job, level, alignment, st, ht, dx, iq, part_main, part_hair, x, y, skill_group, change_name, part_weapon FROM player%s WHERE account_id=%u",
                        GetTablePostfix(), info->pAccountTable->id);
            }
            else
            {
                snprintf(queryStr, sizeof(queryStr),
                        "SELECT id, name, job, level, playtime, st, ht, dx, iq, part_main, part_hair, x, y, skill_group, change_name, part_weapon FROM player%s WHERE account_id=%u",
                        GetTablePostfix(), info->pAccountTable->id);
            }
#else
            if (g_stLocale == "gb2312")
            {
                snprintf(queryStr, sizeof(queryStr),
                        "SELECT id, name, job, level, alignment, st, ht, dx, iq, part_main, part_hair, x, y, skill_group, change_name FROM player%s WHERE account_id=%u",
                        GetTablePostfix(), info->pAccountTable->id);
            }
            else
            {
                snprintf(queryStr, sizeof(queryStr),
                        "SELECT id, name, job, level, playtime, st, ht, dx, iq, part_main, part_hair, x, y, skill_group, change_name FROM player%s WHERE account_id=%u",
                        GetTablePostfix(), info->pAccountTable->id);
            }
#endif

            CDBManager::instance().ReturnQuery(queryStr, QID_LOGIN, peer->GetHandle(), info);
        }
        return;

Karakterler, karakter seçme ekranında silah animasyonlarına göre tepki vermezler dolayısıyla giyili silahlar animasyon ile uyumlu gözükmez.

Öncelikle playersettingmodule.py içerisine modelleri kaydetmemiz gerekiyor. Yalnızca 3 karakterim var, listeyi oyununuzdaki karakterlere göre genişletin.

root/playersettingmodule.py:
Genişlet Daralt Kopyala
    ##############
    # WARRIOR
    ##############
    chrmgr.CreateRace(RACE_WARRIOR_M)
    chrmgr.SelectRace(RACE_WARRIOR_M)   
    chrmgr.SetPathName("d:/ymir Work/pc/warrior/")
    chrmgr.LoadRaceData("warrior.msm")
    SetIntroMotions(chr.MOTION_MODE_GENERAL, "d:/ymir work/pc/warrior/intro/")

    chrmgr.SetPathName("d:/ymir work/pc/warrior/onehand_sword/")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_ONEHAND_SWORD, chr.MOTION_INTRO_WAIT, "wait.msa")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_ONEHAND_SWORD, chr.MOTION_INTRO_SELECTED, "wait.msa")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_ONEHAND_SWORD, chr.MOTION_INTRO_NOT_SELECTED, "wait.msa")

    chrmgr.SetPathName("d:/ymir work/pc/warrior/twohand_sword/")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_TWOHAND_SWORD, chr.MOTION_INTRO_WAIT, "wait.msa")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_TWOHAND_SWORD, chr.MOTION_INTRO_SELECTED, "wait.msa")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_TWOHAND_SWORD, chr.MOTION_INTRO_NOT_SELECTED, "wait.msa")

    ##############
    # ASSASSIN
    ##############
    chrmgr.CreateRace(RACE_ASSASSIN_W)
    chrmgr.SelectRace(RACE_ASSASSIN_W)
    chrmgr.SetPathName("d:/ymir work/pc/assassin/")
    chrmgr.LoadRaceData("assassin.msm")
    SetIntroMotions(chr.MOTION_MODE_GENERAL, "d:/ymir work/pc/assassin/intro/")

    chrmgr.SetPathName("d:/ymir work/pc/assassin/onehand_sword/")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_ONEHAND_SWORD, chr.MOTION_INTRO_WAIT, "wait.msa")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_ONEHAND_SWORD, chr.MOTION_INTRO_SELECTED, "wait.msa")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_ONEHAND_SWORD, chr.MOTION_INTRO_NOT_SELECTED, "wait.msa")

    chrmgr.SetPathName("d:/ymir work/pc/assassin/dualhand_sword/")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_DUALHAND_SWORD, chr.MOTION_INTRO_WAIT, "wait.msa")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_DUALHAND_SWORD, chr.MOTION_INTRO_SELECTED, "wait.msa")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_DUALHAND_SWORD, chr.MOTION_INTRO_NOT_SELECTED, "wait.msa")

    chrmgr.SetPathName("d:/ymir work/pc/assassin/bow/")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_BOW, chr.MOTION_INTRO_WAIT, "wait.msa")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_BOW, chr.MOTION_INTRO_SELECTED, "wait.msa")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_BOW, chr.MOTION_INTRO_NOT_SELECTED, "wait.msa")

    ##############
    # SURA
    ##############
    chrmgr.CreateRace(RACE_SURA_M)
    chrmgr.SelectRace(RACE_SURA_M)   
    chrmgr.SetPathName("d:/ymir work/pc/sura/")
    chrmgr.LoadRaceData("sura.msm")
    SetIntroMotions(chr.MOTION_MODE_GENERAL, "d:/ymir work/pc/sura/intro/")

    chrmgr.SetPathName("d:/ymir work/pc/sura/onehand_sword/")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_ONEHAND_SWORD, chr.MOTION_INTRO_WAIT, "wait.msa")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_ONEHAND_SWORD, chr.MOTION_INTRO_SELECTED, "wait.msa")
    chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_ONEHAND_SWORD, chr.MOTION_INTRO_NOT_SELECTED, "wait.msa")

MakeCharacter fonksiyonunu aşağıdaki gibi değiştirmelisiniz.

root/introselect.py:
Genişlet Daralt Kopyala
    def MakeCharacter(self, index, id, name, race, form, hair, weapon = 0):
        if 0 == id:
            return

        chr.CreateInstance(index)
        chr.SelectInstance(index)
        chr.SetVirtualID(index)
        chr.SetNameString(name)

        chr.SetRace(race)
        chr.SetArmor(form)
        chr.SetHair(hair)

        chr.Refresh()

        motionMode = chr.MOTION_MODE_GENERAL

        if app.SWOCSS and weapon > 0:
            chr.SetWeapon(weapon)
            
            import item
            item.SelectItem(weapon)
            subType = item.GetItemSubType()

            if subType == item.WEAPON_SWORD:
                motionMode = chr.MOTION_MODE_ONEHAND_SWORD
            elif subType == item.WEAPON_TWO_HANDED:
                motionMode = chr.MOTION_MODE_TWOHAND_SWORD
            elif subType == item.WEAPON_DAGGER:
                motionMode = chr.MOTION_MODE_DUALHAND_SWORD
            elif subType == item.WEAPON_BOW:
                motionMode = chr.MOTION_MODE_BOW
            elif subType == item.WEAPON_BELL:
                motionMode = 7
            elif subType == item.WEAPON_FAN:
                motionMode = 6

        chr.SetMotionMode(motionMode)

        chr.SetLoopMotion(chr.MOTION_INTRO_WAIT)

        chr.SetRotation(0.0)

Client source tarafında NEW_RegisterMotion fonksiyonu bu yeni modelleri okuyabilmeli.

GameLib\RaceData.cpp:
Genişlet Daralt Kopyala
CGraphicThing* CRaceData::NEW_RegisterMotion(CRaceMotionData* pkMotionData, WORD wMotionModeIndex, WORD wMotionIndex, const char * c_szFileName, BYTE byPercentage)
{   
    CGraphicThing * pMotionThing = (CGraphicThing *)CResourceManager::Instance().GetResourcePointer(c_szFileName);

    TMotionModeData * pMotionModeData;
    if (!GetMotionModeDataPointer(wMotionModeIndex, &pMotionModeData))
    {
#ifdef MACRO
        TMotionModeData* pNewMotionModeData = new TMotionModeData();
        m_pMotionModeDataMap[wMotionModeIndex] = pNewMotionModeData;
        GetMotionModeDataPointer(wMotionModeIndex, &pMotionModeData);
#else
        AssertLog("Failed getting motion mode data!");
        return NULL;
#endif
    }

    TMotion    kMotion;
    kMotion.byPercentage = byPercentage;
    kMotion.pMotion         = pMotionThing;
    kMotion.pMotionData     = pkMotionData;
    pMotionModeData->MotionVectorMap[wMotionIndex].push_back(kMotion);

    return pMotionThing;
[CENTER]}

Honeycam-2026-06-19-08-33-39.gif
[/CENTER]
 
Geri
Üst