- #1
Konu Sahibi
: serkankacan
[YÖNETİCİ REHBERİ] vSRO Çantadaki Eşya/Adet Sorgulama ve Aktif SC (Buff) Silme
_Inventory, _Items ve _TimedJob Tabloları Üzerinden Oyuncu Yönetimi
_Inventory, _Items ve _TimedJob Tabloları Üzerinden Oyuncu Yönetimi
Merhaba değerli forum sakinleri,
Sunucunuzda oyuncu destek taleplerinde (ticket), incelemelerde veya bug kontrollerinde iki işlemle sıkça karşılaşırsınız:
- Karakterin çantasında belirli bir item var mı, kaç adet ve kaç artı basılı?
- Karakterin üzerinde basılı olan süreli buff/scroll (Damage, Def, Hız, Premium, Godbless vb.) etkilerini silme.
Aşağıda her iki işlem için optimize edilmiş, temiz ve güvenli SQL sorgularını bulabilirsiniz.
Önemli Uyarı' Alıntı:DİKKAT:
- Karakter üzerinde silme veya düzenleme işlemi yaparken oyuncunun kesinlikle oyunda olmaması (OFFLINE) gerekir. Oyuncu online iken veritabanından veri silinirse sunucu hafızası ile DB senkronizasyonu bozulur ve oyuncu oyundan çıktığında eski veriler tekrar DB'ye yazılabilir.
- İşlem öncesinde SRO_VT_SHARD yedeğinizi almayı unutmayınız.
1. BÖLÜM: Karakterin Çantasındaki İtemi, Adedini ve Artısını Öğrenme
Aşağıdaki sorgu ile hem karakter adına hem de aradığınız itemin kod adına göre filtreleme yapabilirsiniz. Sorgu; itemin kaçıncı slotta olduğunu, artı değerini (`Plus`) ve adet miktarını (`Adet`) listeler:
SQL:
USE [SRO_VT_SHARD]
GO
-- ===================================================================
-- ÇANTA İTEM & ADET SORGULAMA
-- ===================================================================
DECLARE @CharName VARCHAR(16) = 'OYUNDAKIKARAKTERINADI' -- İncelemek istediğiniz karakter adı
DECLARE @ItemCode VARCHAR(128) = '%ITEM_ETC_SD_TOKEN%' -- Aramak istediğiniz eşya kodu parçası
SELECT
CH.CharName16,
INV.Slot AS [CantaSlotu],
REF.CodeName128 AS [ItemKodu],
IT.OptLevel AS [Plus],
CASE
WHEN IT.Data = 0 THEN 1
ELSE IT.Data
END AS [Adet],
IT.ID64 AS [ItemSerialID]
FROM dbo._Char CH
INNER JOIN dbo._Inventory INV ON INV.CharID = CH.CharID
INNER JOIN dbo._Items IT ON IT.ID64 = INV.ItemID
INNER JOIN dbo._RefObjCommon REF ON REF.ID = IT.RefItemID
WHERE CH.CharName16 = @CharName
AND REF.CodeName128 LIKE @ItemCode
ORDER BY INV.Slot ASC
2. BÖLÜM: Karakterde Basılı Olan Süreli SC / Buffları Silme
Zaman sınırlı efektler, scrollar, damage/def artırıcılar ve premium süreleri _TimedJob tablosunda tutulur.
Yöntem A: Karakterdeki TÜM Aktif Scroll ve Buffları Temizleme
Oyuncunun üzerindeki tüm süreli etkileri tamamen sıfırlamak için kullanılır:
SQL:
USE [SRO_VT_SHARD]
GO
-- Karakterin üzerindeki tüm basılı süreli SC / Buffları kaldırır
DELETE FROM dbo._TimedJob
WHERE CharID = (SELECT CharID FROM dbo._Char WHERE CharName16 = 'OYUNDAKIKARAKTERINADI')
Yöntem B: Sadece Belirli Bir Scroll / Buff Etkisini Silme
Önce karakterin üzerinde hangi buffların basılı olduğunu listeleyip yalnızca sorunlu olanı silmek isterseniz:
SQL:
USE [SRO_VT_SHARD]
GO
-- 1. ADIM: Karakterde aktif olan buffları ve JobID'leri gör
SELECT TJ.ID, TJ.JobID, TJ.TimeToKeep, SK.CodeName128
FROM dbo._TimedJob TJ
JOIN dbo._Char CH ON CH.CharID = TJ.CharID
LEFT JOIN dbo._RefSkill SK ON SK.ID = TJ.JobID
WHERE CH.CharName16 = 'OYUNDAKIKARAKTERINADI'
-- 2. ADIM: Listeden tespit ettiğiniz tekil ID'yi silin (Örn: ID = 12345)
DELETE FROM dbo._TimedJob
WHERE ID = 12345
Nasıl Uygulanır?
- Oyuncunun oyundan çıkış yaptığından (Disconnect/Offline) emin olun.
- SQL Server Management Studio (SSMS) programında New Query penceresi açın.
- İlgili sorgudaki
@CharNameveyaOYUNDAKIKARAKTERINADIalanını güncelleyip F5 ile çalıştırın. - İşlem tamamlandığında oyuncu oyuna girdiğinde yapılan değişiklikler hemen geçerli olacaktır (Bu işlem için GameServer restart gerekmez).
Sorularınızı ve takıldığınız yerleri bu konu altından paylaşabilirsiniz. Herkese iyi forumlar!

