- #1
Konu Sahibi
: serkankacan
[GÜVENLİK & SİSTEM] vSRO Otomatik Artı (+) Sınırlama (Max Plus Limiter)
_AddLogItem (@Operation = 90) Üzerinden Belirlenen Limitin Üzerine Çıkan Eşyaları Otomatik Geri Çekme
_AddLogItem (@Operation = 90) Üzerinden Belirlenen Limitin Üzerine Çıkan Eşyaları Otomatik Geri Çekme
Merhaba değerli forum sakinleri,
Silkroad Online sunucularınızda oyun dengesini korumak ve simya (alchemy) sınırını belirli bir seviyede (örneğin maksimum **+12**) tutmak isteyebilirsiniz.
İnternette dolaşan satır satır `LIKE '%Opt: +13%'` yazılmış eski sorgular hem sunucuda gereksiz gecikme (lag) yaratır hem de `+20`'nin üzerindeki basımları yakalayamaz. Ayrıca oyuncu DC edilmediği takdirde `GameServer` belleği eşyayı hala yüksek artı seviyesinde tutmaya devam eder.
Aşağıda paylaşılan optimize sistem; simya işlemi başarılı olduğunda eşyanın artı seviyesini anlık olarak kontrol eder, sınırın üstündeyse belirlenen maksimum değere geri sabitler ve bellek senkronizasyonu için oyuncuyu oyundan düşürür (DC eder).
Önemli Güvenlik Kuralları' Alıntı:DİKKAT:
- Bu kontrol SRO_VT_LOG içerisindeki **_AddLogItem** prosedürüne eklenir.
@Operation = 90, simya (Elixir / Alchemy) sonucunda eşyanın seviye atladığı log tipidir.- Eşyanın veritabanındaki yeni artısının istemciye ve GameServer'a tam yansıması için kuralı aşan oyuncu anında DC edilir.
- İşlem öncesinde SRO_VT_LOG yedeğinizi almayı unutmayınız.
Hatasız & Optimize Edilmiş _AddLogItem Kodu
SRO_VT_LOG veritabanındaki **_AddLogItem** prosedürünü açın (
Modify) ve AS satırının altına şu optimize bloğu ekleyin:
SQL:
-- ===================================================================
-- ARTI (+) SINIRLAMA SİSTEMİ (MAX PLUS LIMITER)
-- @Operation = 90: Simya Başarılı Seviye Yükselme Logu
-- ===================================================================
IF (@Operation = 90)
BEGIN
DECLARE @MaxPlusLimit INT = 12 -- Sunucunuzda izin verilen MAKSİMUM artı sınırı
-- 1. Eşyanın güncel OptLevel değerini _Items tablosundan sayısal olarak çek
DECLARE @CurrentOptLevel INT
SELECT @CurrentOptLevel = OptLevel
FROM SRO_VT_SHARD.dbo._Items WITH (NOLOCK)
WHERE Serial64 = @ItemSerial
-- 2. Eğer artı sınırı aşıldıysa (Örn: +13 ve üzeri basıldıysa)
IF (@CurrentOptLevel > @MaxPlusLimit)
BEGIN
-- Eşyanın artısını izin verilen maksimum sınıra geri çek
UPDATE SRO_VT_SHARD.dbo._Items
SET OptLevel = @MaxPlusLimit
WHERE Serial64 = @ItemSerial
-- KRİTİK ADIM: GameServer belleğindeki yüksek artının sıfırlanması için oyuncuyu anında DC et
UPDATE SRO_VT_SHARD.dbo._User
SET Sec_Primary = 1
WHERE CharID = @CharID
END
END
Neden Bu Yöntem Tercih Edilmeli?
- Tekil ve Sayısal Denetim: String aramaları (`LIKE`) yerine doğrudan tamsayı karşılaştırması (`> @MaxPlusLimit`) kullanılır; işlemciyi yormaz ve kilitlenme (deadlock) oluşturmaz.
- Sınırsız Kapsam: Oyuncu +13, +20 veya exploit ile +50 dahi bassa tek satırlık büyüktür şartı tüm sınır aşımlarını eksiksiz yakalar.
- Bellek Eşitliği (Anti-Rollback):
Sec_Primary = 1komutu sayesinde oyuncunun istemcisi anında kapatılarak sunucu belleğindeki sahte güç değeri silinir.
Nasıl Uygulanır?
- SQL Server Management Studio (SSMS) üzerinden `_AddLogItem` prosedürünü açın.
- Yukarıdaki kodu ekleyip en üstteki
@MaxPlusLimit = 12değerini kendi sunucu politikanıza göre ayarlayın. - F5 tuşuna basarak prosedürü derleyin.
- Sunucu restartı gerektirmez, hemen o saniye devreye girer.
Sorularınızı ve takıldığınız yerleri bu konu altından iletebilirsiniz. Herkese keyifli geliştirmeler!

