- #1
Konu Sahibi
: serkankacan
[REHBER & SİSTEM] vSRO Gelişmiş Elixir (ADV) Silme Scroll Sistemi
Slot 13'teki Eşyaya Basılmış Olan ADV (+1 / +2 / +3 / +4) Değerini Güvenle Temizleme
Slot 13'teki Eşyaya Basılmış Olan ADV (+1 / +2 / +3 / +4) Değerini Güvenle Temizleme
Merhaba değerli forum sakinleri,
Silkroad Online sunucularında oyuncuların eşyalarına bastıkları Advanced Elixir (ADV) değerlerini silip yerine daha yüksek bir ADV basabilmeleri ya da eşyayı saf haline döndürebilmeleri için **ADV Silici Scroll** sistemi kullanılır.
Aşağıdaki prosedür; oyuncunun çantasının **ilk yuvasına (Slot 13)** yerleştirdiği eşyadaki ADV büyü parametresini (`OPT_LEVEL` / ADV Magic Param) tespit eder, ADV'den gelen artı miktarını eşyanın toplam artısından (
OptLevel) düşer, parametreyi sıfırlar ve eşyayı yeni bir basım işlemine hazır hale getirir.Önemli Kullanım Kuralları' Alıntı:DİKKAT:
- Oyuncu ADV değerini silmek istediği silah veya zırhı envanterinin **ilk yuvasına (Slot 13)** koymalıdır.
- Scroll kullanıldığında veritabanı ile GameServer belleğinin birebir eşitlenmesi için oyuncu otomatik olarak oyundan düşürülür (DC edilir).
- Eşyanın üzerindeki STR, INT, HP, MP gibi diğer standart Blue ve White statlarına kesinlikle dokunulmaz.
- İşlem öncesinde SRO_VT_LOG ve SRO_VT_SHARD yedeğinizi almayı unutmayınız.
1. ADIM: _ADV_REMOVER Prosedürünü Oluşturma
SRO_VT_LOG veritabanını seçip aşağıdaki ana motor prosedürünü derleyin:
SQL:
USE [SRO_VT_LOG]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE OR ALTER PROCEDURE dbo._ADV_REMOVER
@CharID INT
AS
BEGIN
SET NOCOUNT ON;
-- 1. Slot 13'teki eşyanın bilgilerini çek
DECLARE @ItemID64 BIGINT
DECLARE @CurOptLevel INT
DECLARE @MagParamNum INT
DECLARE @MagParam1 BIGINT, @MagParam2 BIGINT, @MagParam3 BIGINT, @MagParam4 BIGINT
DECLARE @MagParam5 BIGINT, @MagParam6 BIGINT, @MagParam7 BIGINT, @MagParam8 BIGINT
SELECT
@ItemID64 = INV.ItemID,
@CurOptLevel = IT.OptLevel,
@MagParamNum = IT.MagParamNum,
@MagParam1 = IT.MagParam1, @MagParam2 = IT.MagParam2,
@MagParam3 = IT.MagParam3, @MagParam4 = IT.MagParam4,
@MagParam5 = IT.MagParam5, @MagParam6 = IT.MagParam6,
@MagParam7 = IT.MagParam7, @MagParam8 = IT.MagParam8
FROM SRO_VT_SHARD.dbo._Inventory INV WITH (NOLOCK)
INNER JOIN SRO_VT_SHARD.dbo._Items IT WITH (NOLOCK) ON IT.ID64 = INV.ItemID
WHERE INV.CharID = @CharID
AND INV.Slot = 13
AND INV.ItemID > 0
-- Slot boşsa işlemi iptal et
IF (@ItemID64 IS NULL OR @ItemID64 <= 0)
RETURN;
-- 2. ADV Değerini ve Parametre Yuvasını Tespit Et
-- vSRO'da ADV parametre tip değeri genellikle 268435456 (0x10000000) veya türevidir.
-- Basılan ADV miktarı (Örn: +1, +2, +4) parametrenin değer alanından okunur.
DECLARE @AdvAmount INT = 0
DECLARE @TargetParamIndex INT = 0
-- Parametreleri kontrol et (Hangi yuvada ADV var?)
IF (@MagParam1 & 0xFFFFFFFF00000000) > 0 AND (@MagParam1 & 0x00000000FFFFFFFF) = 268435456
BEGIN
SET @TargetParamIndex = 1
SET @AdvAmount = (@MagParam1 >> 32) & 0xFF
END
ELSE IF (@MagParam2 & 0xFFFFFFFF00000000) > 0 AND (@MagParam2 & 0x00000000FFFFFFFF) = 268435456
BEGIN
SET @TargetParamIndex = 2
SET @AdvAmount = (@MagParam2 >> 32) & 0xFF
END
ELSE IF (@MagParam3 & 0xFFFFFFFF00000000) > 0 AND (@MagParam3 & 0x00000000FFFFFFFF) = 268435456
BEGIN
SET @TargetParamIndex = 3
SET @AdvAmount = (@MagParam3 >> 32) & 0xFF
END
ELSE IF (@MagParam4 & 0xFFFFFFFF00000000) > 0 AND (@MagParam4 & 0x00000000FFFFFFFF) = 268435456
BEGIN
SET @TargetParamIndex = 4
SET @AdvAmount = (@MagParam4 >> 32) & 0xFF
END
-- Eğer eşyada ADV bulunamadıysa işlem yapma
IF (@TargetParamIndex = 0 OR @AdvAmount <= 0)
RETURN;
-- 3. OptLevel'ı ADV miktarı kadar düşür ve ilgili parametreyi NULL yap
DECLARE @NewOptLevel INT = @CurOptLevel - @AdvAmount
IF (@NewOptLevel < 0) SET @NewOptLevel = 0
IF (@TargetParamIndex = 1)
UPDATE SRO_VT_SHARD.dbo._Items SET OptLevel = @NewOptLevel, MagParam1 = NULL, MagParamNum = MagParamNum - 1 WHERE ID64 = @ItemID64;
ELSE IF (@TargetParamIndex = 2)
UPDATE SRO_VT_SHARD.dbo._Items SET OptLevel = @NewOptLevel, MagParam2 = NULL, MagParamNum = MagParamNum - 1 WHERE ID64 = @ItemID64;
ELSE IF (@TargetParamIndex = 3)
UPDATE SRO_VT_SHARD.dbo._Items SET OptLevel = @NewOptLevel, MagParam3 = NULL, MagParamNum = MagParamNum - 1 WHERE ID64 = @ItemID64;
ELSE IF (@TargetParamIndex = 4)
UPDATE SRO_VT_SHARD.dbo._Items SET OptLevel = @NewOptLevel, MagParam4 = NULL, MagParamNum = MagParamNum - 1 WHERE ID64 = @ItemID64;
-- 4. Senkronizasyon için karakteri DC et
UPDATE SRO_VT_SHARD.dbo._User
SET Sec_Primary = 1
WHERE CharID = @CharID
END
GO
2. ADIM: _AddLogItem Tetikleyicisine Bağlama
SRO_VT_LOG içerisindeki **_AddLogItem** prosedürünü açarak
AS satırının altına tetikleyiciyi ekleyin:
SQL:
-- ===================================================================
-- ADV SİLİCİ SCROLL TETİKLEYİCİSİ
-- @Operation = 41 (Eşya Kullanımı)
-- 78013 (ADV Silici Scroll ID'si)
-- ===================================================================
IF (@Operation = 41 AND @ItemRefID = 78013)
BEGIN
EXEC SRO_VT_LOG.dbo._ADV_REMOVER @CharID
END
Nasıl Test Edilir?
- SQL kodlarını veritabanınızda okutun (F5 / Execute).
- Üzerinde ADV basılı olan bir eşyayı (örneğin +9 [+2 ADV] bir kılıcı) çantanızın **ilk yuvasına (Slot 13)** yerleştirin.
78013numaralı ADV silici parşömene sağ tıklayarak kullanın.- Karakter oyundan düşecektir (Disconnect).
- Tekrar oyuna girdiğinizde silahın artı değerinin saf haline (+7) döndüğünü, diğer hiçbir blue ve statın bozulmadığını göreceksiniz.
Sorularınızı ve takıldığınız yerleri bu konu altından paylaşabilirsiniz. Herkese iyi forumlar!

