- #1
Konu Sahibi
: serkankacan
[FİX & REHBER] vSRO Thief Şehir İçi Kervan Malı Çalma Bug Fix
_AddLogItem (@Operation = 144) Üzerinden Güvenli Bölgede Pet Envanterine Kervan Malı Aktarımını Engelleme
_AddLogItem (@Operation = 144) Üzerinden Güvenli Bölgede Pet Envanterine Kervan Malı Aktarımını Engelleme
Merhaba değerli forum sakinleri,
vSRO sunucularında hırsız (Thief) oyuncuların en sık başvurduğu suistimallerden biri; şehir girişlerinde veya güvenli bölgelerde (Safe Zone / Town) düşen veya transfer edilen kervan mallarını binek/toplayıcı hayvanlarının (COS) envanterine alarak cezasız ve risksiz şekilde kaçırmalarıdır.
Aşağıda paylaşılan prosedür; Thief rolündeki bir oyuncu savaş alanı dışındaki güvenli bir bölgede (
IsBattleField = 0) petine kervan malı atmaya çalıştığı anda eşyayı tespit edip hem pet slotundan hem de veritabanından anında silerek hileyi tamamen geçersiz kılar.Önemli Uyarı' Alıntı:DİKKAT:
- Bu kontrol SRO_VT_LOG veritabanındaki **_AddLogItem** prosedürüne eklenmelidir.
@ItemSerialveID64alanları BIGINT olarak tanımlanmıştır; böylece yüksek ID'li sunucularda veri taşması (overflow) hatası yaşanmaz.- İşlem öncesinde SRO_VT_LOG yedeğinizi almayı unutmayınız.
Optimize Edilmiş _AddLogItem Prosedür Kodu
SRO_VT_LOG veritabanını açın, **Programmability -> Stored Procedures -> _AddLogItem** prosedürüne sağ tıklayıp **Modify** deyin.
AS satırının altına uygun bir yere şu bloğu ekleyin:
SQL:
-- ===================================================================
-- THIEF ŞEHİR İÇİ KERVAN MALI AKTARIM BUG FİX
-- @Operation = 144: Pet / COS Envanterine Eşya Aktarım Logu
-- ===================================================================
IF (@Operation = 144)
BEGIN
DECLARE @JobType TINYINT
DECLARE @IsBattleField BIT
DECLARE @ItemID64 BIGINT
-- 1. Karakterin meslek (Thief = 2) ve bulunduğu bölgenin savaş alanı durumunu kontrol et
SELECT
@JobType = CTJ.JobType,
@IsBattleField = R.IsBattleField
FROM SRO_VT_SHARD.dbo._Char C WITH (NOLOCK)
INNER JOIN SRO_VT_SHARD.dbo._CharTriJob CTJ WITH (NOLOCK) ON C.CharID = CTJ.CharID
INNER JOIN SRO_VT_SHARD.dbo._RefRegion R WITH (NOLOCK) ON C.LatestRegion = R.wRegionID
WHERE C.CharID = @CharID
-- 2. Eğer karakter Thief ise ve güvenli bölgede (IsBattleField = 0) pete mal atıyorsa:
IF (@JobType = 2 AND @IsBattleField = 0)
BEGIN
-- Eşyanın ID64 değerini yakala
SELECT @ItemID64 = ID64
FROM SRO_VT_SHARD.dbo._Items WITH (NOLOCK)
WHERE Serial64 = @ItemSerial
IF (@ItemID64 IS NOT NULL AND @ItemID64 > 0)
BEGIN
-- Pet envanterindeki slotu sıfırla
UPDATE SRO_VT_SHARD.dbo._InvCOS
SET ItemID = 0
WHERE ItemID = @ItemID64
-- _Items tablosundaki ölü/yetim kaydı temizle
DELETE FROM SRO_VT_SHARD.dbo._Items
WHERE ID64 = @ItemID64
END
END
END
Yapılan İyileştirmeler Nelerdir?
- BIGINT Düzeltmesi: Eşya ID'si `int` yerine `bigint` yapılarak veri tabanı taşma hataları ve kilitlenmeler engellendi.
- WITH (NOLOCK) Koruması: Yoğun saatlerde eşya aktarımlarında veritabanı kilitlenmelerini (Deadlock) önlemek için sorguya tablo okuma kilit önleyicileri eklendi.
- Fiziksel Veri Temizliği: Sadece slotu `0` yapmak yerine `_Items` tablosundaki kayıt da silinerek haksız elde edilen eşyanın tamamen yok edilmesi sağlandı.
Nasıl Uygulanır?
- SQL Server Management Studio (SSMS) üzerinden `_AddLogItem` prosedürünü açın.
- Yukarıdaki kodu ekleyip F5 tuşuna basarak prosedürü güncelleyin.
- Herhangi bir GameServer restartına gerek kalmadan anında aktifleşir.
Sorularınızı ve takıldığınız noktaları konu altından sorabilirsiniz. Herkese keyifli ve adil oyunlar!

