Çözüldü NPC'ye item satma sorunu (para vermiyor)

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ı.

Kaiser

⋞ 〈 ☪ 〉 ⋟
Site yetkilisi
Admin
Premium Üye
Geliştirici
Yardımsever Üye
Mesaj
3.718
Çözümler
351
Beğeni
3.617
Puan
1.849
Ticaret Puanı
0
Arkadaşlar merhaba iyi forumlar.
Şuan mphlvn files üzerinde çalışıyorum, önemli olan eksiklerini tamamlıyorum ancak şöyle bir sorunla karşılaştım ve çözemedim.

Gold barlar da dahil olmak üzere itemlerin hepsini NPC ye sürükleyip sattığım zaman, itemin ederi fiyatını vermiyor ya 0 yang, yada 3-5 yang veriyor. Bu sorunu hangi dosyalar üzerinden çözebilirim? Yada konuya hakim olan arkadaşlar var ise kesin çözümü paylaşabilirlerse çok memnun olurum.

NOT: İtemi yere sürüklediğimde "Sil-Sat" seçenekleri de mevcut. Buradaki "Sat" seçeneğine tıkladığımda ederi kadar parayı veriyor ancak NPC ler para vermiyor.
 
Çözüm
Şu satırda ki kodu;
C++:
    if (dwPrice > item->GetGold()) dwPrice = item->GetGold();

Şu şekilde değiştiriniz;
C++:
    dwPrice = item->GetShopBuyPrice();

Daha sonra derleyip filesinize atın. :)
İtem proto'dan shop_buy_price kısmı 0 yang olarak belirlenmiş olabilir.
İtemi yere atarken sil ve sat seçeneğinde çalışmasının sebebi ise npc satış fiyatının bulunduğu tablodan veriyi okumasıdır.
Çözüm: shop_buy_price kısmını ya elle tek tek gireceksiniz yada protoları değiştirmeniz gerekiyor.

Bunu hem server tarafında hem de client tarafında yapmanız gerek. Client tarafında yapmazsanız itemleri satarken satış kısmı 0 yang gözükür ama satarken yang verir. Bu da oyuncuların acaba bug mu var diye düşünmesine sebep olur. İtem_proto.txt dosyalarıyla ilgili birçok bilgiyi buradan bulabilirsiniz.

 
shop_buy_price da yanlışlar var evet ama hiç biri yang değerinde değil. Ya da 0 değil. Ama ne hikmetse oyunda yang değerinde satıyor ve 3-5 yang veriyor. O da verirse..
 
shop_buy_price sütünunda ki değerler zaten direk satış fiyatı ile olmuyor. Onun bi formülü vardı. Mesela bir itemin 100.000 Yang fiyatına satılmasını istiyorsan bu sütüna bu miktarın 395.05% (5 kat) fazlasını girmeniz gerekiyor. Yukarıda verdiğim videoda da anlattım. :)
player.item_proto kısmının shop_buy_price sütününü gösterecek şeklinde resmini çekip mesajınıza ek olarak yükler misiniz?
 
item proto shop_buy_price.jpg


Zehir Kılıcı +9'a ait. NPC ye satarken 554k fiyat biçiyor ama vermiyor.
 
En son bir moderatör tarafından düzenlenmiş:
Tamam bu fiyat doğru gözüküyor. Kaynak kodlarında yapılan herhangi bir düzenleme bozmuş olabilir.
shop_manager.cpp içinde ki CShopManager::Sell fonksiyonunun tamamını da verebilir misiniz?
 
C++:
void CShopManager::Sell(LPCHARACTER ch, BYTE bCell, BYTE bCount)
{
#ifdef ENABLE_NEWSTUFF
    if (0 != g_BuySellTimeLimitValue)
    {
        if (get_dword_time() < ch->GetLastBuySellTime()+g_BuySellTimeLimitValue)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÁ÷ °ñµå¸¦ ¹ö¸± ¼ö ¾ø½À´Ï´Ù."));
            return;
        }
    }

    ch->SetLastBuySellTime(get_dword_time());
#endif
    if (!ch->GetShop())
        return;

    if (!ch->GetShopOwner())
        return;

    if (!ch->CanHandleItem())
        return;

    if (ch->GetShop()->IsPCShop())
        return;

    LPITEM item = ch->GetInventoryItem(bCell);

    if (!item)
        return;

    if (item->IsEquipped() == true)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Âø¿ë ÁßÀÎ ¾ÆÀÌÅÛÀº ÆǸÅÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    if (true == item->isLocked())
    {
        return;
    }

    if (IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_SELL))
        return;

    DWORD dwPrice;

    if (bCount == 0 || bCount > item->GetCount())
        bCount = item->GetCount();

    if (dwPrice > item->GetGold()) dwPrice = item->GetGold();

    if (IS_SET(item->GetFlag(), ITEM_FLAG_COUNT_PER_1GOLD))
    {
        if (dwPrice == 0)
            dwPrice = bCount;
        else
            dwPrice = bCount / dwPrice;
    }
    else
        dwPrice *= bCount;

    dwPrice /= 5;

    //¼¼±İ °è»ê
    DWORD dwTax = 0;
    int iVal = 0;

    {
        dwTax = dwPrice * iVal/100;
        dwPrice -= dwTax;
    }

    if (test_server)
        sys_log(0, "Sell Item price id %d %s itemid %d", ch->GetPlayerID(), ch->GetName(), item->GetID());

    const int64_t nTotalMoney = static_cast<int64_t>(ch->GetGold()) + static_cast<int64_t>(dwPrice);

    if (GOLD_MAX <= nTotalMoney)
    {
        sys_err("[OVERFLOW_GOLD] id %u name %s gold %u", ch->GetPlayerID(), ch->GetName(), ch->GetGold());
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20¾ï³ÉÀÌ ÃÊ°úÇÏ¿© ¹°Ç°À» Æȼö ¾ø½À´Ï´Ù."));
        return;
    }

    // 20050802.myevan.»óÁ¡ ÆǸŠ·Î±×¿¡ ¾ÆÀÌÅÛ ID Ãß°¡
    sys_log(0, "SHOP: SELL: %s item name: %s(x%d):%u price: %u", ch->GetName(), item->GetName(), bCount, item->GetID(), dwPrice);

    if (iVal > 0)
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÆǸűݾ×ÀÇ %d %% °¡ ¼¼±İÀ¸·Î ³ª°¡°ÔµË´Ï´Ù"), iVal);

    DBManager::instance().SendMoneyLog(MONEY_LOG_SHOP, item->GetVnum(), dwPrice);

    if (bCount == item->GetCount())
        ITEM_MANAGER::instance().RemoveItem(item, "SELL");
    else
        item->SetCount(item->GetCount() - bCount);

    //±ºÁÖ ½Ã½ºÅÛ : ¼¼±İ ¡¼ö
    CMonarch::instance().SendtoDBAddMoney(dwTax, ch->GetEmpire(), ch);

    ch->PointChange(POINT_GOLD, dwPrice, false);
}
 
En son bir moderatör tarafından düzenlenmiş:
Şu satırda ki kodu;
C++:
    if (dwPrice > item->GetGold()) dwPrice = item->GetGold();

Şu şekilde değiştiriniz;
C++:
    dwPrice = item->GetShopBuyPrice();

Daha sonra derleyip filesinize atın. :)
 
Çözüm
Allah razı olsun senden, ne muradın varsa versin inşallah :) Kökünden halloldu sayende çok teşekkür ederim :D
 
Önemli değil. :) İyi çalışmalar dilerim.
Sorun çözüldüğü için konu kilitlenip başlık ise çözüldü olarak güncellenmiştir.
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst