- #1
Konu Sahibi
: serkankacan
[REHBER & QUERY] vSRO Durability (Dayanıklılık) Reset & Repair Scroll Sistemi
Slot 13'teki Eşyanın Statlarına Dokunmadan Dayanıklılığını (Data) Maksimuma Eşitleme
Slot 13'teki Eşyanın Statlarına Dokunmadan Dayanıklılığını (Data) Maksimuma Eşitleme
Merhaba değerli forum sakinleri,
Sunucunuzda dayanıklılığı (Durability) sıfırlanmış, yıpranmış veya tamir edilmesi gereken eşyalar için özel bir **Durability Reset Scroll** tasarlamak isteyebilirsiniz.
İnternette dolaşan eski paylaşımlarda
MagParamNum = 0, MagParam1 = NULL şeklinde kodlar bulunmaktadır; BU KODLARI KESİNLİKLE KULLANMAYINIZ! Çünkü o kodlar durability düzeltmez; eşyanın üzerindeki STR, INT, HP, MP, Critical gibi **tüm blue statlarını tamamen siler ve itemi çöp eder!**Silkroad veritabanında eşyanın mevcut dayanıklılığı `_Items` tablosundaki Data sütununda tutulur. Aşağıda eşyanın hiçbir statına dokunmadan sadece dayanıklılığını maksimum değere eşitleyen ve senkronizasyon için oyuncuyu güvenle DC eden hatasız prosedürü paylaşıyoruz.
Önemli Uyarı' Alıntı:DİKKAT (Kullanım Kuralı):
- Oyuncu tamir etmek istediği eşyayı çantasının **ilk yuvasına (Slot 13)** koymalıdır.
- Scroll basıldığında sunucu belleğindeki eşya verisinin veritabanıyla çakışmaması için oyuncu anında oyundan düşürülür (DC edilir). Tekrar girdiğinde eşyası %100 tamir edilmiş olur.
- İşlem öncesinde SRO_VT_LOG ve SRO_VT_SHARD yedeğinizi almayı unutmayınız.
Hatasız & Güvenli _AddLogItem Kodu
SRO_VT_LOG veritabanını açın, **Programmability -> Stored Procedures -> _AddLogItem** prosedürüne sağ tıklayıp **Modify** deyin.
AS bloğunun uygun bir yerine aşağıdaki kodu ekleyin:
SQL:
-- ===================================================================
-- DURABILITY RESET / REPAIR SCROLL SİSTEMİ
-- @Operation = 41 (Eşya Sağ Tıklanarak Tüketildiğinde Tetiklenir)
-- @ItemRefID = 78343 (Kullandığınız Scroll'un RefItemID Değeri)
-- ===================================================================
IF (@Operation = 41 AND @ItemRefID = 78343)
BEGIN
-- 1. Çantanın ilk yuvasındaki (Slot 13) eşyanın ID64 ve Maksimum Durability bilgisini al
DECLARE @TargetItemID BIGINT
DECLARE @MaxDurability INT
SELECT
@TargetItemID = I.ID64,
@MaxDurability = ROI.Durability
FROM SRO_VT_SHARD.dbo._Inventory INV
INNER JOIN SRO_VT_SHARD.dbo._Items I ON I.ID64 = INV.ItemID
INNER JOIN SRO_VT_SHARD.dbo._RefObjCommon ROC ON ROC.ID = I.RefItemID
INNER JOIN SRO_VT_SHARD.dbo._RefObjItem ROI ON ROI.ID = ROC.Link
WHERE INV.CharID = @CharID
AND INV.Slot = 13
AND INV.ItemID > 0
-- 2. Eğer Slot 13'te geçerli bir eşya varsa dayanıklılığı fulle
IF (@TargetItemID IS NOT NULL AND @MaxDurability > 0)
BEGIN
-- Sadece eşyanın mevcut dayanıklılığını (Data) maksimum değere eşitle:
UPDATE SRO_VT_SHARD.dbo._Items
SET Data = @MaxDurability
WHERE ID64 = @TargetItemID
-- 3. KRİTİK ADIM: Karakteri anında DC et (Bellek çakışmasını engeller, tamir kalıcı olur)
UPDATE SRO_VT_SHARD.dbo._User
SET Sec_Primary = 1
WHERE CharID = @CharID
END
END
Neden Bu Yöntem Doğru?
- Stat Güvenliği:
MagParamsütunlarına dokunulmadığı için silah veya zırhın üzerindeki hiçbir Blue, White veya Advanced Elixir özelliği kaybolmaz. - Dinamik Dayanıklılık: Eşyanın orijinal maksimum dayanıklılığı
_RefObjItemtablosundan çekilerek yazılır; böylece ister kalkan ister silah olsun her eşya kendi orijinal kapasitesine göre tamir edilir. - Bellek Koruması (Sec_Primary = 1): Karakter anında oyundan düşürülerek GameServer'ın bozuk dayanıklılık verisini veritabanının üzerine tekrar yazması (Rollback bugu) kesin olarak engellenir.
Nasıl Test Edilir?
- SQL kodunu `_AddLogItem` prosedürüne kaydedin (F5 / Execute).
- Dayanıklılığı azalmış veya kırılmış bir eşyayı envanterin **en sol üst köşesine (1. Slot - Sistemdeki Slot 13)** yerleştirin.
78343numaralı parşömene sağ tıklayarak basın.- Karakteriniz oyundan düşecektir (Disconnect).
- Oyuna tekrar girdiğinizde eşyanın dayanıklılığının hiçbir stat kaybı olmadan %100 tamir olduğunu göreceksiniz.
Sorularınızı ve takıldığınız yerleri bu konu altından iletebilirsiniz. Herkese keyifli geliştirmeler!

