- #1
Konu Sahibi
: serkankacan
[GÜVENLİK & FIX] vSRO F1 Tuşu Donma ve Rehber Görevi Bug Fix (Alternatif Çözüm)
_RefCharDefault_Quest (QEVENT_GUIDE) Servisini Aktif Etme ve _CharQuest Tablosunu Güvenle Eşitleme
_RefCharDefault_Quest (QEVENT_GUIDE) Servisini Aktif Etme ve _CharQuest Tablosunu Güvenle Eşitleme
Merhaba değerli forum sakinleri,
Silkroad Online sunucularında oyuncuların oyuna ilk girdiğinde veya klavyeden **F1** tuşuna bastığında istemcinin (Client) kilitlenmesi ya da arayüzün (UI) donması sorunu için ilk paylaşılan yöntemlere alternatif olarak, doğrudan varsayılan rehber servisinin (
QEVENT_GUIDE) aktif edilmesi yöntemi de sıklıkla kullanılır.İlk kurulumlarda
_RefCharDefault_Quest tablosundaki QEVENT_GUIDE satırı kapalı (Service = 0) geldiğinde, istemci rehber arayüzünü yükleyemez ve F1 yuvaları kilitlenir.İnternetteki eski sorgularda
WHERE NOT EXISTS alt sorgusu dış tabloya bağlanmadığı için sorgu ilk karakterden sonra durmakta ve diğer oyuncuları güncellememektedir. Aşağıda bu hatadan arındırılmış, hem mevcut oyuncuları düzelten hem de yeni açılacak karakterleri sağlama alan optimize şablonu paylaşıyoruz.Teknik Bilgilendirme' Alıntı:DİKKAT:
- Service = 1 Yapılan Görev:
QEVENT_GUIDE(Rehber / Kılavuz Olayı).- Status = 5 (Completed): Rehber görevini tamamlandı olarak işaretlemek, istemcinin görevi tekrar tetikleyip arayüzü kilitlemesini kesin olarak engeller.
- Referans tablosundaki değişikliğin sunucuya yansıması için işlem sonrası GameServer pencerelerinin yeniden başlatılması şarttır.
- İşlem öncesinde SRO_VT_SHARD yedeğinizi almayı unutmayınız.
Hatasız & Tek Tıkla Çalışan SQL Fix Sorgusu
SRO_VT_SHARD veritabanını seçip aşağıdaki optimize bloğu çalıştırın:
SQL:
USE [SRO_VT_SHARD]
GO
-- ===================================================================
-- 1. ADIM: _RefCharDefault_Quest TABLOSUNDA QEVENT_GUIDE SERVİSİNİ AÇ
-- ===================================================================
UPDATE dbo._RefCharDefault_Quest
SET Service = 1
WHERE CodeName128 = 'QEVENT_GUIDE'
-- ===================================================================
-- 2. ADIM: MEVCUT VE EKSİK KARAKTERLERİN QUEST KAYDINI GÜNCELLE
-- Status = 5 (Tamamlandı - İstemci kilitlenmesini önleyen kesin bayrak)
-- ===================================================================
-- Önce varsa QuestID = 1 olan bozuk/eksik kayıtları temizle
DELETE FROM dbo._CharQuest
WHERE QuestID = 1
-- Tüm mevcut karakterlere tamamlanmış kılavuz kaydını ekle
INSERT INTO dbo._CharQuest (
CharID,
QuestID,
[Status],
AchievementCount,
StartTime,
EndTime,
QuestData1,
QuestData2
)
SELECT
C.CharID,
1,
5, -- 5: Completed (Görev bittiği için F1 kilitlenmez)
0,
GETDATE() - 1,
GETDATE() - 1,
31458135, -- Rehber adımlarının tamamlandığını belirten veri
0
FROM dbo._Char C WITH (NOLOCK)
WHERE C.CharID > 0
-- Korelasyonlu alt sorgu: Yalnızca kaydı eksik olan karakterleri hedefler
AND NOT EXISTS (
SELECT 1
FROM dbo._CharQuest CQ WITH (NOLOCK)
WHERE CQ.CharID = C.CharID
AND CQ.QuestID = 1
)
PRINT '====================================================='
PRINT 'BAŞARILI: QEVENT_GUIDE servisi açıldı ve karakterlerin görev kayıtları onarıldı!'
PRINT 'Değişikliklerin aktif olması için GameServer yeniden başlatılmalıdır.'
PRINT '====================================================='
Neden Bu Optimize Versiyon Kullanılmalı?
- Korelasyonlu Alt Sorgu Düzeltildi: Eski koddaki `WHERE NOT EXISTS (SELECT ... WHERE QuestID = 1)` mantık hatası giderildi; `CQ.CharID = C.CharID` bağı kurularak sunucudaki istisnasız tüm aktif karakterlerin sırayla eklenmesi sağlandı.
- Status = 5 Güvencesi: Görev durumu `Status = 1` (devam ediyor) yerine `Status = 5` (tamamlandı) yapıldı. Böylece istemci oyun açılışında rehber penceresini sıfırdan çizmeye çalışıp donmaz.
- Tek Kodla Çözüm: `_RefCharDefault_Quest` tablosunu elle açıp satır arama derdi olmadan SQL komutuyla doğrudan `QEVENT_GUIDE` satırı `1` yapılır.
Nasıl Uygulanır & Test Edilir?
- SQL Server Management Studio (SSMS) programını açın.
- Üst panelden New Query penceresi açıp yukarıdaki SQL kodunu yapıştırın.
- F5 tuşuna basarak sorguyu çalıştırın.
- Sunucunuzdaki GameServer pencerelerini kapatıp yeniden açın.
- Karakterinizle oyuna giriş yapın ve klavyeden art arda **F1** tuşuna basın.
- Arayüzün donmadığını, client'ın masaüstüne çökmediğini ve sorunsuz şekilde çalıştığını doğrulayın.
Sorularınızı ve takıldığınız yerleri bu konu altından paylaşabilirsiniz. Herkese keyifli ve sorunsuz geliştirmeler!

