- #1
Konu Sahibi
: serkankacan
[REHBER & SİSTEM] vSRO Model Switcher Sistemi (Weapon Skin / Model Dönüştürücü)
Slot 13'teki Silahın Artı, Blue ve Statlarını Korumalı Olarak Hedef Degree Görünümüne Dönüştürme
Slot 13'teki Silahın Artı, Blue ve Statlarını Korumalı Olarak Hedef Degree Görünümüne Dönüştürme
Merhaba değerli forum sakinleri,
Silkroad Online sunucularında oyuncuların kullandıkları yüksek degree silahların (örneğin 11 Dg veya 12 Dg) görünümünü sevdikleri eski bir degree (Örn: 8 Dg, 9 Dg veya 10 Dg Moon/Sun) modeline çevirebilmeleri için özel **Model Switcher Scroll** sistemi hazırlanır.
Aşağıda paylaşılan sistem; oyuncunun çantasının **ilk yuvasına (Slot 13)** koyduğu silahın türünü (Kılıç, Yay, Mızrak, Asa vb.) tespit eder, hedef degree modeline dönüştürür; bu işlemi yaparken **artı (+), stat, adv ve blue özelliklerini eksiksiz korur** ve senkronizasyon için oyuncuyu güvenle DC eder.
Önemli Kullanım Kuralları' Alıntı:DİKKAT:
- Oyuncu modelini değiştirmek istediği silahı envanterinin **ilk yuvasına (Slot 13)** koymalıdır.
- Scroll basıldığında eşyanın yeni modelinin görünmesi ve GameServer bellek senkronizasyonunun bozulmaması için oyuncu anında oyundan düşürülür (DC edilir).
- İşlem öncesinde SRO_VT_LOG ve SRO_VT_SHARD yedeklerinizi almayı unutmayınız.
1. ADIM: _MODEL_SWITCHER_MOON Prosedürünü Oluşturma
SRO_VT_LOG veritabanını seçip aşağıdaki ana motor prosedürünü oluşturun:
SQL:
USE [SRO_VT_LOG]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE OR ALTER PROCEDURE dbo._MODEL_SWITCHER_MOON
@CharID INT,
@ScrollID INT
AS
BEGIN
SET NOCOUNT ON;
-- 1. Slot 13'teki eşyanın bilgilerini çek
DECLARE @ItemID64 BIGINT
DECLARE @CurRefItemID INT
DECLARE @CurCodeName VARCHAR(128)
SELECT
@ItemID64 = INV.ItemID,
@CurRefItemID = IT.RefItemID,
@CurCodeName = ROC.CodeName128
FROM SRO_VT_SHARD.dbo._Inventory INV WITH (NOLOCK)
INNER JOIN SRO_VT_SHARD.dbo._Items IT WITH (NOLOCK) ON IT.ID64 = INV.ItemID
INNER JOIN SRO_VT_SHARD.dbo._RefObjCommon ROC WITH (NOLOCK) ON ROC.ID = IT.RefItemID
WHERE INV.CharID = @CharID
AND INV.Slot = 13
AND INV.ItemID > 0
-- Slot boşsa veya eşya silah değilse işlemi iptal et
IF (@ItemID64 IS NULL OR @CurCodeName NOT LIKE 'ITEM_%')
RETURN;
-- 2. Scroll ID'sine göre hedef Degree değerini belirle
-- (Örnek: 78001 -> 1 Dg, 78008 -> 8 Dg, 78012 -> 12 Dg)
DECLARE @TargetDegree INT = (@ScrollID - 78000)
DECLARE @TargetDegreeStr VARCHAR(4) = RIGHT('0' + CAST(@TargetDegree AS VARCHAR(2)), 2)
-- 3. Silahın gövde türünü belirle (Örn: SWORD, BOW, SPEAR, TSTAFF vb.)
-- Standart format: ITEM_CH_SWORD_11_C_RARE veya ITEM_EU_DAGGER_11_B_RARE
DECLARE @WeaponType VARCHAR(32)
IF (@CurCodeName LIKE '%SWORD%') SET @WeaponType = 'SWORD'
ELSE IF (@CurCodeName LIKE '%BLADE%') SET @WeaponType = 'BLADE'
ELSE IF (@CurCodeName LIKE '%SPEAR%') SET @WeaponType = 'SPEAR'
ELSE IF (@CurCodeName LIKE '%GLAND%') SET @WeaponType = 'GLAND'
ELSE IF (@CurCodeName LIKE '%BOW%') SET @WeaponType = 'BOW'
ELSE IF (@CurCodeName LIKE '%SHIELD%') SET @WeaponType = 'SHIELD'
ELSE IF (@CurCodeName LIKE '%TSWORD%') SET @WeaponType = 'TSWORD'
ELSE IF (@CurCodeName LIKE '%AXE%') SET @WeaponType = 'AXE'
ELSE IF (@CurCodeName LIKE '%DARKSTAFF%') SET @WeaponType = 'DARKSTAFF'
ELSE IF (@CurCodeName LIKE '%TSTAFF%') SET @WeaponType = 'TSTAFF'
ELSE IF (@CurCodeName LIKE '%CROSSBOW%') SET @WeaponType = 'CROSSBOW'
ELSE IF (@CurCodeName LIKE '%DAGGER%') SET @WeaponType = 'DAGGER'
ELSE IF (@CurCodeName LIKE '%HARP%') SET @WeaponType = 'HARP'
ELSE IF (@CurCodeName LIKE '%STAFF%') SET @WeaponType = 'STAFF'
ELSE RETURN;
-- 4. Hedef Moon modelinin RefItemID karşılığını _RefObjCommon'dan bul
DECLARE @NewRefItemID INT = (
SELECT TOP 1 ID
FROM SRO_VT_SHARD.dbo._RefObjCommon
WHERE CodeName128 LIKE 'ITEM_%_' + @WeaponType + '_' + @TargetDegreeStr + '_%_RARE'
AND Service = 1
ORDER BY ID DESC
)
-- 5. Eğer geçerli bir model ID bulunduysa eşyayı güncelle ve oyuncuyu DC et
IF (@NewRefItemID IS NOT NULL AND @NewRefItemID > 0)
BEGIN
-- Sadece RefItemID güncellenir; OptLevel, Data ve MagParam'lar aynen korunur
UPDATE SRO_VT_SHARD.dbo._Items
SET RefItemID = @NewRefItemID
WHERE ID64 = @ItemID64
-- Senkronizasyon için karakteri DC et
UPDATE SRO_VT_SHARD.dbo._User
SET Sec_Primary = 1
WHERE CharID = @CharID
END
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 şu optimize tetikleyiciyi ekleyin:
SQL:
-- ===================================================================
-- MODEL SWITCHER TETİKLEYİCİSİ
-- @Operation = 41 (Eşya Kullanımı)
-- 78001 - 78012 (1 Dg ile 12 Dg Arası Moon Switcher Scroll ID'leri)
-- ===================================================================
IF (@Operation = 41 AND (@ItemRefID BETWEEN 78001 AND 78012))
BEGIN
EXEC SRO_VT_LOG.dbo._MODEL_SWITCHER_MOON @CharID, @ItemRefID
END
Nasıl Test Edilir?
- Her iki SQL kodunu da veritabanınızda derleyin (F5 / Execute).
- Dönüştürmek istediğiniz silahı çantanızın **ilk yuvasına (Slot 13)** koyun.
- Örneğin 9 Dg Moon görünümü veren
78009numaralı scroll'a sağ tıklayın. - Karakter oyundan düşecektir (DC).
- Tekrar oyuna girdiğinizde silahınızın yeni modele dönüştüğünü, artı (+), blue ve statlarının eksiksiz korunduğunu göreceksiniz.
Sorularınızı ve farklı model varyasyon taleplerinizi konu altından belirtebilirsiniz. Herkese iyi forumlar!

