Hikayeler

Reklam vermek için turkmmo@gmail.com

MOB DROBU AYARLAMA ACİL YARDIM LAZIM

Katılım
13 Mar 2026
Konular
8
Mesajlar
60
Online süresi
79115s
Reaksiyon Skoru
12
Altın Konu
0
Başarım Puanı
12
TM Yaşı
1 Ay 7 Gün
MmoLira
905
DevLira
0

Metin2 EP, Valorant VP dahil tüm oyun ürünlerini en uygun fiyatlarla bulabilir, Item ve Karakterlerinizi hızlıca satabilirsiniz. HEMEN TIKLA!

1 LEVEL HESAP DROBU

1lv.jpg

1lvv.jpg




20 LEVEL HESAP DROBU


20lv.jpg
20lvv.jpg





ARKADAŞLAR KARAKTER SEVİYESİNE GÖRE YABANİ KÖPEKTE DROPLAR DEĞİŞMEKTE RESİMDEDE GÖRDÜĞÜNÜZ GİBİ BUNUN GİBİ SEVİYEYE GÖRE DEĞİŞEN MOB DROBU NASIL AYARLAYA BİLİRİM YARDIMCI OLURMUSUNUZ.

martysama 5.8 p23 altyapısını kullanıyorum.
 
Çözüm
Merhaba,
Src Kısmına m_iMaxLevelLimit ve m_iMinLevelLimit Tanımları Ekleyerek Mob_drop kısmında
{ Type limit mob 101 level_limit 1 max_level_limit 15 1 27992 1 100}
bu şekilde düzenleme ile yapabilirsin srcde verdiğin değerdekilere düşmesini sağlayabilirsin.
item_manager.h tanımlamalısın
item_manager_read.cpp fonskiyonu girmelisin
item_manager.cpp kısmında düzenlemelisin.


yapay zekaya yaptırdım test edicem vaktim olursa sizede yollayım kontrol edermisiniz saçmalamış mı


1. item_manager.h - CLevelItemGroup sınıfını güncelle:
class CLevelItemGroup
{
    struct SLevelItemGroupInfo
    {
        DWORD dwVNum;
        DWORD dwPct;
        int iCount;

        SLevelItemGroupInfo(DWORD dwVnum, DWORD dwPct, int iCount)
            : dwVNum(dwVnum), dwPct(dwPct), iCount(iCount)
        { }
    };

    private :
        DWORD m_dwMinLevel;        // Minimum level requirement
        DWORD m_dwMaxLevel;        // Maximum level requirement
        std::string m_stName;
        std::vector<SLevelItemGroupInfo> m_vec_items;

    public :
        // Constructor
        CLevelItemGroup(DWORD dwMinLevel, DWORD dwMaxLevel = 999)
            : m_dwMinLevel(dwMinLevel), m_dwMaxLevel(dwMaxLevel)
        {}

        DWORD GetMinLevel() { return m_dwMinLevel; }
        DWORD GetMaxLevel() { return m_dwMaxLevel; }

        void AddItem(DWORD dwItemVnum, DWORD dwPct, int iCount)
        {
            m_vec_items.emplace_back(SLevelItemGroupInfo(dwItemVnum, dwPct, iCount));
        }

        const std::vector<SLevelItemGroupInfo> & GetVector()
        {
            return m_vec_items;
        }
};

2. item_manager_read_tables.cpp - Dosya okuma mantığını güncelle​

ReadMonsterDropItemGroup fonksiyonunda strType == "limit" kısmını aşağıdaki gibi değiştir
C++:
else if ( strType == "limit" )
{
    int iMinLevel = 0;
    int iMaxLevel = 999; // Varsayılan maksimum level
    
    // min_level kontrolü (zorunlu)
    if ( !loader.GetTokenInteger("min_level", &iMinLevel) )
    {
        // Eski format için geriye dönük uyumluluk
        if ( !loader.GetTokenInteger("level_limit", &iMinLevel) )
        {
            sys_err("ReadMonsterDropItemGroup : Syntax error %s : no min_level, node %s", c_pszFileName, stName.c_str());
            loader.SetParentNode();
            return false;
        }
        else
        {
            sys_log(0, "Using legacy level_limit as min_level: %d for node %s", iMinLevel, stName.c_str());
        }
    }
    
    // max_level kontrolü (opsiyonel)
    if (loader.GetTokenInteger("max_level", &iMaxLevel))
    {
        sys_log(0, "Level range: %d - %d for node %s", iMinLevel, iMaxLevel, stName.c_str());
    }
    else
    {
        sys_log(0, "Using only min_level: %d (no upper limit) for node %s", iMinLevel, stName.c_str());
    }
    
    // Min level kontrolü
    if (iMinLevel < 1)
    {
        sys_err("ReadMonsterDropItemGroup : Invalid min_level %d, node %s", iMinLevel, stName.c_str());
        loader.SetParentNode();
        return false;
    }
    
    CLevelItemGroup* pkLevelItemGroup = M2_NEW CLevelItemGroup(iMinLevel, iMaxLevel);

    for ( int k=1; k < 256; k++ )
    {
        char buf[4];
        snprintf(buf, sizeof(buf), "%d", k);

        if ( loader.GetTokenVector(buf, &pTok) )
        {
            std::string& name = pTok->at(0);
            DWORD dwItemVnum = 0;

            if (!GetValidVnum(name.c_str(), dwItemVnum)
                && !GetVnumByOriginalName(name.c_str(), dwItemVnum))
            {
                sys_err("ReadDropItemGroup : there is no item %s : node %s", name.c_str(), stName.c_str());
                M2_DELETE(pkLevelItemGroup);
                return false;
            }

            int iCount = 0;
            str_to_number(iCount, pTok->at(1).c_str());

            if (iCount < 1)
            {
                sys_err("ReadMonsterDropItemGroup : there is no count for item %s : node %s", name.c_str(), stName.c_str());
                M2_DELETE(pkLevelItemGroup);
                return false;
            }

            float fPct = atof(pTok->at(2).c_str());
            DWORD dwPct = (DWORD)(10000.0f * fPct);

            sys_log(0,"        name %s pct %d count %d", name.c_str(), dwPct, iCount);
            pkLevelItemGroup->AddItem(dwItemVnum, dwPct, iCount);

            continue;
        }

        break;
    }

    m_map_pkLevelItemGroup.emplace(iMobVnum, pkLevelItemGroup);
}

3. item_manager.cpp - Drop kontrol mantığını güncelle​

CreateDropItem fonksiyonunda Level Item Group kontrolünü yapan kısmı aşağıdaki gibi değiştir:
C++:
// Level Item Group
{
    itertype(m_map_pkLevelItemGroup) it;
    it = m_map_pkLevelItemGroup.find(pkChr->GetRaceNum());

    if ( it != m_map_pkLevelItemGroup.end() )
    {
        DWORD dwMinLevel = it->second->GetMinLevel();
        DWORD dwMaxLevel = it->second->GetMaxLevel();
        
        // Karakterin seviyesi min_level ve max_level arasında olmalı
        if ( (DWORD)iLevel >= dwMinLevel && (DWORD)iLevel <= dwMaxLevel )
        {
            typeof(it->second->GetVector()) v = it->second->GetVector();

            for ( DWORD i=0; i < v.size(); i++ )
            {
                if ( v[i].dwPct >= (DWORD)number(1, 1000000/*iRandRange*/) )
                {
                    DWORD dwVnum = v[i].dwVNum;
                    item = CreateItem(dwVnum, v[i].iCount, 0, true);
                    if ( item ) vec_item.emplace_back(item);
                }
            }
            
            sys_log(3, "Level item group check passed: Char level %d (min:%d, max:%d)",
                    iLevel, dwMinLevel, dwMaxLevel);
        }
        else
        {
            sys_log(3, "Level item group check failed: Char level %d (min:%d, max:%d)",
                    iLevel, dwMinLevel, dwMaxLevel);
        }
    }
}

4. mob_drop_item.txt Yeni Format​

Artık mob_drop_item.txt dosyasında şu şekilde kullanabilirsin:

Sadece minimum level (eski sistem gibi):

Kod:
type    limit
mob    1234
min_level    50
1    item_vnum    1    100.0
2    item_vnum2    1    50.0

Minimum ve maksimum level (yeni sistem):

Kod:
type    limit
mob    1234
min_level    50
max_level    70
1    item_vnum    1    100.0
2    item_vnum2    1    50.0
 
yapay zekaya yaptırdım test edicem vaktim olursa sizede yollayım kontrol edermisiniz saçmalamış mı


1. item_manager.h - CLevelItemGroup sınıfını güncelle:
class CLevelItemGroup
{
    struct SLevelItemGroupInfo
    {
        DWORD dwVNum;
        DWORD dwPct;
        int iCount;

        SLevelItemGroupInfo(DWORD dwVnum, DWORD dwPct, int iCount)
            : dwVNum(dwVnum), dwPct(dwPct), iCount(iCount)
        { }
    };

    private :
        DWORD m_dwMinLevel;        // Minimum level requirement
        DWORD m_dwMaxLevel;        // Maximum level requirement
        std::string m_stName;
        std::vector<SLevelItemGroupInfo> m_vec_items;

    public :
        // Constructor
        CLevelItemGroup(DWORD dwMinLevel, DWORD dwMaxLevel = 999)
            : m_dwMinLevel(dwMinLevel), m_dwMaxLevel(dwMaxLevel)
        {}

        DWORD GetMinLevel() { return m_dwMinLevel; }
        DWORD GetMaxLevel() { return m_dwMaxLevel; }

        void AddItem(DWORD dwItemVnum, DWORD dwPct, int iCount)
        {
            m_vec_items.emplace_back(SLevelItemGroupInfo(dwItemVnum, dwPct, iCount));
        }

        const std::vector<SLevelItemGroupInfo> & GetVector()
        {
            return m_vec_items;
        }
};

2. item_manager_read_tables.cpp - Dosya okuma mantığını güncelle​

ReadMonsterDropItemGroup fonksiyonunda strType == "limit" kısmını aşağıdaki gibi değiştir
C++:
else if ( strType == "limit" )
{
    int iMinLevel = 0;
    int iMaxLevel = 999; // Varsayılan maksimum level
   
    // min_level kontrolü (zorunlu)
    if ( !loader.GetTokenInteger("min_level", &iMinLevel) )
    {
        // Eski format için geriye dönük uyumluluk
        if ( !loader.GetTokenInteger("level_limit", &iMinLevel) )
        {
            sys_err("ReadMonsterDropItemGroup : Syntax error %s : no min_level, node %s", c_pszFileName, stName.c_str());
            loader.SetParentNode();
            return false;
        }
        else
        {
            sys_log(0, "Using legacy level_limit as min_level: %d for node %s", iMinLevel, stName.c_str());
        }
    }
   
    // max_level kontrolü (opsiyonel)
    if (loader.GetTokenInteger("max_level", &iMaxLevel))
    {
        sys_log(0, "Level range: %d - %d for node %s", iMinLevel, iMaxLevel, stName.c_str());
    }
    else
    {
        sys_log(0, "Using only min_level: %d (no upper limit) for node %s", iMinLevel, stName.c_str());
    }
   
    // Min level kontrolü
    if (iMinLevel < 1)
    {
        sys_err("ReadMonsterDropItemGroup : Invalid min_level %d, node %s", iMinLevel, stName.c_str());
        loader.SetParentNode();
        return false;
    }
   
    CLevelItemGroup* pkLevelItemGroup = M2_NEW CLevelItemGroup(iMinLevel, iMaxLevel);

    for ( int k=1; k < 256; k++ )
    {
        char buf[4];
        snprintf(buf, sizeof(buf), "%d", k);

        if ( loader.GetTokenVector(buf, &pTok) )
        {
            std::string& name = pTok->at(0);
            DWORD dwItemVnum = 0;

            if (!GetValidVnum(name.c_str(), dwItemVnum)
                && !GetVnumByOriginalName(name.c_str(), dwItemVnum))
            {
                sys_err("ReadDropItemGroup : there is no item %s : node %s", name.c_str(), stName.c_str());
                M2_DELETE(pkLevelItemGroup);
                return false;
            }

            int iCount = 0;
            str_to_number(iCount, pTok->at(1).c_str());

            if (iCount < 1)
            {
                sys_err("ReadMonsterDropItemGroup : there is no count for item %s : node %s", name.c_str(), stName.c_str());
                M2_DELETE(pkLevelItemGroup);
                return false;
            }

            float fPct = atof(pTok->at(2).c_str());
            DWORD dwPct = (DWORD)(10000.0f * fPct);

            sys_log(0,"        name %s pct %d count %d", name.c_str(), dwPct, iCount);
            pkLevelItemGroup->AddItem(dwItemVnum, dwPct, iCount);

            continue;
        }

        break;
    }

    m_map_pkLevelItemGroup.emplace(iMobVnum, pkLevelItemGroup);
}

3. item_manager.cpp - Drop kontrol mantığını güncelle​

CreateDropItem fonksiyonunda Level Item Group kontrolünü yapan kısmı aşağıdaki gibi değiştir:
C++:
// Level Item Group
{
    itertype(m_map_pkLevelItemGroup) it;
    it = m_map_pkLevelItemGroup.find(pkChr->GetRaceNum());

    if ( it != m_map_pkLevelItemGroup.end() )
    {
        DWORD dwMinLevel = it->second->GetMinLevel();
        DWORD dwMaxLevel = it->second->GetMaxLevel();
       
        // Karakterin seviyesi min_level ve max_level arasında olmalı
        if ( (DWORD)iLevel >= dwMinLevel && (DWORD)iLevel <= dwMaxLevel )
        {
            typeof(it->second->GetVector()) v = it->second->GetVector();

            for ( DWORD i=0; i < v.size(); i++ )
            {
                if ( v[i].dwPct >= (DWORD)number(1, 1000000/*iRandRange*/) )
                {
                    DWORD dwVnum = v[i].dwVNum;
                    item = CreateItem(dwVnum, v[i].iCount, 0, true);
                    if ( item ) vec_item.emplace_back(item);
                }
            }
           
            sys_log(3, "Level item group check passed: Char level %d (min:%d, max:%d)",
                    iLevel, dwMinLevel, dwMaxLevel);
        }
        else
        {
            sys_log(3, "Level item group check failed: Char level %d (min:%d, max:%d)",
                    iLevel, dwMinLevel, dwMaxLevel);
        }
    }
}

4. mob_drop_item.txt Yeni Format​

Artık mob_drop_item.txt dosyasında şu şekilde kullanabilirsin:

Sadece minimum level (eski sistem gibi):​

Kod:
type    limit
mob    1234
min_level    50
1    item_vnum    1    100.0
2    item_vnum2    1    50.0

Minimum ve maksimum level (yeni sistem):​

Kod:
type    limit
mob    1234
min_level    50
max_level    70
1    item_vnum    1    100.0
2    item_vnum2    1    50.0
Yapı mantık olarak doğru test ettiktne sonra dön bakalım
 
Yapı mantık olarak doğru test ettiktne sonra dön bakalım
Evet test ettim oldu fakat sorun şu

Mesela 101 vnumlu mob u farklı seviye gruplarına göre drop ayarı yapınca örneğin ilk grup 1 20 seviye arası 2. Grup ise 21 30 seviye arası 2. Grup çalışmıyor ilk grubu baz alıyor her zaman bunun içinde extra değişiklik yapmam lazım sanırsam

Çoklu grup desteği için yine aynı cpplerde düzenleme yapsak yeterli sanırsam
 
Son düzenleme:
Evet test ettim oldu fakat sorun şu

Mesela 101 vnumlu mob u farklı seviye gruplarına göre drop ayarı yapınca örneğin ilk grup 1 20 seviye arası 2. Grup ise 21 30 seviye arası 2. Grup çalışmıyor ilk grubu baz alıyor her zaman bunun içinde extra değişiklik yapmam lazım sanırsam

Çoklu grup desteği için yine aynı cpplerde düzenleme yapsak yeterli sanırsam
Evet yeterli olacaktır hallettin mi?
 

Şu an konuyu görüntüleyenler (Toplam : 1, Üye: 0, Misafir: 1)

Geri
Üst