Reklam
********* GameServer/GameServer/DBAgent.cpp
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;
}
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;
}
-- =============================================
-- 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
-- =============================================
[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ı).
[SLAVE MERCHANT] New slave record created for TestChar - KC: 0, Gold: 0
[SLAVE MERCHANT] Loaded slave data for ExistingChar - KC: 12345, Gold: 6789
CREATE TABLE SLAVE (
strUser VARCHAR(21) PRIMARY KEY, -- Karakter adı
KC INT DEFAULT 0, -- Knight Cash
Gold INT DEFAULT 0 -- Gold
)
| strUser | KC | Gold |
|---|---|---|
| TestChar | 0 | 0 |
| ExistingChar | 12345 | 6789 |
| Değişiklik | Eski Kod | Yeni Kod |
|---|---|---|
| CheckSlave() Kullanımı | uint8 Check = CheckSlave() | Kaldırıldı |
| SELECT Sırası | INSERT sonra SELECT | SELECT önce INSERT |
| INSERT Syntax | VALUES(?, 0, 0) | (strUser, KC, Gold) VALUES(?, 0, 0) |
| Değişken Initialize | uint32 kc, gold; | uint32 kc = 0, gold = 0; |
| Command Nesnesi | Tek dbCommand | Ayrı insertCommand |
| Debug Logging | Yok | printf() eklendi |