Yardım Mob'dan düşen/kazanılan parayı sabitlemek

  • Konuyu açan Konuyu açan Kaiser
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 11
  • Gösterim Gösterim 790
Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

Kaiser

Admin
Admin
Geliştirici
Yardımsever Üye
Mesaj
3.958
Çözümler
381
Beğeni
4.013
Puan
1.849
Ticaret Puanı
0
Belirli moblardan düşen para miktarını vs. güzelce ayarladım, güzelce de düşüyor falan. Fakat Level arttıkça artık doğal olarak düşmemeye/kazanılmamaya başlıyor.
Bir zamanlar oynadığım bir serverda belirli moblarda bu olay sabitti. Aynısını nasıl uygulayabilirim ?
 
Bu tam olarak hangi yerden ayarlanıyor bilmiyorum ancak bu düzenleme pek mantıklı olmayabilir. Sonuçta 90 level birisi 5 level mobları keserek yang, exp ve item elde etmesi oyunun yapısını bozar. :)

Yine de bi kodları incelerim. Bir şeyler bulursam yazarım buraya.
 
Tüm moblar için değil elbette. Kasılmak için ayarladığım map içerisindeki moblar için geçerli olacak sadece. Ve son levele ulaşıldığında (mümkün olur mu bilemiyorum) bu olay iptal olacak yani exp doğal olarak zaten gelmiyor, para düşme olayını da iptal etmek istiyorum.

Teşekkür ederim
 
Hocam char_battle.cpp içinde şu fonksiyonu bir kontrol et.
C++:
Genişlet Daralt Kopyala
void CHARACTER::Reward(bool bItemDrop)
void CHARACTER::RewardGold(LPCHARACTER pkAttacker)
 
Hocam char_battle.cpp içinde şu fonksiyonu bir kontrol et.
C++:
Genişlet Daralt Kopyala
void CHARACTER::Reward(bool bItemDrop)
void CHARACTER::RewardGold(LPCHARACTER pkAttacker)
Baktım ama kod bilgimin zayıf olduğundan olsa gerek, pek bir şey bulamadım açıkcası
 
şöyle birşey düşündüm bir denermisin. bu kodun 169. satırına bak:
C++:
Genişlet Daralt Kopyala
        if(GetRaceNum() == 101 || GetRaceNum() == 102)
        {
            iGold = 10000;
        }
C++:
Genişlet Daralt Kopyala
void CHARACTER::RewardGold(LPCHARACTER pkAttacker)
{
    // ADD_PREMIUM
    bool isAutoLoot =
        (pkAttacker->GetPremiumRemainSeconds(PREMIUM_AUTOLOOT) > 0 ||
         pkAttacker->IsEquipUniqueGroup(UNIQUE_GROUP_AUTOLOOT))
        ? true : false; // 제3의 손
    // END_OF_ADD_PREMIUM

    PIXEL_POSITION pos;

    if (!isAutoLoot)
        if (!SECTREE_MANAGER::instance().GetMovablePosition(GetMapIndex(), GetX(), GetY(), pos))
            return;

    int iTotalGold = 0;
    //
    // --------- 돈 드롭 확률 계산 ----------
    //
    int iGoldPercent = MobRankStats[GetMobRank()].iGoldPercent;

    if (pkAttacker->IsPC())
        iGoldPercent = iGoldPercent * (100 + CPrivManager::instance().GetPriv(pkAttacker, PRIV_GOLD_DROP)) / 100;

    if (pkAttacker->GetPoint(POINT_MALL_GOLDBONUS))
        iGoldPercent += (iGoldPercent * pkAttacker->GetPoint(POINT_MALL_GOLDBONUS) / 100);

    iGoldPercent = iGoldPercent * CHARACTER_MANAGER::instance().GetMobGoldDropRate(pkAttacker) / 100;

    // ADD_PREMIUM
    if (pkAttacker->GetPremiumRemainSeconds(PREMIUM_GOLD) > 0 ||
            pkAttacker->IsEquipUniqueGroup(UNIQUE_GROUP_LUCKY_GOLD))
        iGoldPercent += iGoldPercent;
    // END_OF_ADD_PREMIUM

    if (iGoldPercent > 100)
        iGoldPercent = 100;

    int iPercent;

    if (GetMobRank() >= MOB_RANK_BOSS)
        iPercent = ((iGoldPercent * PERCENT_LVDELTA_BOSS(pkAttacker->GetLevel(), GetLevel())) / 100);
    else
        iPercent = ((iGoldPercent * PERCENT_LVDELTA(pkAttacker->GetLevel(), GetLevel())) / 100);
    //int iPercent = CALCULATE_VALUE_LVDELTA(pkAttacker->GetLevel(), GetLevel(), iGoldPercent);

    if (number(1, 100) > iPercent)
        return;

    int iGoldMultipler = GetGoldMultipler();

    if (1 == number(1, 50000)) // 1/50000 확률로 돈이 10배
        iGoldMultipler *= 10;
    else if (1 == number(1, 10000)) // 1/10000 확률로 돈이 5배
        iGoldMultipler *= 5;

    // 개인 적용
    if (pkAttacker->GetPoint(POINT_GOLD_DOUBLE_BONUS))
        if (number(1, 100) <= pkAttacker->GetPoint(POINT_GOLD_DOUBLE_BONUS))
            iGoldMultipler *= 2;

    //
    // --------- 돈 드롭 배수 결정 ----------
    //
    if (test_server)
        pkAttacker->ChatPacket(CHAT_TYPE_PARTY, "gold_mul %d rate %d", iGoldMultipler, CHARACTER_MANAGER::instance().GetMobGoldAmountRate(pkAttacker));

    //
    // --------- 실제 드롭 처리 -------------
    //
    LPITEM item;

    int iGold10DropPct = 100;
    iGold10DropPct = (iGold10DropPct * 100) / (100 + CPrivManager::instance().GetPriv(pkAttacker, PRIV_GOLD10_DROP));

    // MOB_RANK가 BOSS보다 높으면 무조건 돈폭탄
    if (GetMobRank() >= MOB_RANK_BOSS && !IsStone() && GetMobTable().dwGoldMax != 0)
    {
        if (1 == number(1, iGold10DropPct))
            iGoldMultipler *= 10; // 1% 확률로 돈 10배

        int iSplitCount = number(25, 35);

        for (int i = 0; i < iSplitCount; ++i)
        {
            int iGold = number(GetMobTable().dwGoldMin, GetMobTable().dwGoldMax) / iSplitCount;
            if (test_server)
                sys_log(0, "iGold %d", iGold);
            iGold = iGold * CHARACTER_MANAGER::instance().GetMobGoldAmountRate(pkAttacker) / 100;
            iGold *= iGoldMultipler;

            if (iGold == 0)
            {
                continue ;
            }

            if (test_server)
            {
                sys_log(0, "Drop Moeny MobGoldAmountRate %d %d", CHARACTER_MANAGER::instance().GetMobGoldAmountRate(pkAttacker), iGoldMultipler);
                sys_log(0, "Drop Money gold %d GoldMin %d GoldMax %d", iGold, GetMobTable().dwGoldMax, GetMobTable().dwGoldMax);
            }

            // NOTE: 돈 폭탄은 제 3의 손 처리를 하지 않음
            if ((item = ITEM_MANAGER::instance().CreateItem(1, iGold)))
            {
                pos.x = GetX() + ((number(-14, 14) + number(-14, 14)) * 23);
                pos.y = GetY() + ((number(-14, 14) + number(-14, 14)) * 23);

                item->AddToGround(GetMapIndex(), pos);
                item->StartDestroyEvent();

                iTotalGold += iGold; // Total gold
            }
        }
    }
    // 1% 확률로 돈을 10개 떨어 뜨린다. (10배 드롭임)
    else if (1 == number(1, iGold10DropPct))
    {
        //
        // 돈 폭탄식 드롭
        //
        for (int i = 0; i < 10; ++i)
        {
            int iGold = number(GetMobTable().dwGoldMin, GetMobTable().dwGoldMax);
            iGold = iGold * CHARACTER_MANAGER::instance().GetMobGoldAmountRate(pkAttacker) / 100;
            iGold *= iGoldMultipler;

            if (iGold == 0)
            {
                continue;
            }

            // NOTE: 돈 폭탄은 제 3의 손 처리를 하지 않음
            if ((item = ITEM_MANAGER::instance().CreateItem(1, iGold)))
            {
                pos.x = GetX() + (number(-7, 7) * 20);
                pos.y = GetY() + (number(-7, 7) * 20);

                item->AddToGround(GetMapIndex(), pos);
                item->StartDestroyEvent();

                iTotalGold += iGold; // Total gold
            }
        }
    }
    else
    {
        //
        // 일반적인 방식의 돈 드롭
        //
        int iGold = number(GetMobTable().dwGoldMin, GetMobTable().dwGoldMax);
        iGold = iGold * CHARACTER_MANAGER::instance().GetMobGoldAmountRate(pkAttacker) / 100;
        iGold *= iGoldMultipler;

        int iSplitCount;

        if (iGold >= 3 && !LC_IsYMIR())
            iSplitCount = number(1, 3);
        else if (GetMobRank() >= MOB_RANK_BOSS)
        {
            iSplitCount = number(3, 10);

            if ((iGold / iSplitCount) == 0)
                iSplitCount = 1;
        }
        else
            iSplitCount = 1;

        if(GetRaceNum() == 101 || GetRaceNum() == 102)
        {
            iGold = 10000;
        }

        if (iGold != 0)
        {
            iTotalGold += iGold; // Total gold

            for (int i = 0; i < iSplitCount; ++i)
            {
                if (isAutoLoot)
                {
                    pkAttacker->GiveGold(iGold / iSplitCount);
                }
                else if ((item = ITEM_MANAGER::instance().CreateItem(1, iGold / iSplitCount)))
                {
                    pos.x = GetX() + (number(-7, 7) * 20);
                    pos.y = GetY() + (number(-7, 7) * 20);

                    item->AddToGround(GetMapIndex(), pos);
                    item->StartDestroyEvent();
                }
            }
        }
    }

    DBManager::instance().SendMoneyLog(MONEY_LOG_MONSTER, GetRaceNum(), iTotalGold);
}
 
bunu bir denesene
char_battle.cpp >RewardGold:
Genişlet Daralt Kopyala
    if (!isAutoLoot)
        if (!SECTREE_MANAGER::instance().GetMovablePosition(GetMapIndex(), GetX(), GetY(), pos))
            return;

    // ARAT ALTINA EKLE

    if(GetRaceNum() == 101 || GetRaceNum() == 102)
    {
        int iGold = 100000;
       
        if (isAutoLoot)
        {
            pkAttacker->GiveGold(iGold);
            return;
        }
        LPITEM item;
        if ((item = ITEM_MANAGER::instance().CreateItem(1, iGold)))
        {
            pos.x = GetX() + (number(-7, 7) * 20);
            pos.y = GetY() + (number(-7, 7) * 20);

            item->AddToGround(GetMapIndex(), pos);
            item->StartDestroyEvent();
            return;
        }
    }
Burada yapmak istediğim 101 ve 102 vnum lu solotlardan sabit olarak 100k düşsün ve autoloot var ise doğrudan envantere yok ise yere düşmesini söyledim.
 
Evet şu an kodlar sorunsuz olarak çalıştı fakat tam istediğim gibi değil, çok ufak bir değişime ihtiyacım var. Oyundaki drop oranından bağımsız olarak direkt olarak sabitlendi şu an. Droplar açıkta olsa kapalıda olsa her kesilen 1 mobdan 100k atıyor envantere. Bunu droba bağlı olarak nasıl ayarlayabilirim bir fikriniz var mı ?
 
Evet şu an kodlar sorunsuz olarak çalıştı fakat tam istediğim gibi değil, çok ufak bir değişime ihtiyacım var. Oyundaki drop oranından bağımsız olarak direkt olarak sabitlendi şu an. Droplar açıkta olsa kapalıda olsa her kesilen 1 mobdan 100k atıyor envantere. Bunu droba bağlı olarak nasıl ayarlayabilirim bir fikriniz var mı ?
biraz kodları inceleyip bir deneyeceğim sonrasında hemen dönüş yaparım.
 
Ufak değişiklikle oranı değiştirdim fakat şöyle olur. Normalde 100k atıyor /e mob_gold_buyer 90 yaptığımda 90k atıyor. yani oranlar evet flag ile değişiyor.
 
Kodlar şu şekilde. Diğer kodlara baktım fakat yapabileceğim bu :D
C++:
Genişlet Daralt Kopyala
    if(GetRaceNum() == 101 || GetRaceNum() == 102)
    {
        int iGold = 100000;
        iGold = iGold * CHARACTER_MANAGER::instance().GetMobGoldAmountRate(pkAttacker) / 100;
        
        if (isAutoLoot)
        {
            pkAttacker->GiveGold(iGold);
            return;
        }
        LPITEM item;
        if ((item = ITEM_MANAGER::instance().CreateItem(1, iGold)))
        {
            pos.x = GetX() + (number(-7, 7) * 20);
            pos.y = GetY() + (number(-7, 7) * 20);

            item->AddToGround(GetMapIndex(), pos);
            item->StartDestroyEvent();
            return;
        }
    }
 
Üst