- Moderatör
- #1
- MG Yaşı
- 1 Yıl 3 Ay 9 Gün
- Katılım
- 24 Ara 2024
- Konular
- 0
- Mesajlar
- 179
- Tepkime puanı
- 21
- Puan
- 43
Normal şartlarda MySQL’de player ve player_delete tablolarını eşitlediğinizde karakterlerin sorunsuz şekilde silinmesi gerekir. Ancak bazı durumlarda sistem hâlâ “karakter silinemez” hatası verebilir.
Bunun nedeni genellikle source kodu (src) içerisinde yer alan silme komutlarında tablo adının hatalı tanımlanmış olmasıdır. Tablo ismi yanlış yazıldığı için sistem doğru tabloya erişemez ve silme işlemi başarısız olur.
Gerekli düzeltmeyi yapıp tablo adını doğru şekilde tanımladığınızda sorun ortadan kalkar ve karakter silme işlemi başarılı biçimde çalışır.
Src/Server/db içerisinde Şu dosyada Arat:
ClientManagerPlayer.cpp:
Bu Şekilde Değiştir:
ClientManagerPlayer.cpp:
Gördüğünüz gibi hatayı oldukça basit bir düzenlemeyle çözmüş olduk.
Yapılan işlem, source kodu içerisinde hatalı tanımlanan tablo adını düzeltmekti.
player%s_deleted olarak yazılmış olan kısım player_deleted%s şeklinde değiştirildi.
Bu düzeltmenin ardından sistem doğru tabloyu okumaya başladı ve karakter silme işlemi sorunsuz şekilde çalışır hale geldi.


Not: Karakter silme işlemi sırasında sistem, account tablosundaki social_id sütununu kontrol eder. Eğer bu alan boşsa, sistem buna bağlı olarak aşağıdaki şekilde bir log kaydı oluşturur.
Eğer config dosyalarınızda karakter silme için belirlenen seviye sınırını da düzenlemezseniz, karakter silme işlemi yine başarısız olabilir. Bu nedenle hem source kodu düzeltmesini hem de config ayarlarını kontrol edip gerekli düzenlemeleri yaptığınızdan emin olun.
Bu durumda sistem bu şekilde bir log kaydı oluşturur ve karakter silme işlemi gerçekleştirilmez.
Bunun nedeni genellikle source kodu (src) içerisinde yer alan silme komutlarında tablo adının hatalı tanımlanmış olmasıdır. Tablo ismi yanlış yazıldığı için sistem doğru tabloya erişemez ve silme işlemi başarısız olur.
Gerekli düzeltmeyi yapıp tablo adını doğru şekilde tanımladığınızda sorun ortadan kalkar ve karakter silme işlemi başarılı biçimde çalışır.
Src/Server/db içerisinde Şu dosyada Arat:
ClientManagerPlayer.cpp:
Kod:
char queryStr[QUERY_MAX_LEN];
snprintf(queryStr, sizeof(queryStr), "INSERT INTO player%s_deleted SELECT * FROM player%s WHERE id=%d",
GetTablePostfix(), GetTablePostfix(), pi->player_id);
std::auto_ptr<SQLMsg> pIns(CDBManager::instance().DirectQuery(queryStr));
if (pIns->Get()->uiAffectedRows == 0 || pIns->Get()->uiAffectedRows == (uint32_t)-1)
{
sys_log(0, "PLAYER_DELETE FAILED %u CANNOT INSERT TO player%s_deleted", dwPID, GetTablePostfix());
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
peer->EncodeBYTE(pi->account_index);
return;
}Bu Şekilde Değiştir:
ClientManagerPlayer.cpp:
Kod:
char queryStr[QUERY_MAX_LEN];
snprintf(queryStr, sizeof(queryStr), "INSERT INTO player_deleted%s SELECT * FROM player%s WHERE id=%d",
GetTablePostfix(), GetTablePostfix(), pi->player_id);
std::auto_ptr<SQLMsg> pIns(CDBManager::instance().DirectQuery(queryStr));
if (pIns->Get()->uiAffectedRows == 0 || pIns->Get()->uiAffectedRows == (uint32_t)-1)
{
sys_log(0, "PLAYER_DELETE FAILED %u CANNOT INSERT TO player_deleted%s", dwPID, GetTablePostfix());
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
peer->EncodeBYTE(pi->account_index);
return;
}Gördüğünüz gibi hatayı oldukça basit bir düzenlemeyle çözmüş olduk.
Yapılan işlem, source kodu içerisinde hatalı tanımlanan tablo adını düzeltmekti.
player%s_deleted olarak yazılmış olan kısım player_deleted%s şeklinde değiştirildi.
Bu düzeltmenin ardından sistem doğru tabloyu okumaya başladı ve karakter silme işlemi sorunsuz şekilde çalışır hale geldi.


Not: Karakter silme işlemi sırasında sistem, account tablosundaki social_id sütununu kontrol eder. Eğer bu alan boşsa, sistem buna bağlı olarak aşağıdaki şekilde bir log kaydı oluşturur.
Kod:
Feb 21 19:37:30.91470 :: AUTH_LOGIN id(2) login(admin) social_id() login_key(429782019), client_key(1481696223 648049349 1875834706 2093965782) Feb 21 19:37:30.692346 :: [ 4350] return 0/0/0 async 0/0/0 Feb 21 19:37:31.91442 :: LOGIN_BY_KEY success admin 429782019 192.168.1.4 Feb 21 19:37:31.291670 :: RESULT_LOGIN: login success admin rows: 2 Feb 21 19:37:31.291802 :: Lyrion 961364 273242 hair 0 Feb 21 19:37:31.291879 :: bvnvbn 962849 270371 hair 0 Feb 21 19:37:35.692566 :: [ 4400] return 0/0/0 async 0/0/0 Feb 21 19:37:37.591452 :: PLAYER_DELETE FAILED len(0) Feb 21 19:37:39.991444 :: PLAYER_DELETE FAILED len(0) Feb 21 19:37:40.691465 :: [ 4450] return 0/0/0 async 0/0/0 Feb 21 19:37:42.391411 :: PLAYER_DELETE FAILED len(0) Feb 21 19:37:45.691672 :: [ 4500] return 0/0/0 async 0/0/0 Feb 21 19:37:50.691741 :: [ 4550] return 0/0/0 async 0/0/0 Feb 21 19:37:55.691676 :: [ 4600] return 0/0/0 async 0/0/0 Feb 21 19:38:00.691452 :: [ 4650] return 0/0/0 async 0/0/0 Feb 21 19:38:04.391478 :: PLAYER_DELETE FAILED len(0) Feb 21 19:38:05.691745 :: [ 4700] return 0/0/0 async 0/0/0 Feb 21 19:38:10.692240 :: [ 4750] return 0/0/0 async 0/0/0 Feb 21 19:38:10.791503 :: PLAYER_DELETE FAILED len(0) Feb 21 19:38:15.692134 :: [ 4800] return 0/0/0 async 0/0/0Eğer config dosyalarınızda karakter silme için belirlenen seviye sınırını da düzenlemezseniz, karakter silme işlemi yine başarısız olabilir. Bu nedenle hem source kodu düzeltmesini hem de config ayarlarını kontrol edip gerekli düzenlemeleri yaptığınızdan emin olun.
Kod:
Feb 21 19:44:16.728435 :: PLAYER_DELETE TRY: admin 10002 pid1
Feb 21 19:44:16.827946 :: PLAYER_DELETE FAILED LEVEL 80 >= DELETE LIMIT 70
Feb 21 19:44:17.627553 :: [ 1800] return 0/0/1 async 0/0/0
Feb 21 19:44:22.625891 :: [ 1850] return 0/0/0 async 0/0/0
Feb 21 19:44:27.629179 :: [ 1900] return 0/0/0 async 0/0/0
Feb 21 19:44:32.624934 :: [ 1950] return 0/0/0 async 0/0/0
Feb 21 19:44:37.624862 :: [ 2000] return 0/0/0 async 0/0/0
Feb 21 19:44:42.627589 :: [ 2050] return 0/0/0 async 0/0/0
Feb 21 19:44:47.625254 :: [ 2100] return 0/0/0 async 0/0/0
Feb 21 19:44:52.625453 :: [ 2150] return 0/0/0 async 0/0/0Bu durumda sistem bu şekilde bir log kaydı oluşturur ve karakter silme işlemi gerçekleştirilmez.
