Çözüldü İkarus V2 Pazar arası mesafe ayarlama

  • Konuyu açan Konuyu açan CagiBoi
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 5
  • Gösterim Gösterim 174
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
107
Beğeni
61
Puan
762
Ticaret Puanı
2
İkarus v2 offline shop pazar sisteminde pazarlar arası mesafe ayarı yapılabilir mi? yapan gören duyan bilen varsa bilgi rica ediyorum.

İstediğim olayı kısaca özetlemek gerekirse, pazarlar iç içe kurulabiliyor, bu da oyundaki pazarlar ne kadar çok olursa olsun hep dip dipe olacağından az bir online algısı yaratacaktır. Bunun önüne geçmek istiyorum.
 
Çözüm
Aşağıdaki gibi bir şey denenebilir:

Orjinal:
C++:
Genişlet Daralt Kopyala
    void CShopManager::CreateShopEntity(SHOP_HANDLE shop)
    {
        auto& spawn = shop->GetSpawn();
        if (auto sectree = SECTREE_MANAGER::Instance().Get(spawn.map, spawn.x, spawn.y))
        {
            auto entity = std::make_shared<ShopEntity>();
            entity->SetShopName(shop->GetName());
            entity->SetMapIndex(spawn.map);
            entity->SetXYZ(spawn.x, spawn.y, 0);
            entity->SetShop(shop);
            entity->SetShopType(shop->GetDecoration());
            sectree->InsertEntity(entity.get());
            entity->UpdateSectree();
            shop->SetEntity(entity);

            m_entityByVID[entity->GetVID()] = entity;
        }
    }
...
Aşağıdaki gibi bir şey denenebilir:

Orjinal:
C++:
Genişlet Daralt Kopyala
    void CShopManager::CreateShopEntity(SHOP_HANDLE shop)
    {
        auto& spawn = shop->GetSpawn();
        if (auto sectree = SECTREE_MANAGER::Instance().Get(spawn.map, spawn.x, spawn.y))
        {
            auto entity = std::make_shared<ShopEntity>();
            entity->SetShopName(shop->GetName());
            entity->SetMapIndex(spawn.map);
            entity->SetXYZ(spawn.x, spawn.y, 0);
            entity->SetShop(shop);
            entity->SetShopType(shop->GetDecoration());
            sectree->InsertEntity(entity.get());
            entity->UpdateSectree();
            shop->SetEntity(entity);

            m_entityByVID[entity->GetVID()] = entity;
        }
    }

Düzenlenmiş:

C++:
Genişlet Daralt Kopyala
#include <random>

C++:
Genişlet Daralt Kopyala
void CShopManager::CreateShopEntity(SHOP_HANDLE shop)
{
    auto& spawn = shop->GetSpawn();
    if (auto sectree = SECTREE_MANAGER::Instance().Get(spawn.map, spawn.x, spawn.y))
    {
        long new_x = spawn.x, new_y = spawn.y; // Orijinal değerleri koru
        bool findShop = true;
        int max_try = 10; // Maksimum deneme sayisi, sonsuz döngü önlemi icin. Degistirilebilir.
       
        auto ch = FindOwnerCharacter();

        while (findShop && max_try > 0)
        {
            findShop = false; 

            auto check_shops = [&](LPENTITY ent)
            {
                if (ent->IsType(ENTITY_NEWSHOPS)) // <<ika'da mevcut.
                {
                    if (DISTANCE_APPROX(ent->GetX() - new_x, ent->GetY() - new_y) < 100.0f)
                        findShop = true;
                }
            };

            ch->GetSectree()->ForEachAround(check_shops);

            if (findShop)
            {
                std::random_device rd;
                std::mt19937 gen(rd());
                std::uniform_int_distribution<> dis(-100, 100);
                new_x = spawn.x + dis(gen);
                new_y = spawn.y + dis(gen);
               
               
                // İstege bagli kisim: emin degilim.
                // Yeni pozisyonun gecerli olup olmadigini kontrol et :
                // suyun ici, bloklu bölgeler gibi yerleri pas geç.
                /*
                PIXEL_POSITION pos;
                pos.x = new_x;
                pos.y = new_y;
                if (!SECTREE_MANAGER::instance().GetValidLocation(spawn.map, new_x, new_y, spawn.map, pos, ch->GetDesc()->GetEmpire())) // spawn.map: mapindex'in döndürdügünü varsayiyorum
                {
                    sys_err("CShopManager::CreateShopEntity: Invalid Position (%ld, %ld)", new_x, new_y);
                    findShop = true; // tekrar dene
                }
                else
                {
                    new_x = pos.x;
                    new_y = pos.y;
                }
                */
                --max_try;
            }
        }

        if (findShop) // eger hic uygun konum bulunmazsa
        {
            // Oyuncuya hata mesajı göster
            // return; // veya işlemi iptal et
            // burada ne yapacagina sen karar ver
        }

        auto entity = std::make_shared<ShopEntity>();
        entity->SetShopName(shop->GetName());
        entity->SetMapIndex(spawn.map);
        //entity->SetXYZ(spawn.x, spawn.y, 0); düzenlenmis hali altta
        entity->SetXYZ(new_x, new_y, 0);
        entity->SetShop(shop);
        entity->SetShopType(shop->GetDecoration());
        sectree->InsertEntity(entity.get());
        entity->UpdateSectree();
        shop->SetEntity(entity);

        m_entityByVID[entity->GetVID()] = entity;
    }
}

Sistemi kullanmadığım için deneme şansım yok maalesef. Eğer pazarın kurulum ve pozisyon işlemleri buradan yapılıyorsa yukarıdaki yöntem denenebilir. Eğer çalışmazsa / hata verirse ekstra uyarlamalar yapman gerekebilir.
 
Çözüm
Aşağıdaki gibi bir şey denenebilir:

Orjinal:
C++:
Genişlet Daralt Kopyala
    void CShopManager::CreateShopEntity(SHOP_HANDLE shop)
    {
        auto& spawn = shop->GetSpawn();
        if (auto sectree = SECTREE_MANAGER::Instance().Get(spawn.map, spawn.x, spawn.y))
        {
            auto entity = std::make_shared<ShopEntity>();
            entity->SetShopName(shop->GetName());
            entity->SetMapIndex(spawn.map);
            entity->SetXYZ(spawn.x, spawn.y, 0);
            entity->SetShop(shop);
            entity->SetShopType(shop->GetDecoration());
            sectree->InsertEntity(entity.get());
            entity->UpdateSectree();
            shop->SetEntity(entity);

            m_entityByVID[entity->GetVID()] = entity;
        }
    }

Düzenlenmiş:

C++:
Genişlet Daralt Kopyala
#include <random>

C++:
Genişlet Daralt Kopyala
void CShopManager::CreateShopEntity(SHOP_HANDLE shop)
{
    auto& spawn = shop->GetSpawn();
    if (auto sectree = SECTREE_MANAGER::Instance().Get(spawn.map, spawn.x, spawn.y))
    {
        long new_x = spawn.x, new_y = spawn.y; // Orijinal değerleri koru
        bool findShop = true;
        int max_try = 10; // Maksimum deneme sayisi, sonsuz döngü önlemi icin. Degistirilebilir.
      
        auto ch = FindOwnerCharacter();

        while (findShop && max_try > 0)
        {
            findShop = false;

            auto check_shops = [&](LPENTITY ent)
            {
                if (ent->IsType(ENTITY_NEWSHOPS)) // <<ika'da mevcut.
                {
                    if (DISTANCE_APPROX(ent->GetX() - new_x, ent->GetY() - new_y) < 100.0f)
                        findShop = true;
                }
            };

            ch->GetSectree()->ForEachAround(check_shops);

            if (findShop)
            {
                std::random_device rd;
                std::mt19937 gen(rd());
                std::uniform_int_distribution<> dis(-100, 100);
                new_x = spawn.x + dis(gen);
                new_y = spawn.y + dis(gen);
              
              
                // İstege bagli kisim: emin degilim.
                // Yeni pozisyonun gecerli olup olmadigini kontrol et :
                // suyun ici, bloklu bölgeler gibi yerleri pas geç.
                /*
                PIXEL_POSITION pos;
                pos.x = new_x;
                pos.y = new_y;
                if (!SECTREE_MANAGER::instance().GetValidLocation(spawn.map, new_x, new_y, spawn.map, pos, ch->GetDesc()->GetEmpire())) // spawn.map: mapindex'in döndürdügünü varsayiyorum
                {
                    sys_err("CShopManager::CreateShopEntity: Invalid Position (%ld, %ld)", new_x, new_y);
                    findShop = true; // tekrar dene
                }
                else
                {
                    new_x = pos.x;
                    new_y = pos.y;
                }
                */
                --max_try;
            }
        }

        if (findShop) // eger hic uygun konum bulunmazsa
        {
            // Oyuncuya hata mesajı göster
            // return; // veya işlemi iptal et
            // burada ne yapacagina sen karar ver
        }

        auto entity = std::make_shared<ShopEntity>();
        entity->SetShopName(shop->GetName());
        entity->SetMapIndex(spawn.map);
        //entity->SetXYZ(spawn.x, spawn.y, 0); düzenlenmis hali altta
        entity->SetXYZ(new_x, new_y, 0);
        entity->SetShop(shop);
        entity->SetShopType(shop->GetDecoration());
        sectree->InsertEntity(entity.get());
        entity->UpdateSectree();
        shop->SetEntity(entity);

        m_entityByVID[entity->GetVID()] = entity;
    }
}

Sistemi kullanmadığım için deneme şansım yok maalesef. Eğer pazarın kurulum ve pozisyon işlemleri buradan yapılıyorsa yukarıdaki yöntem denenebilir. Eğer çalışmazsa / hata verirse ekstra uyarlamalar yapman gerekebilir.
kurulum işlemi farklı yerlerden yapılıyor. akşam görüşelim :D
 
Aşağıdaki gibi bir şey denenebilir:

Orjinal:
C++:
Genişlet Daralt Kopyala
    void CShopManager::CreateShopEntity(SHOP_HANDLE shop)
    {
        auto& spawn = shop->GetSpawn();
        if (auto sectree = SECTREE_MANAGER::Instance().Get(spawn.map, spawn.x, spawn.y))
        {
            auto entity = std::make_shared<ShopEntity>();
            entity->SetShopName(shop->GetName());
            entity->SetMapIndex(spawn.map);
            entity->SetXYZ(spawn.x, spawn.y, 0);
            entity->SetShop(shop);
            entity->SetShopType(shop->GetDecoration());
            sectree->InsertEntity(entity.get());
            entity->UpdateSectree();
            shop->SetEntity(entity);

            m_entityByVID[entity->GetVID()] = entity;
        }
    }

Düzenlenmiş:

C++:
Genişlet Daralt Kopyala
#include <random>

C++:
Genişlet Daralt Kopyala
void CShopManager::CreateShopEntity(SHOP_HANDLE shop)
{
    auto& spawn = shop->GetSpawn();
    if (auto sectree = SECTREE_MANAGER::Instance().Get(spawn.map, spawn.x, spawn.y))
    {
        long new_x = spawn.x, new_y = spawn.y; // Orijinal değerleri koru
        bool findShop = true;
        int max_try = 10; // Maksimum deneme sayisi, sonsuz döngü önlemi icin. Degistirilebilir.
      
        auto ch = FindOwnerCharacter();

        while (findShop && max_try > 0)
        {
            findShop = false;

            auto check_shops = [&](LPENTITY ent)
            {
                if (ent->IsType(ENTITY_NEWSHOPS)) // <<ika'da mevcut.
                {
                    if (DISTANCE_APPROX(ent->GetX() - new_x, ent->GetY() - new_y) < 100.0f)
                        findShop = true;
                }
            };

            ch->GetSectree()->ForEachAround(check_shops);

            if (findShop)
            {
                std::random_device rd;
                std::mt19937 gen(rd());
                std::uniform_int_distribution<> dis(-100, 100);
                new_x = spawn.x + dis(gen);
                new_y = spawn.y + dis(gen);
              
              
                // İstege bagli kisim: emin degilim.
                // Yeni pozisyonun gecerli olup olmadigini kontrol et :
                // suyun ici, bloklu bölgeler gibi yerleri pas geç.
                /*
                PIXEL_POSITION pos;
                pos.x = new_x;
                pos.y = new_y;
                if (!SECTREE_MANAGER::instance().GetValidLocation(spawn.map, new_x, new_y, spawn.map, pos, ch->GetDesc()->GetEmpire())) // spawn.map: mapindex'in döndürdügünü varsayiyorum
                {
                    sys_err("CShopManager::CreateShopEntity: Invalid Position (%ld, %ld)", new_x, new_y);
                    findShop = true; // tekrar dene
                }
                else
                {
                    new_x = pos.x;
                    new_y = pos.y;
                }
                */
                --max_try;
            }
        }

        if (findShop) // eger hic uygun konum bulunmazsa
        {
            // Oyuncuya hata mesajı göster
            // return; // veya işlemi iptal et
            // burada ne yapacagina sen karar ver
        }

        auto entity = std::make_shared<ShopEntity>();
        entity->SetShopName(shop->GetName());
        entity->SetMapIndex(spawn.map);
        //entity->SetXYZ(spawn.x, spawn.y, 0); düzenlenmis hali altta
        entity->SetXYZ(new_x, new_y, 0);
        entity->SetShop(shop);
        entity->SetShopType(shop->GetDecoration());
        sectree->InsertEntity(entity.get());
        entity->UpdateSectree();
        shop->SetEntity(entity);

        m_entityByVID[entity->GetVID()] = entity;
    }
}

Sistemi kullanmadığım için deneme şansım yok maalesef. Eğer pazarın kurulum ve pozisyon işlemleri buradan yapılıyorsa yukarıdaki yöntem denenebilir. Eğer çalışmazsa / hata verirse ekstra uyarlamalar yapman gerekebilir.
sorunu çözdü ya burasıymış kafa gitti iyice bugün çok yoğundum hayırlı olsun vatana millete
 
Aşağıdaki gibi bir şey denenebilir:

Orjinal:
C++:
Genişlet Daralt Kopyala
    void CShopManager::CreateShopEntity(SHOP_HANDLE shop)
    {
        auto& spawn = shop->GetSpawn();
        if (auto sectree = SECTREE_MANAGER::Instance().Get(spawn.map, spawn.x, spawn.y))
        {
            auto entity = std::make_shared<ShopEntity>();
            entity->SetShopName(shop->GetName());
            entity->SetMapIndex(spawn.map);
            entity->SetXYZ(spawn.x, spawn.y, 0);
            entity->SetShop(shop);
            entity->SetShopType(shop->GetDecoration());
            sectree->InsertEntity(entity.get());
            entity->UpdateSectree();
            shop->SetEntity(entity);

            m_entityByVID[entity->GetVID()] = entity;
        }
    }

Düzenlenmiş:

C++:
Genişlet Daralt Kopyala
#include <random>

C++:
Genişlet Daralt Kopyala
void CShopManager::CreateShopEntity(SHOP_HANDLE shop)
{
    auto& spawn = shop->GetSpawn();
    if (auto sectree = SECTREE_MANAGER::Instance().Get(spawn.map, spawn.x, spawn.y))
    {
        long new_x = spawn.x, new_y = spawn.y; // Orijinal değerleri koru
        bool findShop = true;
        int max_try = 10; // Maksimum deneme sayisi, sonsuz döngü önlemi icin. Degistirilebilir.
      
        auto ch = FindOwnerCharacter();

        while (findShop && max_try > 0)
        {
            findShop = false;

            auto check_shops = [&](LPENTITY ent)
            {
                if (ent->IsType(ENTITY_NEWSHOPS)) // <<ika'da mevcut.
                {
                    if (DISTANCE_APPROX(ent->GetX() - new_x, ent->GetY() - new_y) < 100.0f)
                        findShop = true;
                }
            };

            ch->GetSectree()->ForEachAround(check_shops);

            if (findShop)
            {
                std::random_device rd;
                std::mt19937 gen(rd());
                std::uniform_int_distribution<> dis(-100, 100);
                new_x = spawn.x + dis(gen);
                new_y = spawn.y + dis(gen);
              
              
                // İstege bagli kisim: emin degilim.
                // Yeni pozisyonun gecerli olup olmadigini kontrol et :
                // suyun ici, bloklu bölgeler gibi yerleri pas geç.
                /*
                PIXEL_POSITION pos;
                pos.x = new_x;
                pos.y = new_y;
                if (!SECTREE_MANAGER::instance().GetValidLocation(spawn.map, new_x, new_y, spawn.map, pos, ch->GetDesc()->GetEmpire())) // spawn.map: mapindex'in döndürdügünü varsayiyorum
                {
                    sys_err("CShopManager::CreateShopEntity: Invalid Position (%ld, %ld)", new_x, new_y);
                    findShop = true; // tekrar dene
                }
                else
                {
                    new_x = pos.x;
                    new_y = pos.y;
                }
                */
                --max_try;
            }
        }

        if (findShop) // eger hic uygun konum bulunmazsa
        {
            // Oyuncuya hata mesajı göster
            // return; // veya işlemi iptal et
            // burada ne yapacagina sen karar ver
        }

        auto entity = std::make_shared<ShopEntity>();
        entity->SetShopName(shop->GetName());
        entity->SetMapIndex(spawn.map);
        //entity->SetXYZ(spawn.x, spawn.y, 0); düzenlenmis hali altta
        entity->SetXYZ(new_x, new_y, 0);
        entity->SetShop(shop);
        entity->SetShopType(shop->GetDecoration());
        sectree->InsertEntity(entity.get());
        entity->UpdateSectree();
        shop->SetEntity(entity);

        m_entityByVID[entity->GetVID()] = entity;
    }
}

Sistemi kullanmadığım için deneme şansım yok maalesef. Eğer pazarın kurulum ve pozisyon işlemleri buradan yapılıyorsa yukarıdaki yöntem denenebilir. Eğer çalışmazsa / hata verirse ekstra uyarlamalar yapman gerekebilir.
Teşekkür ederim. :love:
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst