Sosyal açıldı! Bir göz at → Hemen gir →

KAYNAK KOD Slave Merchant KC Bug Fix

Silinen üye 471

KY Cezalı Üye
KAYIT
7 Eyl 2023
Mesajlar
753
Çözümler
2
Tepki puanı
574
SLAVE MERCHANT KC BUG FIX - KURULUM REHBERİ
********* GameServer İçin Detaylı Kurulum



GENEL BİLGİ

Problem: Yeni karakter açan oyuncular otomatik olarak 1,900,544 KC alıyor.
Çözüm: LoadSlave() fonksiyonunu düzelterek yeni karakterlerin 0 KC ile başlamasını sağlıyoruz.
Etkilenen Dosya: DBAgent.cpp
Veritabanı: GameDB.dbo.SLAVE tablosu



ADIM 1: DBAGENT.CPP DOSYASINI DÜZENLEME

Dosya Konumu:
Kod:
********* GameServer/GameServer/DBAgent.cpp

Fonksiyon: LoadSlave()
Satır Numarası: Yaklaşık 5980-6025 arası

1.1 - ESKİ KODU BUL

Aşağıdaki kodu bulun ve SİLİN:

C++:
void CDBAgent::LoadSlave(std::string& strAccountID)
{
    unique_ptr<OdbcCommand> dbCommand(m_GameDB->CreateCommand());
    if (dbCommand.get() == nullptr)
        return;

    uint8 Check = CheckSlave(strAccountID);  // ❌ YANLIŞ - AccountDB kontrol ediyor
    dbCommand->AddParameter(SQL_PARAM_INPUT, strAccountID.c_str(), strAccountID.length());
   
    if (Check == 0) {
        if (!dbCommand->Execute(string_format(_T("INSERT INTO SLAVE VALUES(?, 0, 0) "))))  // ❌ YANLIŞ - Kolon isimleri yok
        {
            ReportSQLError(m_GameDB->GetError());
            return;
        }
    }

    if (!dbCommand->Execute(_T("SELECT KC, Gold FROM SLAVE WHERE strUser = ?")))
    {
        ReportSQLError(m_GameDB->GetError());
        return;
    }

    uint32 kc, gold;  // ❌ YANLIŞ - Initialize edilmemiş

    if (dbCommand->hasData())
    {
        dbCommand->FetchUInt32(1, kc);
        dbCommand->FetchUInt32(2, gold);
    }

    CUser* pUser = g_pMain->GetUserPtr(strAccountID, NameType::TYPE_CHARACTER);
    if (pUser == nullptr)
        return;

    pUser->SlaveTotalKC = kc;
    pUser->SlaveTotalCoins = gold;

    return;
}

1.2 - YENİ KODU EKLE

Eski kodun yerine aşağıdaki YENİ KODU yapıştırın:

C++:
void CDBAgent::LoadSlave(std::string& strAccountID)
{
    unique_ptr<OdbcCommand> dbCommand(m_GameDB->CreateCommand());
    if (dbCommand.get() == nullptr)
        return;

    // SLAVE tablosunu kontrol et - GameDB'de
    dbCommand->AddParameter(SQL_PARAM_INPUT, strAccountID.c_str(), strAccountID.length());
   
    // Önce SELECT ile kontrol et
    if (!dbCommand->Execute(_T("SELECT KC, Gold FROM SLAVE WHERE strUser = ?")))
    {
        ReportSQLError(m_GameDB->GetError());
        return;
    }

    uint32 kc = 0, gold = 0;  // ✅ DOĞRU - 0 ile initialize

    // Eğer data yoksa, yeni kayıt oluştur
    if (!dbCommand->hasData())
    {
        // Yeni kayıt oluştur - KC ve Gold 0 olarak
        unique_ptr<OdbcCommand> insertCommand(m_GameDB->CreateCommand());
        if (insertCommand.get() == nullptr)
            return;
           
        insertCommand->AddParameter(SQL_PARAM_INPUT, strAccountID.c_str(), strAccountID.length());
        if (!insertCommand->Execute(_T("INSERT INTO SLAVE (strUser, KC, Gold) VALUES (?, 0, 0)")))  // ✅ DOĞRU - Kolon isimleri var
        {
            ReportSQLError(m_GameDB->GetError());
            return;
        }
       
        // Yeni kayıt için KC ve Gold 0
        kc = 0;
        gold = 0;
       
        printf("[SLAVE MERCHANT] New slave record created for %s - KC: 0, Gold: 0\n", strAccountID.c_str());
    }
    else
    {
        // Mevcut kayıt varsa, değerleri oku
        dbCommand->FetchUInt32(1, kc);
        dbCommand->FetchUInt32(2, gold);
       
        printf("[SLAVE MERCHANT] Loaded slave data for %s - KC: %u, Gold: %u\n", strAccountID.c_str(), kc, gold);
    }

    CUser* pUser = g_pMain->GetUserPtr(strAccountID, NameType::TYPE_CHARACTER);
    if (pUser == nullptr)
        return;

    pUser->SlaveTotalKC = kc;
    pUser->SlaveTotalCoins = gold;

    return;
}



️ ADIM 2: VERİTABANI TEMİZLİĞİ

2.1 - SQL SCRIPT OLUŞTUR

Aşağıdaki SQL script'ini fix_slave_merchant_kc_bug.sql olarak kaydedin:

SQL:
-- =============================================
-- SLAVE MERCHANT KC BUG FIX
-- =============================================
-- Bu script, Slave Merchant sistemindeki KC bug'ını temizler.
-- Yeni karakterlerin 1,900,544 KC alması sorunu düzeltildi.
-- Bu script mevcut bozuk verileri temizler.
-- =============================================

USE GameDB
GO

-- 1. Mevcut SLAVE tablosunu kontrol et
IF EXISTS (SELECT * FROM sys.tables WHERE name = 'SLAVE')
BEGIN
    PRINT '[SLAVE MERCHANT FIX] SLAVE tablosu bulundu.'
   
    -- 2. Anormal yüksek KC değerlerini temizle (1,000,000'dan büyük)
    UPDATE SLAVE
    SET KC = 0, Gold = 0
    WHERE KC > 1000000 OR Gold > 1000000
   
    PRINT '[SLAVE MERCHANT FIX] Anormal yüksek KC/Gold değerleri sıfırlandı.'
   
    -- 3. Temizlenen kayıtları göster
    SELECT COUNT(*) AS 'Temizlenen Kayit Sayisi'
    FROM SLAVE
    WHERE KC = 0 AND Gold = 0
   
    -- 4. Tüm kayıtları göster (kontrol için)
    SELECT TOP 20
        strUser AS 'Kullanici',
        KC AS 'KC',
        Gold AS 'Gold'
    FROM SLAVE
    ORDER BY KC DESC
   
    PRINT '[SLAVE MERCHANT FIX] İlk 20 kayıt gösteriliyor (KC''ye göre sıralı).'
END
ELSE
BEGIN
    PRINT '[SLAVE MERCHANT FIX] HATA: SLAVE tablosu bulunamadı!'
    PRINT '[SLAVE MERCHANT FIX] Tablo yapısı:'
    PRINT 'CREATE TABLE SLAVE ('
    PRINT '    strUser VARCHAR(21) PRIMARY KEY,'
    PRINT '    KC INT DEFAULT 0,'
    PRINT '    Gold INT DEFAULT 0'
    PRINT ')'
END

GO

-- =============================================
-- KULLANIM TALİMATLARI
-- =============================================
-- 1. Bu script'i SQL Server Management Studio'da çalıştırın
-- 2. GameDB veritabanını seçin
-- 3. Script'i execute edin (F5)
-- 4. Sonuçları kontrol edin
-- 5. Server'ı restart edin (kod değişiklikleri için)
-- 6. Yeni karakter oluşturup test edin
-- =============================================

-- =============================================
-- KONTROL SORGUSU
-- =============================================
-- Temizleme sonrası kontrol için:
-- SELECT * FROM SLAVE WHERE KC > 1000000 OR Gold > 1000000
-- Sonuç: 0 kayıt dönmeli
-- =============================================

2.2 - SQL SCRIPT'İ ÇALIŞTIR

  1. SQL Server Management Studio'yu açın
  2. GameDB veritabanını seçin
  3. Yukarıdaki SQL script'ini yapıştırın
  4. F5 tuşuna basarak çalıştırın
  5. Sonuçları kontrol edin

Beklenen Çıktı:
Kod:
[SLAVE MERCHANT FIX] SLAVE tablosu bulundu.
[SLAVE MERCHANT FIX] Anormal yüksek KC/Gold değerleri sıfırlandı.
Temizlenen Kayit Sayisi: 15
[SLAVE MERCHANT FIX] İlk 20 kayıt gösteriliyor (KC'ye göre sıralı).



ADIM 3: PROJEYI COMPILE ETME

  1. Visual Studio'da projeyi açın
  2. Build > Rebuild Solution seçin
  3. Hata olmadığından emin olun
  4. GameServer.exe dosyasını alın

Compile Hatası Alırsanız:
  • DBAgent.cpp dosyasını tekrar kontrol edin
  • Kod bloklarının doğru kapatıldığından emin olun
  • Syntax hatası varsa düzeltin



ADIM 4: SERVER'I BAŞLATMA VE TEST

4.1 - Server'ı Başlat

  1. Eski GameServer.exe dosyasını yedekleyin
  2. Yeni compile edilmiş GameServer.exe dosyasını kopyalayın
  3. Server'ı başlatın
  4. Console'u açık tutun

4.2 - Yeni Karakter Testi

  1. Yeni bir karakter oluşturun
  2. Oyuna giriş yapın
  3. Slave Merchant NPC'sine gidin
  4. KC değerini kontrol edin → 0 olmalı

Console'da Göreceğiniz Log:
Kod:
[SLAVE MERCHANT] New slave record created for TestChar - KC: 0, Gold: 0

4.3 - Mevcut Karakter Testi

  1. Mevcut bir karakterle giriş yapın
  2. Slave Merchant NPC'sine gidin
  3. KC değerini kontrol edin → Önceki değer korunmalı

Console'da Göreceğiniz Log:
Kod:
[SLAVE MERCHANT] Loaded slave data for ExistingChar - KC: 12345, Gold: 6789



VERİTABANI YAPISI

Tablo Adı: SLAVE
Veritabanı: GameDB

SQL:
CREATE TABLE SLAVE (
    strUser VARCHAR(21) PRIMARY KEY,  -- Karakter adı
    KC INT DEFAULT 0,                 -- Knight Cash
    Gold INT DEFAULT 0                -- Gold
)

Örnek Veriler:
strUserKCGold
TestChar00
ExistingChar123456789



SORUN GİDERME

Problem 1: Hala 1,900,544 KC Geliyor

Çözüm:
  1. Server restart edildi mi? → Restart edin
  2. Kod değişiklikleri compile edildi mi? → Rebuild Solution
  3. Veritabanı temizlendi mi? → SQL script'i çalıştırın
  4. Doğru GameServer.exe kullanılıyor mu? → Dosya tarihini kontrol edin

Problem 2: Mevcut Karakterlerin KC'si Sıfırlandı

Çözüm:
  1. SQL script yanlış çalıştırıldı → Backup'tan geri yükleyin
  2. WHERE koşulu eksik → Script'i kontrol edin
  3. Sadece KC > 1000000 olanları temizleyin

Problem 3: Console'da Log Görünmüyor

Çözüm:
  1. printf() çalışmıyor → Console output kontrol edin
  2. Fonksiyon çağrılmıyor → Breakpoint koyun, debug edin
  3. Kod compile edilmedi → Rebuild Solution

Problem 4: INSERT Başarısız

Çözüm:
  1. SLAVE tablosu yok → Tablo oluşturun
  2. strUser PRIMARY KEY ihlali → Duplicate kayıt var, kontrol edin
  3. Veritabanı bağlantısı yok → m_GameDB kontrol edin



DEĞİŞİKLİK ÖZETİ

Kod Değişiklikleri:

DeğişiklikEski KodYeni Kod
CheckSlave() Kullanımıuint8 Check = CheckSlave()Kaldırıldı
SELECT SırasıINSERT sonra SELECTSELECT önce INSERT
INSERT SyntaxVALUES(?, 0, 0)(strUser, KC, Gold) VALUES(?, 0, 0)
Değişken Initializeuint32 kc, gold;uint32 kc = 0, gold = 0;
Command NesnesiTek dbCommandAyrı insertCommand
Debug LoggingYokprintf() eklendi

Veritabanı Değişiklikleri:

  • Temizleme: KC > 1,000,000 olan kayıtlar sıfırlandı
  • Tablo: GameDB.dbo.SLAVE
  • Etkilenen Kolonlar: KC, Gold



✅ BAŞARI KRİTERLERİ

Sistem doğru çalışıyorsa:

  • ✅ Yeni Karakterler: KC = 0, Gold = 0
  • ✅ Mevcut Karakterler: KC ve Gold değerleri korunuyor
  • ✅ Console Logları: [SLAVE MERCHANT] mesajları görünüyor
  • ✅ Veritabanı: Anormal değerler temizlendi
  • ✅ Compile: Hatasız compile oluyor



⚠️ ÖNEMLİ NOTLAR

  • Backup: Değişiklik yapmadan önce DBAgent.cpp ve SLAVE tablosunu yedekleyin
  • Test: Önce test sunucusunda deneyin, sonra canlı sunucuya geçin
  • Veritabanı: GameDB kullanılıyor, AccountDB değil
  • Console: Debug logları için console'u açık tutun
  • Restart: Kod değişikliklerinden sonra mutlaka server restart edin



DESTEK

Herhangi bir sorunuz veya probleminiz olursa:
  • Forum'da konu açabilirsiniz
  • Discord'dan destek alabilirsiniz
  • Console loglarını paylaşın
  • Hata mesajlarını ekleyin



Keyifli oyunlar dileriz!
GameServer - Slave Merchant KC Bug Fix
 
Moderatör tarafında düzenlendi:

deglasser

KY Uzman Üye
Yardımsever
KAYIT
24 Kas 2023
Mesajlar
329
Çözümler
3
Tepki puanı
138
Problem: Yeni karakter açan oyuncular otomatik olarak 1,900,544 KC alıyor.

bu hata hangi src de var, onuda yazarsan daha sağlıklı olur.
 

Silinen üye 471

KY Cezalı Üye
KAYIT
7 Eyl 2023
Mesajlar
753
Çözümler
2
Tepki puanı
574
2383 lerde genel hocam User bu sistemi kullandıkca patlama yaratıyor bi süre sonra komple fixlenmiş ve denenmiştir.
 
Anasayfa Kayıt ol Giriş yap
Üst Alt