Çözüldü Metinlerden düşen itemlerin envantere gelmesi

  • Konuyu açan Konuyu açan CagiBoi
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 17
  • Gösterim Gösterim 235
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ı.

CagiBoi

𝓜.𝓚.𝓐
Premium Üye
Üye
Mesaj
106
Beğeni
60
Puan
762
Ticaret Puanı
2
Merhaba,

Yapım aşamasında olan sunucumda metin alanları çok dar olduğundan yere düşen itemler bir süre sonra toplanmadığında kasma yapıyor. Metinlerden düşen itemlerin direkt olarak envantere gelmesini, bosslardan düşen itemlerin mevcuttaki gibi yere düşmeye devam etmesini istiyorum. Bu ikisini birbirinden ayırmak mümkün müdür? Bilen, yardımcı olabilecek birisi var mıdır?

Teşekkürler,
 
Çözüm
char_battle.cpp
C++:
Genişlet Daralt Kopyala
if (ITEM_MANAGER::instance().CreateDropItem(this, pkAttacker, s_vec_item))
    {
        if (s_vec_item.size() == 0);
        else if (s_vec_item.size() == 1)
        {
            item = s_vec_item[0];
            item->AddToGround(GetMapIndex(), pos);

Düzenle:
C++:
Genişlet Daralt Kopyala
            if(this->IsStone())
                pkAttacker->AutoGiveItem(item->GetVnum(), item->GetCount());
            else
                item->AddToGround(GetMapIndex(), pos);


Tekrar bul:
C++:
Genişlet Daralt Kopyala
                std::vector<LPCHARACTER>::iterator it = v.begin();
                while (iItemIdx >= 0)
                {
                    item = s_vec_item[iItemIdx--];
                    if (!item)
                    {...
bunun direkt bir sistemi vardı ona bir sorgu ekleyip devam ettirebilirsin
 
Merhaba,

Yapım aşamasında olan sunucumda metin alanları çok dar olduğundan yere düşen itemler bir süre sonra toplanmadığında kasma yapıyor. Metinlerden düşen itemlerin direkt olarak envantere gelmesini, bosslardan düşen itemlerin mevcuttaki gibi yere düşmeye devam etmesini istiyorum. Bu ikisini birbirinden ayırmak mümkün müdür? Bilen, yardımcı olabilecek birisi var mıdır?

Teşekkürler,
metin kesince item vren quest ekleyebılırsın
 
QUEST:
Genişlet Daralt Kopyala
quest item_ver begin
    state start begin
        when 8001.kill begin
            pc.give_item2(149, 1)
            syschat("itemler envantere aktarıldı")
            send_letter("Metin Ödülü")
            set_state("reward")
        end
    end
 
dümdüz 1 eşya veren quest paylaşan arkadaşlar metinden sabit eşya düşmüyor special item droptan 50 eşya arasından şansa göre atıyor siz hangi kafayı yaşıyorsunuz? düzgün öneri sunamayacaksanız sunmayın hiç. sanki questten mob kesip eşya alma questini ilk siz buldunuz :D
 
Metinden item düşmesi için quest aramıyorum arkadaşlar. Normalde metinden düşen itemlerin direk olarak envantere geleceği bir şeye bakıyorum. Zaten mob proto dosyam var metinden atan eşyaları ayarladım.
 
Merhaba,
Arkadaşlarım quest taraflı yardımcı olmaya çalışmış. Kısmen yapılabilir ama öyle yaparsan droplarınıda quest taraflı eklemen gerekebilir. Buda her mob veya boss için tek tek ayarlamak demek. Source taraflı biraz mantıklı birşey yazmaya çalıştım. Ama tabiki test etmen ve denemen lazım.
char_battle.cpp içinde OnKill() veya DropItem() içerisine ekleyip deneyebilirsin.

C++:
Genişlet Daralt Kopyala
if (!mob->IsBoss())
{
    // drop yerine doğrudan oyuncuya ver
    ch->AutoGiveItem(item_vnum, count);
}
else
{
    // klasik drop kodların burda olmalı
    DropItemToGround();
}

Direk src üzerinden bakmadım o belirlediğim fonksiyonlardan 2sinden 1 isi varmı yokmu ama muhtelemen vardır. Şuan mobildeyim. Eğer boss değilse mob yada metin ise direk envantere gelir diye tahmin ediyorum. Chatgpt gibi yapay zekalar kullanarak detaylandırabilirsin. Ya da geliştirebilirsin. Denemelik yazdım. İyi günler dilerim. Ha bide bazı fileslerde IsBoss sorgusu yok. Aşağıdaki verdiğim konudan ekleyebilirsin.

 
Merhaba,
Arkadaşlarım quest taraflı yardımcı olmaya çalışmış. Kısmen yapılabilir ama öyle yaparsan droplarınıda quest taraflı eklemen gerekebilir. Buda her mob veya boss için tek tek ayarlamak demek. Source taraflı biraz mantıklı birşey yazmaya çalıştım. Ama tabiki test etmen ve denemen lazım.
char_battle.cpp içinde OnKill() veya DropItem() içerisine ekleyip deneyebilirsin.

C++:
Genişlet Daralt Kopyala
if (!mob->IsBoss())
{
    // drop yerine doğrudan oyuncuya ver
    ch->AutoGiveItem(item_vnum, count);
}
else
{
    // klasik drop kodların burda olmalı
    DropItemToGround();
}

Direk src üzerinden bakmadım o belirlediğim fonksiyonlardan 2sinden 1 isi varmı yokmu ama muhtelemen vardır. Şuan mobildeyim. Eğer boss değilse mob yada metin ise direk envantere gelir diye tahmin ediyorum. Chatgpt gibi yapay zekalar kullanarak detaylandırabilirsin. Ya da geliştirebilirsin. Denemelik yazdım. İyi günler dilerim. Ha bide bazı fileslerde IsBoss sorgusu yok. Aşağıdaki verdiğim konudan ekleyebilirsin.

autogiveitem mob item drop ile uyumlu çalışıyor mu acaba bi denerim bunu müsait zamanda
 
autogiveitem mob item drop ile uyumlu çalışıyor mu acaba bi denerim bunu müsait zamanda
Sana zahmet iyi olur. Bende pc'ye geçince denerim. Daha da düzeltiriz belki bu kodlar olmassa.

C++:
Genişlet Daralt Kopyala
if (GetLevel() <= 10)
                    AutoGiveItem(27001, 2);
                else if (GetLevel() <= 30)
                    AutoGiveItem(27002, 2);
                else
                {
                    AutoGiveItem(27002, 2);
//                    AutoGiveItem(27003, 2);
                }

Char.cppde şu şekilde kodlar var. Muhtemelen uyumlu.
 
Merhaba,
Arkadaşlarım quest taraflı yardımcı olmaya çalışmış. Kısmen yapılabilir ama öyle yaparsan droplarınıda quest taraflı eklemen gerekebilir. Buda her mob veya boss için tek tek ayarlamak demek. Source taraflı biraz mantıklı birşey yazmaya çalıştım. Ama tabiki test etmen ve denemen lazım.
char_battle.cpp içinde OnKill() veya DropItem() içerisine ekleyip deneyebilirsin.

C++:
Genişlet Daralt Kopyala
if (!mob->IsBoss())
{
    // drop yerine doğrudan oyuncuya ver
    ch->AutoGiveItem(item_vnum, count);
}
else
{
    // klasik drop kodların burda olmalı
    DropItemToGround();
}

Direk src üzerinden bakmadım o belirlediğim fonksiyonlardan 2sinden 1 isi varmı yokmu ama muhtelemen vardır. Şuan mobildeyim. Eğer boss değilse mob yada metin ise direk envantere gelir diye tahmin ediyorum. Chatgpt gibi yapay zekalar kullanarak detaylandırabilirsin. Ya da geliştirebilirsin. Denemelik yazdım. İyi günler dilerim. Ha bide bazı fileslerde IsBoss sorgusu yok. Aşağıdaki verdiğim konudan ekleyebilirsin.

Değerli yorumunuz için teşekkür ederim.
 
Sana zahmet iyi olur. Bende pc'ye geçince denerim. Daha da düzeltiriz belki bu kodlar olmassa.

C++:
Genişlet Daralt Kopyala
if (GetLevel() <= 10)
                    AutoGiveItem(27001, 2);
                else if (GetLevel() <= 30)
                    AutoGiveItem(27002, 2);
                else
                {
                    AutoGiveItem(27002, 2);
//                    AutoGiveItem(27003, 2);
                }

Char.cppde şu şekilde kodlar var. Muhtemelen uyumlu.
tamam ama tek eşya vermicez onu questle yaparım zaten srcden uğraşmam böyle gerek yok bize mob drop içeriğini okuyup ordaki şans faktörüyle dağıtacak bir şey lazım
 
tamam ama tek eşya vermicez onu questle yaparım zaten srcden uğraşmam böyle gerek yok bize mob drop içeriğini okuyup ordaki şans faktörüyle dağıtacak bir şey lazım
Knk zaten o fonksiyonun var olduğunu göstermek için attım. 1 item vermiyoruz ki ilk attığım kodlarla. Ne kadar item düşerse düşsün şansa bağlı olarak o kadar verecek.
 
uğraşmadım iş görürmü bilemem yapay zekadan kopyala yapıştır yapıyom

Gereksinimler ve Varsayımlar​

  • Metin2 Drop Sistemi: Mob dropları genellikle mob_drop_item.txt veya benzeri bir dosyada tanımlanır. Bu dosya, her mob için düşebilecek eşyaları ve bunların düşme olasılıklarını içerir.
  • MT19937 Kullanımı: C++'da <random> kütüphanesindeki std::mt19937 kullanılacak.
  • Örnek Dosya Formatı: mob_drop_item.txt dosyasında her satır bir mobun drop bilgisini içeriyor. Örneğin:
    text

    Kopyala
    <span><span>MobVnum ItemVnum DropChance</span></span><span>101 10 0.5</span><span>101 20 0.3</span><span>102 30 0.1</span>


    Burada DropChance 0 ile 1 arasında bir olasılık değeri (örneğin, %50 için 0.5).
  • Çıktı: Belirli bir mob öldürüldüğünde, MT19937 kullanılarak hangi eşyanın düşeceği belirlenecek.

Çözüm​

Aşağıdaki C++ kodu:

  1. mob_drop_item.txt dosyasını okur.
  2. MT19937 ile rastgele bir sayı üretir.
  3. Drop şanslarına göre eşya seçer ve sonucu döndürür.
C++:
Genişlet Daralt Kopyala
#include <iostream>
#include <fstream>
#include <vector>
#include <random>
#include <string>
#include <sstream>

// Drop bilgilerini tutacak yapı
struct DropItem {
    int mobVnum;      // Mob'un VNUM'u
    int itemVnum;     // Düşecek eşyanın VNUM'u
    float dropChance; // Düşme olasılığı (0.0 - 1.0)
};

// Drop dosyasını okuyup parse eden fonksiyon
std::vector<DropItem> LoadDropData(const std::string& filename) {
    std::vector<DropItem> drops;
    std::ifstream file(filename);
    std::string line;

    if (!file.is_open()) {
        std::cerr << "Dosya acilamadi: " << filename << std::endl;
        return drops;
    }

    while (std::getline(file, line)) {
        // Yorum satırlarını ve boş satırları atla
        if (line.empty() || line[0] == '#') continue;

        std::istringstream iss(line);
        DropItem drop;
        if (iss >> drop.mobVnum >> drop.itemVnum >> drop.dropChance) {
            drops.push_back(drop);
        }
    }

    file.close();
    return drops;
}

// MT19937 kullanarak rastgele drop seçen fonksiyon
int GetRandomDrop(int mobVnum, const std::vector<DropItem>& drops) {
    // MT19937 rastgele sayı üreteci
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<float> dis(0.0f, 1.0f);

    // Belirli mob için dropları filtrele
    std::vector<DropItem> mobDrops;
    for (const auto& drop : drops) {
        if (drop.mobVnum == mobVnum) {
            mobDrops.push_back(drop);
        }
    }

    if (mobDrops.empty()) {
        std::cout << "Bu mob icin drop bulunamadi: " << mobVnum << std::endl;
        return -1; // Drop yoksa -1 döndür
    }

    // Rastgele bir sayı üret
    float randomValue = dis(gen);
    float cumulativeChance = 0.0f;

    // Olasılıklara göre eşya seç
    for (const auto& drop : mobDrops) {
        cumulativeChance += drop.dropChance;
        if (randomValue <= cumulativeChance) {
            return drop.itemVnum;
        }
    }

    // Hiçbir eşya seçilmediyse (olasılık toplamı 1.0'dan küçükse)
    return -1;
}

int main() {
    // Drop dosyasını oku
    std::string filename = "mob_drop_item.txt";
    std::vector<DropItem> drops = LoadDropData(filename);

    // Test: Mob VNUM 101 için drop hesapla
    int mobVnum = 101;
    int itemVnum = GetRandomDrop(mobVnum, drops);

    if (itemVnum != -1) {
        std::cout << "Mob VNUM " << mobVnum << " olduruldu. Dusen esya VNUM: " << itemVnum << std::endl;
    } else {
        std::cout << "Mob VNUM " << mobVnum << " olduruldu. Esya dusmedi." << std::endl;
    }

    return 0;
}

  • Dosya Okuma (LoadDropData):
    • mob_drop_item.txt dosyasını satır satır okur.
    • Her satırda MobVnum, ItemVnum ve DropChance değerlerini parse eder.
    • Yorum satırları (# ile başlayan) ve boş satırlar yok sayılır.
  • MT19937 ile Rastgele Seçim (GetRandomDrop):
    • std::mt19937 kullanılarak yüksek kaliteli rastgele sayı üretilir.
    • Belirtilen mobVnum için droplar filtrelenir.
    • Rastgele üretilen sayı (0.0 - 1.0) ile kümülatif olasılıklar karşılaştırılır ve eşya seçilir.
    • Eğer hiçbir eşya seçilmezse -1 döner (eşya düşmez).
  • Ana Program:
    • Örnek olarak mobVnum = 101 için drop hesaplanır ve sonuç konsola yazdırılır.
demiş yapay arkadaş
 
Knk zaten o fonksiyonun var olduğunu göstermek için attım. 1 item vermiyoruz ki ilk attığım kodlarla. Ne kadar item düşerse düşsün şansa bağlı olarak o kadar verecek.

uğraşmadım iş görürmü bilemem yapay zekadan kopyala yapıştır yapıyom

Gereksinimler ve Varsayımlar​

  • Metin2 Drop Sistemi: Mob dropları genellikle mob_drop_item.txt veya benzeri bir dosyada tanımlanır. Bu dosya, her mob için düşebilecek eşyaları ve bunların düşme olasılıklarını içerir.
  • MT19937 Kullanımı: C++'da <random> kütüphanesindeki std::mt19937 kullanılacak.
  • Örnek Dosya Formatı: mob_drop_item.txt dosyasında her satır bir mobun drop bilgisini içeriyor. Örneğin:
    text

    Kopyala
    <span><span>MobVnum ItemVnum DropChance</span></span><span>101 10 0.5</span><span>101 20 0.3</span><span>102 30 0.1</span>


    Burada DropChance 0 ile 1 arasında bir olasılık değeri (örneğin, %50 için 0.5).
  • Çıktı: Belirli bir mob öldürüldüğünde, MT19937 kullanılarak hangi eşyanın düşeceği belirlenecek.

Çözüm​

Aşağıdaki C++ kodu:

  1. mob_drop_item.txt dosyasını okur.
  2. MT19937 ile rastgele bir sayı üretir.
  3. Drop şanslarına göre eşya seçer ve sonucu döndürür.
C++:
Genişlet Daralt Kopyala
#include <iostream>
#include <fstream>
#include <vector>
#include <random>
#include <string>
#include <sstream>

// Drop bilgilerini tutacak yapı
struct DropItem {
    int mobVnum;      // Mob'un VNUM'u
    int itemVnum;     // Düşecek eşyanın VNUM'u
    float dropChance; // Düşme olasılığı (0.0 - 1.0)
};

// Drop dosyasını okuyup parse eden fonksiyon
std::vector<DropItem> LoadDropData(const std::string& filename) {
    std::vector<DropItem> drops;
    std::ifstream file(filename);
    std::string line;

    if (!file.is_open()) {
        std::cerr << "Dosya acilamadi: " << filename << std::endl;
        return drops;
    }

    while (std::getline(file, line)) {
        // Yorum satırlarını ve boş satırları atla
        if (line.empty() || line[0] == '#') continue;

        std::istringstream iss(line);
        DropItem drop;
        if (iss >> drop.mobVnum >> drop.itemVnum >> drop.dropChance) {
            drops.push_back(drop);
        }
    }

    file.close();
    return drops;
}

// MT19937 kullanarak rastgele drop seçen fonksiyon
int GetRandomDrop(int mobVnum, const std::vector<DropItem>& drops) {
    // MT19937 rastgele sayı üreteci
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<float> dis(0.0f, 1.0f);

    // Belirli mob için dropları filtrele
    std::vector<DropItem> mobDrops;
    for (const auto& drop : drops) {
        if (drop.mobVnum == mobVnum) {
            mobDrops.push_back(drop);
        }
    }

    if (mobDrops.empty()) {
        std::cout << "Bu mob icin drop bulunamadi: " << mobVnum << std::endl;
        return -1; // Drop yoksa -1 döndür
    }

    // Rastgele bir sayı üret
    float randomValue = dis(gen);
    float cumulativeChance = 0.0f;

    // Olasılıklara göre eşya seç
    for (const auto& drop : mobDrops) {
        cumulativeChance += drop.dropChance;
        if (randomValue <= cumulativeChance) {
            return drop.itemVnum;
        }
    }

    // Hiçbir eşya seçilmediyse (olasılık toplamı 1.0'dan küçükse)
    return -1;
}

int main() {
    // Drop dosyasını oku
    std::string filename = "mob_drop_item.txt";
    std::vector<DropItem> drops = LoadDropData(filename);

    // Test: Mob VNUM 101 için drop hesapla
    int mobVnum = 101;
    int itemVnum = GetRandomDrop(mobVnum, drops);

    if (itemVnum != -1) {
        std::cout << "Mob VNUM " << mobVnum << " olduruldu. Dusen esya VNUM: " << itemVnum << std::endl;
    } else {
        std::cout << "Mob VNUM " << mobVnum << " olduruldu. Esya dusmedi." << std::endl;
    }

    return 0;
}

  • Dosya Okuma (LoadDropData):
    • mob_drop_item.txt dosyasını satır satır okur.
    • Her satırda MobVnum, ItemVnum ve DropChance değerlerini parse eder.
    • Yorum satırları (# ile başlayan) ve boş satırlar yok sayılır.
  • MT19937 ile Rastgele Seçim (GetRandomDrop):
    • std::mt19937 kullanılarak yüksek kaliteli rastgele sayı üretilir.
    • Belirtilen mobVnum için droplar filtrelenir.
    • Rastgele üretilen sayı (0.0 - 1.0) ile kümülatif olasılıklar karşılaştırılır ve eşya seçilir.
    • Eğer hiçbir eşya seçilmezse -1 döner (eşya düşmez).
  • Ana Program:
    • Örnek olarak mobVnum = 101 için drop hesaplanır ve sonuç konsola yazdırılır.
demiş yapay arkadaş
cırt bişeye benziyo
 
char_battle.cpp
C++:
Genişlet Daralt Kopyala
if (ITEM_MANAGER::instance().CreateDropItem(this, pkAttacker, s_vec_item))
    {
        if (s_vec_item.size() == 0);
        else if (s_vec_item.size() == 1)
        {
            item = s_vec_item[0];
            item->AddToGround(GetMapIndex(), pos);

Düzenle:
C++:
Genişlet Daralt Kopyala
            if(this->IsStone())
                pkAttacker->AutoGiveItem(item->GetVnum(), item->GetCount());
            else
                item->AddToGround(GetMapIndex(), pos);


Tekrar bul:
C++:
Genişlet Daralt Kopyala
                std::vector<LPCHARACTER>::iterator it = v.begin();
                while (iItemIdx >= 0)
                {
                    item = s_vec_item[iItemIdx--];
                    if (!item)
                    {
                        sys_err("item null in vector idx %d", iItemIdx + 1);
                        continue;
                    }
                    item->AddToGround(GetMapIndex(), pos);

Düzenle:
C++:
Genişlet Daralt Kopyala
                    if(this->IsStone())
                    {
                        pkAttacker->AutoGiveItem(item->GetVnum(), item->GetCount());
                        //break; // gerekirse..
                    }
                    else
                        item->AddToGround(GetMapIndex(), pos);

Test etmedim ama bu şekilde çalışacaktır. Ancak detaylı test etmeden kullanma.
Aynı anda birden fazla karakterin kestiği metinler vb. test edilmeli.
 
Çözüm
char_battle.cpp
C++:
Genişlet Daralt Kopyala
if (ITEM_MANAGER::instance().CreateDropItem(this, pkAttacker, s_vec_item))
    {
        if (s_vec_item.size() == 0);
        else if (s_vec_item.size() == 1)
        {
            item = s_vec_item[0];
            item->AddToGround(GetMapIndex(), pos);

Düzenle:
C++:
Genişlet Daralt Kopyala
            if(this->IsStone())
                pkAttacker->AutoGiveItem(item->GetVnum(), item->GetCount());
            else
                item->AddToGround(GetMapIndex(), pos);


Tekrar bul:
C++:
Genişlet Daralt Kopyala
                std::vector<LPCHARACTER>::iterator it = v.begin();
                while (iItemIdx >= 0)
                {
                    item = s_vec_item[iItemIdx--];
                    if (!item)
                    {
                        sys_err("item null in vector idx %d", iItemIdx + 1);
                        continue;
                    }
                    item->AddToGround(GetMapIndex(), pos);

Düzenle:
C++:
Genişlet Daralt Kopyala
                    if(this->IsStone())
                    {
                        pkAttacker->AutoGiveItem(item->GetVnum(), item->GetCount());
                        //break; // gerekirse..
                    }
                    else
                        item->AddToGround(GetMapIndex(), pos);

Test etmedim ama bu şekilde çalışacaktır. Ancak detaylı test etmeden kullanma.
Aynı anda birden fazla karakterin kestiği metinler vb. test edilmeli.
şuanlık çözüm olarak işaretlenebilir detaylı testte ne olur bakacağız teşekkürler
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst