Çözüldü Oto Av kullanan oyuncular için drop düşürme

  • Konuyu açan Konuyu açan allien
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 15
  • Gösterim Gösterim 589
Bu konu çözüme ulaştırılmıştır. Çözüm için konuya yazılan tüm yorumları okumayı unutmayın. Eğer konudaki yorumlar sorununuzu çözmediyse yeni bir konu açabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

allien

*__*
MT Üye
Mesaj
226
Çözümler
12
Beğeni
70
Puan
499
Ticaret Puanı
0
merhabalar, 1-2 tane sorum var yardımlarınız için şimdiden teşekkürler.

örneğin oto av kullanan herhangi bir oyuncu için karakter üzerinde herhangi bir efekt veya icon çıkarmak mümkün mü? mümkün ise bunu nasıl yapabilirim bunun için herhangi bir paylaşım var mı?

bir diğeri ise oto av ile metin farmı yapan oyuncuların metinlerden alacağı drobu örneğin 5/1 veya 5/2 yapmak mümkün mü?
 
Çözüm
biraz kurcalayarak sorunu çözdüm çözümü ise bu şekilde;

kodda varolan flag kontrolü muhtemelen loglama için yapılmış, sürekli 0 olarak döndüğünden dolayı kodun sonrasını hiçbir şekilde okumuyor.
Kod:
Genişlet Daralt Kopyala
if (quest::CQuestManager::instance().GetEventFlag("otomatik_av") == 0)

bu kod satırını kaldırdıktan sonra yeni bir affect tanımladım affect düzgün bir şekilde çalışınca geriye drop azaltma veya drop düşürme olayı kalıyor. onu da item_manager.cpp üzerinden şu şekilde sınırlandırdım;

C++:
Genişlet Daralt Kopyala
    if (pkChr->IsStone())
    {
        if (pkChr->GetRaceNum() == 18010)  // 18010 olan metin için geçerli
        {
            if (pkKiller->FindAffect(AFFECT_OTOMATIK_AV_NEW))
            {...
merhabalar, 1-2 tane sorum var yardımlarınız için şimdiden teşekkürler.

örneğin oto av kullanan herhangi bir oyuncu için karakter üzerinde herhangi bir efekt veya icon çıkarmak mümkün mü? mümkün ise bunu nasıl yapabilirim bunun için herhangi bir paylaşım var mı?

bir diğeri ise oto av ile metin farmı yapan oyuncuların metinlerden alacağı drobu örneğin 5/1 veya 5/2 yapmak mümkün mü?
Merhaba GM logosu gibi bir affect oluşturup bunu affect listesine ekleyip karaktere verebilirsiniz. Oto av aktif olan oyuncuların drobunuda düşürebilirsiniz.
 
Merhaba GM logosu gibi bir affect oluşturup bunu affect listesine ekleyip karaktere verebilirsiniz. Oto av aktif olan oyuncuların drobunuda düşürebilirsiniz.
peki drobunu düşürüp üzerinde affect çıkması için kontrolünü nasıl ve nereye yapacağım?
 
dracarys e ait olanı kullanıyorsan.

ilk olarak char.cpp de void CHARACTER::Initialize() bu kısıma bir bool değişkeni oluştur, diğerlerinde kopya çekebilirsin. sonra neyin altına eklediysen onu char.h da bul onunda altına char.cpp de oluşturduğun gibi aynı değişkeni oluştur bunda da diğerlerinden kopya çekebilirsin. sonra ilk resimde işaretli yerlerde bu değişkeni true veya false yaparsın. sonra 2. resimimdeki(item_manager.cpp) yeri bul char.cpp de oluşturduğun bool true ise bölenini yap.

+++:
Genişlet Daralt Kopyala
        int iPercent = (c_rInfo.m_iPercent * iDeltaPercent) / 100;

        if (auto_on)
            iPercent = iPercent / 3;


1725731657071.webp


1725731556521.webp
 
dracarys e ait olanı kullanıyorsan.

ilk olarak char.cpp de void CHARACTER::Initialize() bu kısıma bir bool değişkeni oluştur, diğerlerinde kopya çekebilirsin. sonra neyin altına eklediysen onu char.h da bul onunda altına char.cpp de oluşturduğun gibi aynı değişkeni oluştur bunda da diğerlerinden kopya çekebilirsin. sonra ilk resimde işaretli yerlerde bu değişkeni true veya false yaparsın. sonra 2. resimimdeki(item_manager.cpp) yeri bul char.cpp de oluşturduğun bool true ise bölenini yap.

+++:
Genişlet Daralt Kopyala
        int iPercent = (c_rInfo.m_iPercent * iDeltaPercent) / 100;

        if (auto_on)
            iPercent = iPercent / 3;


18770 eklentisini görüntüle

18769 eklentisini görüntüle
@okan4141 hocamın yardımlarıyla bir şeyler denedim fakat yapamadım örneğin drop oranını 2000 yapıyorum /2000 yaptığımda %1 şansla gelmesi gerekiyorken hala kesin olarak drop alabiliyor
 
@okan4141 hocamın yardımlarıyla bir şeyler denedim fakat yapamadım örneğin drop oranını 2000 yapıyorum /2000 yaptığımda %1 şansla gelmesi gerekiyorken hala kesin olarak drop alabiliyor
Kanka dediğim gibi yaparsan olur cmd_generalde senin oto avın start stop işlemleri var. Start olduğunda değişkeni true yap örneğin

C++:
Genişlet Daralt Kopyala
ch->SetAutoHunt(true);

Stop olduğunda

C++:
Genişlet Daralt Kopyala
ch->SetAutoHunt(false);

Bunları karakter sınıfında tanımla örneğin

C++:
Genişlet Daralt Kopyala
void CHARACTER::SetAutoHunt(const bool i)
{
   m_AutoHunt = i;
}

bool CHARACTER::IsAutoHunt()
{
    return m_AutoHunt;
}

prototiplerini tanımla yada bunu char.h de direk yapabilirsin kafana göre

char.cpp de Initialize içine tanımla

C++:
Genişlet Daralt Kopyala
m_AutoHunt = false;

prototipleri public değişkeni private olarak ekle.

item_manager.cpp gel tam ismini hatırlamıyorum işteyim şu an

CreateDropItem olacak birde GetDropPct olacak

GetDropPct nin aldığı parametreler de hem senin hemde öldürdüğünün işaretçisi olacak örneğin

pkKiller pkVictim ve diğerleri.

Buradaki herşey karşılanırsa CreateDropItem çalışmaya devam eder burası false döndürür ise CreateDropItem çalışmayı durdurur. Şimdi burada pkKiller sen oluyorsun ve burada bu işaretçinin IsAutoHunt fonksiyonunu çağıracaksın ve diyeceksin ki

C++:
Genişlet Daralt Kopyala
if (pkKiller->IsAutoHunt())

burada İtem düşme oranını sağlayan isim hangisi ise ona müdahale edeceksin.
 
En son bir moderatör tarafından düzenlenmiş:
Kanka dediğim gibi yaparsan olur cmd_generalde senin oto avın start stop işlemleri var. Start olduğunda değişkeni true yap örneğin

ch->SetAutoHunt(true);

Stop olduğunda

ch->SetAutoHunt(false);

Bunları karakter sınıfında tanımla örneğin

void CHARACTER::SetAutoHunt(const bool i)
{
m_AutoHunt = i;
}

bool CHARACTER::IsAutoHunt()
{
return m_AutoHunt;
}

prototiplerini tanımla yada bunu char.h de direk yapabilirsin kafana göre

char.cpp de Initialize içine tanımla

m_AutoHunt = false;

prototipleri public değişkeni private olarak ekle.

item_manager.cpp gel tam ismini hatırlamıyorum işteyim şu an

CreateDropItem olacak birde GetDropPct olacak

GetDropPct nin aldığı parametreler de hem senin hemde öldürdüğünün işaretçisi olacak örneğin

pkKiller pkVictim ve diğerleri.

Buradaki herşey karşılanırsa CreateDropItem çalışmaya devam eder burası false döndürür ise CreateDropItem çalışmayı durdurur. Şimdi burada pkKiller sen oluyorsun ve burada bu işaretçinin IsAutoHunt fonksiyonunu çağıracaksın ve diyeceksin ki

if (pkKiller->IsAutoHunt())

burada İtem düşme oranını sağlayan isim hangisi ise ona müdahale edeceksin.
cmd_general.cpp:
Genişlet Daralt Kopyala
{
    case 'b': //Baslat
    {
        if (!ch->IsAffectFlag(AFF_OTOMATIK_AV))
            ch->AddAffect(AFFECT_OTOMATIK_AV, POINT_NONE, 0, AFF_OTOMATIK_AV, INFINITE_AFFECT_DURATION, 0, false);
        ch->SetAutoHuntItemDrop(true);
        ch->ChatPacket(CHAT_TYPE_INFO, "Otomatik Av aktif.");
    }
    break;

    case 'd': //Durdur
    {
        if (ch->IsAffectFlag(AFF_OTOMATIK_AV))
            ch->RemoveAffect(AFFECT_OTOMATIK_AV);
        ch->SetAutoHuntItemDrop(false);
        ch->ChatPacket(CHAT_TYPE_INFO, "Otomatik Av deaktif.");
    }
    break;

    default:
        break;


char.cpp:
Genişlet Daralt Kopyala
void CHARACTER::SetAutoHuntItemDrop(bool active_mode)
{
    m_isAutoHuntItemDrop = active_mode;
}

bool CHARACTER::GetAutoHuntItemDrop()
{
    return m_isAutoHuntItemDrop;
}

char.cpp:
Genişlet Daralt Kopyala
    m_isAutoHuntItemDrop = false;


char.h:
Genişlet Daralt Kopyala
    public:
        void SetAutoHuntItemDrop(bool active_mode);
        bool GetAutoHuntItemDrop();

    private:
        bool m_isAutoHuntItemDrop;


item_manager.cpp:
Genişlet Daralt Kopyala
    // PC_BANG_ITEM_ADD
    if (pkKiller->GetPoint(POINT_PC_BANG_DROP_BONUS) > 0)
    {
        if (pkKiller->IsPCBang() == true)
            iDeltaPercent += iDeltaPercent * pkKiller->GetPoint(POINT_PC_BANG_DROP_BONUS)/100;
    }
    // END_PC_BANG_ITEM_ADD

    if (pkKiller->FindAffect(AFFECT_OTOMATIK_AV))
        iDeltaPercent /= 10;


    iRandRange = 4000000;
    iRandRange = iRandRange * 100 /
        (100 +
         CPrivManager::instance().GetPriv(pkKiller, PRIV_ITEM_DROP) +
         (pkKiller->IsEquipUniqueItem(UNIQUE_ITEM_DOUBLE_ITEM)?100:0));

    if (distribution_test_server)
        iRandRange /= 3;

    return true;

bu şekilde ekli zaten kontrol eder misiniz eksik bir şey var mı
 
cmd_general.cpp:
Genişlet Daralt Kopyala
{
    case 'b': //Baslat
    {
        if (!ch->IsAffectFlag(AFF_OTOMATIK_AV))
            ch->AddAffect(AFFECT_OTOMATIK_AV, POINT_NONE, 0, AFF_OTOMATIK_AV, INFINITE_AFFECT_DURATION, 0, false);
        ch->SetAutoHuntItemDrop(true);
        ch->ChatPacket(CHAT_TYPE_INFO, "Otomatik Av aktif.");
    }
    break;

    case 'd': //Durdur
    {
        if (ch->IsAffectFlag(AFF_OTOMATIK_AV))
            ch->RemoveAffect(AFFECT_OTOMATIK_AV);
        ch->SetAutoHuntItemDrop(false);
        ch->ChatPacket(CHAT_TYPE_INFO, "Otomatik Av deaktif.");
    }
    break;

    default:
        break;


char.cpp:
Genişlet Daralt Kopyala
void CHARACTER::SetAutoHuntItemDrop(bool active_mode)
{
    m_isAutoHuntItemDrop = active_mode;
}

bool CHARACTER::GetAutoHuntItemDrop()
{
    return m_isAutoHuntItemDrop;
}

char.cpp:
Genişlet Daralt Kopyala
    m_isAutoHuntItemDrop = false;


char.h:
Genişlet Daralt Kopyala
    public:
        void SetAutoHuntItemDrop(bool active_mode);
        bool GetAutoHuntItemDrop();

    private:
        bool m_isAutoHuntItemDrop;


item_manager.cpp:
Genişlet Daralt Kopyala
    // PC_BANG_ITEM_ADD
    if (pkKiller->GetPoint(POINT_PC_BANG_DROP_BONUS) > 0)
    {
        if (pkKiller->IsPCBang() == true)
            iDeltaPercent += iDeltaPercent * pkKiller->GetPoint(POINT_PC_BANG_DROP_BONUS)/100;
    }
    // END_PC_BANG_ITEM_ADD

    if (pkKiller->FindAffect(AFFECT_OTOMATIK_AV))
        iDeltaPercent /= 10;


    iRandRange = 4000000;
    iRandRange = iRandRange * 100 /
        (100 +
         CPrivManager::instance().GetPriv(pkKiller, PRIV_ITEM_DROP) +
         (pkKiller->IsEquipUniqueItem(UNIQUE_ITEM_DOUBLE_ITEM)?100:0));

    if (distribution_test_server)
        iRandRange /= 3;

    return true;

bu şekilde ekli zaten kontrol eder misiniz eksik bir şey var mı

6 tane iPercent var hepsine yap. Denedim sağlam çalışıyor.
C++:
Genişlet Daralt Kopyala
        int iPercent = (c_rInfo.m_iPercent * iDeltaPercent) / 100;
        if (pkKiller->IsAffectFlag(AFF_OTOAV_AKTIF))
            iPercent = iPercent / 3;

Oto av kapalı
1729370019383.webp


Oto av açık
1729370067412.webp
 
6 tane iPercent var hepsine yap. Denedim sağlam çalışıyor.
C++:
Genişlet Daralt Kopyala
        int iPercent = (c_rInfo.m_iPercent * iDeltaPercent) / 100;
        if (pkKiller->IsAffectFlag(AFF_OTOAV_AKTIF))
            iPercent = iPercent / 3;

Oto av kapalı
19549 eklentisini görüntüle

Oto av açık
19550 eklentisini görüntüle
eve geçince deneyip dönüş yapacağım teşekkür ederim.
Efekt olayını mavi ruh bana yapmıştı eger yarin vaktim olursa sana paylaşayım yada @Mavi Ruh belki sana yardımcı olur
çok memnun olurum paylaşırsanız. 😊
 
aklımdayken söyleyim o oto av da client crashh olayı var onu çözmeden oyuncuya sunma ve orjinalin de zaten aktif olunca karakter üstünde efekt çıkıyor, tabi efek dosyasını düzgün göstermen gerekiyor.
 
aklımdayken söyleyim o oto av da client crashh olayı var onu çözmeden oyuncuya sunma ve orjinalin de zaten aktif olunca karakter üstünde efekt çıkıyor, tabi efek dosyasını düzgün göstermen gerekiyor.
efekti nereden çekiyor peki bilginiz var mı? hangi dosya üzerinden bir de client crash dediğiniz olay tam olarak neyden kaynaklanıyor test ettiniz mi veya fixini biliyor musunuz? 1-2 defa uzun süre arka plana attığımda siyah ekran olarak kalmıştı o da efekt birikmesinden dolayıdır diye düşünüyorum.
 
düzgün bir şekilde söktüysen sadece efekt dosyalarına ihtiacın olmalı. crash olayında siyah ekran olmuyor, daha çok aktifken aşağı bırakıp bir süre sonra üste aldığında client direk syserrsiz kapanıyor.
 
düzgün bir şekilde söktüysen sadece efekt dosyalarına ihtiacın olmalı. crash olayında siyah ekran olmuyor, daha çok aktifken aşağı bırakıp bir süre sonra üste aldığında client direk syserrsiz kapanıyor.

henüz bahsettiğiniz şekilde bir syserrle karşılaşmadım muhtemelen fixi atılmıştır diye düşünüyorum, ayrıca iPercentlere şimdi bakma şansım oldu
int iPercent olanların drop ile alakalı olanların altına bahsettiğiniz bloğu ekliyorum değil mi?

bir de böyle bir kod bloğu var bununla alakalı olabilir mi?

item_manager.cpp:
Genişlet Daralt Kopyala
    if (pkChr->IsStone())
    {
        if (pkChr->GetDropMetinStoneVnum())
        {
            int iPercent = (pkChr->GetDropMetinStonePct() * iDeltaPercent) * 400;
        if (pkKiller->IsAffectFlag(AFFECT_OTOMATIK_AV))
            iPercent = iPercent / 3;

            if (iPercent >= number(1, iRandRange))
            {
                item = CreateItem(pkChr->GetDropMetinStoneVnum(), 1, 0, true);
                if (item)
                    vec_item.push_back(item);
            }
        }
    }


veya bunun çalışıp çalışmadığını anlayabilmek için iRandRange veya şans oranını chate yazdırabilir miyiz
 
Son düzenleme:
ek olarak drop şansı düşürme değilde örneğin 5 tane düşüyorsa oto av kullanmadan oto av kullanarak 2 tane drop alabilir olarakta düzenleyebiliriz fakat loglama yaparak metin taşını kestiğimde metin taşının içerisinde drop olmadığını söylüyor acaba item yere değilde direkt envantere geldiği için bu şekilde görüyor olabilir mi?

C++:
Genişlet Daralt Kopyala
if (pkChr->IsStone())
{
    pkKiller->ChatPacket(CHAT_TYPE_INFO, "metin taşı : %d", pkChr->GetRaceNum());

    if (pkChr->GetDropMetinStoneVnum()) {
        pkKiller->ChatPacket(CHAT_TYPE_INFO, "drop var şans : %d", pkChr->GetDropMetinStoneVnum());

        int iPercent = (pkChr->GetDropMetinStonePct() * iDeltaPercent) * 400;

        if (iPercent >= number(1, iRandRange)) {
            item = CreateItem(pkChr->GetDropMetinStoneVnum(), 1, 0, true);

            if (item) {
                vec_item.push_back(item);
                pkKiller->ChatPacket(CHAT_TYPE_INFO, "droplandı");
            }
        }
    } else {
        pkKiller->ChatPacket(CHAT_TYPE_INFO, "droplanamadı");
    }
}
 
Son düzenleme:
biraz kurcalayarak sorunu çözdüm çözümü ise bu şekilde;

kodda varolan flag kontrolü muhtemelen loglama için yapılmış, sürekli 0 olarak döndüğünden dolayı kodun sonrasını hiçbir şekilde okumuyor.
Kod:
Genişlet Daralt Kopyala
if (quest::CQuestManager::instance().GetEventFlag("otomatik_av") == 0)

bu kod satırını kaldırdıktan sonra yeni bir affect tanımladım affect düzgün bir şekilde çalışınca geriye drop azaltma veya drop düşürme olayı kalıyor. onu da item_manager.cpp üzerinden şu şekilde sınırlandırdım;

C++:
Genişlet Daralt Kopyala
    if (pkChr->IsStone())
    {
        if (pkChr->GetRaceNum() == 18010)  // 18010 olan metin için geçerli
        {
            if (pkKiller->FindAffect(AFFECT_OTOMATIK_AV_NEW))
            {
                pkKiller->ChatPacket(CHAT_TYPE_INFO, "Otomatik Av aktif, sandık sayısı 2'ye sınırlandırıldı.");

                // Mob düşme listesini boşaltmak için ( liste boşaltılmazsa ekstra mob_drop_item.txt üzerinden çeker yani x2 drop alırsınız )
                vec_item.clear();

                // 2 adet sandık yaratıyoruz (8001 örneği ile)
                for (int i = 0; i < 2; i++)
                {
                    item = CreateItem(8001, 1, 0, true);
                    if (item)
                        vec_item.push_back(item);
                }
            }
            else
            {
                pkKiller->ChatPacket(CHAT_TYPE_INFO, "Otomatik Av kullanılmıyor, normal sayıda sandık düşecek.");

                // Mob düşme listesini boşaltmak için ( liste boşaltılmazsa ekstra mob_drop_item.txt üzerinden çeker yani x2 drop alırsınız )
                vec_item.clear();

                // 5 adet sandık yaratıyoruz (8001 örneği ile)
                for (int i = 0; i < 5; i++)
                {
                    item = CreateItem(8001, 1, 0, true);
                    if (item)
                        vec_item.push_back(item);
                }
            }
        }
        else
        {
        }
    }


drop düşürme olayı için de var olan iPercentlere gerekli eklemeleri yaparak düzenleyebilirsiniz. ilgilerinden dolayı @nyami ve @okan4141 hocama teşekkür ederim.
konu kilitlenebilir.
 
Çözüm
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst