🧩 [VSRO FIX] – İtem Balanslarını Ayarlama (+2 +3 +4 Fark / Multiplier Sistemi)
🎯 Fix Amacı
Bu içeriğin amacı:
- İtem basma (+) değerleri arasındaki farkı (ör. +2/+3/+4/+5) kontrollü şekilde düzenlemek
- Silah / kalkan / zırh / aksesuar statlarını multiplier mantığıyla toplu güncellemek
- Legendary veya hedef item seti üzerinde balans sağlamak
🧠 Problem Açıklaması
Bazı serverlarda + basma değerleri arasındaki farklar (ör. +2 ile +3, +3 ile +4) ya çok az ya da aşırı olabilir. Bu script ile multiplier mantığı kullanılarak, bir “artı değerinin” (Inc alanları) verdiği artış baz alınır ve belirlediğiniz çarpanla hedef iteme uygulanır.
Örnek: Silahların phy/mag attack değerlerinde +5 fark istiyorsanız, ilgili attack multiplier’ını 5 yaparak istediğiniz seviyeyi yakalayabilirsiniz. Hit rate vb. değerler ise “çarpan” değil, direkt sabit bonus olarak eklenir (ör. +2).
⚙️ Etkilenen Sistemler
- Database: _RefObjItem (item stat alanları)
- Database: _RefObjCommon (codename – link eşlemesi)
- Balans Mantığı: Inc alanları (örn. PAttackInc / MAttackInc / PDInc / MDInc / PARInc / MARInc)
🖼️ Ekran Görüntüsü

🛠️ ÇÖZÜM – SQL FIX
Kodun her bir iteme ait düzenleme bölümleri ayrı olduğu için, bu içerikte tek script altında bölümlere ayrılmış şekilde verilmektedir. İsterseniz bölümleri tek tek çalıştırabilir, isterseniz tamamını tek seferde uygulayabilirsiniz.
⚠️ Uygulama öncesi Shard yedeği almanız önerilir. İşlem sonrası server modüllerini yeniden başlatıp test ediniz.
-- =====================================================
-- SILKROAD ONLINE ITEM BALANCE SCRIPT
-- =====================================================
-- =====================================================
-- BÖLÜM 1: WEAPON (SİLAH) GÜNCELLEMELERİ
-- =====================================================
DECLARE @Weapon_PAttackMultiplier FLOAT = 5 -- Physical Attack çarpanı
DECLARE @Weapon_PAStrMultiplier FLOAT = 2 -- Physical Attack Reinforce çarpanı
DECLARE @Weapon_MAIntMultiplier FLOAT = 2.5 -- Magic Attack Reinforce çarpanı
DECLARE @Weapon_HRBonus INT = 2 -- Hit Rate bonusu (sabit)
DECLARE @Weapon_CHRBonus INT = 2 -- Critical Hit Rate bonusu (sabit)
DECLARE @WeaponMapping TABLE (
SourceItem NVARCHAR(128),
TargetItem NVARCHAR(128)
)
-- Mevcut item -> Güncellenecek item codename
INSERT INTO @WeaponMapping (SourceItem, TargetItem) VALUES
-- Chinese Weapons
('ITEM_CH_SWORD_14_C_RARE', 'ITEM_CH_SWORD_14_C_RARE_LEGENDARY'),
('ITEM_CH_BLADE_14_C_RARE', 'ITEM_CH_BLADE_14_C_RARE_LEGENDARY'),
('ITEM_CH_SPEAR_14_C_RARE', 'ITEM_CH_SPEAR_14_C_RARE_LEGENDARY'),
('ITEM_CH_TBLADE_14_C_RARE', 'ITEM_CH_TBLADE_14_C_RARE_LEGENDARY'),
('ITEM_CH_BOW_14_C_RARE', 'ITEM_CH_BOW_14_C_RARE_LEGENDARY'),
-- European Weapons
('ITEM_EU_DAGGER_14_C_RARE', 'ITEM_EU_DAGGER_14_C_RARE_LEGENDARY'),
('ITEM_EU_SWORD_14_C_RARE', 'ITEM_EU_SWORD_14_C_RARE_LEGENDARY'),
('ITEM_EU_TSWORD_14_C_RARE', 'ITEM_EU_TSWORD_14_C_RARE_LEGENDARY'),
('ITEM_EU_AXE_14_C_RARE', 'ITEM_EU_AXE_14_C_RARE_LEGENDARY'),
('ITEM_EU_CROSSBOW_14_C_RARE', 'ITEM_EU_CROSSBOW_14_C_RARE_LEGENDARY'),
('ITEM_EU_DARKSTAFF_14_C_RARE', 'ITEM_EU_DARKSTAFF_14_C_RARE_LEGENDARY'),
('ITEM_EU_TSTAFF_14_C_RARE', 'ITEM_EU_TSTAFF_14_C_RARE_LEGENDARY'),
('ITEM_EU_HARP_14_C_RARE', 'ITEM_EU_HARP_14_C_RARE_LEGENDARY'),
('ITEM_EU_STAFF_14_C_RARE', 'ITEM_EU_STAFF_14_C_RARE_LEGENDARY')
PRINT 'Weapon itemleri güncelleniyor...'
UPDATE target
SET
-- Physical Attack (truncate, sadece target alan > 0 ise)
target.PAttackMin_L = CASE WHEN target.PAttackMin_L > 0
THEN ROUND(CAST(source.PAttackMin_L + (source.PAttackInc * @Weapon_PAttackMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PAttackMin_L END,
target.PAttackMin_U = CASE WHEN target.PAttackMin_U > 0
THEN ROUND(CAST(source.PAttackMin_U + (source.PAttackInc * @Weapon_PAttackMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PAttackMin_U END,
target.PAttackMax_L = CASE WHEN target.PAttackMax_L > 0
THEN ROUND(CAST(source.PAttackMax_L + (source.PAttackInc * @Weapon_PAttackMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PAttackMax_L END,
target.PAttackMax_U = CASE WHEN target.PAttackMax_U > 0
THEN ROUND(CAST(source.PAttackMax_U + (source.PAttackInc * @Weapon_PAttackMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PAttackMax_U END,
-- Magic Attack (truncate, sadece target alan > 0 ise)
target.MAttackMin_L = CASE WHEN target.MAttackMin_L > 0
THEN ROUND(CAST(source.MAttackMin_L + (source.MAttackInc * @Weapon_PAttackMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MAttackMin_L END,
target.MAttackMin_U = CASE WHEN target.MAttackMin_U > 0
THEN ROUND(CAST(source.MAttackMin_U + (source.MAttackInc * @Weapon_PAttackMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MAttackMin_U END,
target.MAttackMax_L = CASE WHEN target.MAttackMax_L > 0
THEN ROUND(CAST(source.MAttackMax_L + (source.MAttackInc * @Weapon_PAttackMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MAttackMax_L END,
target.MAttackMax_U = CASE WHEN target.MAttackMax_U > 0
THEN ROUND(CAST(source.MAttackMax_U + (source.MAttackInc * @Weapon_PAttackMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MAttackMax_U END,
-- Physical Attack Reinforce (truncate, sadece target alan > 0 ise)
target.PAStrMin_L = CASE WHEN target.PAStrMin_L > 0
THEN ROUND(CAST(source.PAStrMin_L + (source.MAttackInc * @Weapon_PAStrMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PAStrMin_L END,
target.PAStrMin_U = CASE WHEN target.PAStrMin_U > 0
THEN ROUND(CAST(source.PAStrMin_U + (source.MAttackInc * @Weapon_PAStrMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PAStrMin_U END,
target.PAStrMax_L = CASE WHEN target.PAStrMax_L > 0
THEN ROUND(CAST(source.PAStrMax_L + (source.MAttackInc * @Weapon_PAStrMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PAStrMax_L END,
target.PAStrMax_U = CASE WHEN target.PAStrMax_U > 0
THEN ROUND(CAST(source.PAStrMax_U + (source.MAttackInc * @Weapon_PAStrMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PAStrMax_U END,
-- Magic Attack Reinforce (truncate, sadece target alan > 0 ise)
target.MAInt_Min_L = CASE WHEN target.MAInt_Min_L > 0
THEN ROUND(CAST(source.MAInt_Min_L + (source.MAttackInc * @Weapon_MAIntMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MAInt_Min_L END,
target.MAInt_Min_U = CASE WHEN target.MAInt_Min_U > 0
THEN ROUND(CAST(source.MAInt_Min_U + (source.MAttackInc * @Weapon_MAIntMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MAInt_Min_U END,
target.MAInt_Max_L = CASE WHEN target.MAInt_Max_L > 0
THEN ROUND(CAST(source.MAInt_Max_L + (source.MAttackInc * @Weapon_MAIntMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MAInt_Max_L END,
target.MAInt_Max_U = CASE WHEN target.MAInt_Max_U > 0
THEN ROUND(CAST(source.MAInt_Max_U + (source.MAttackInc * @Weapon_MAIntMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MAInt_Max_U END,
-- Hit Rate & Critical (sabit bonus; sadece target > 0 ise)
target.HR_L = CASE WHEN target.HR_L > 0 THEN (source.HR_L + @Weapon_HRBonus) ELSE target.HR_L END,
target.HR_U = CASE WHEN target.HR_U > 0 THEN (source.HR_U + @Weapon_HRBonus) ELSE target.HR_U END,
target.CHR_L = CASE WHEN target.CHR_L > 0 THEN (source.CHR_L + @Weapon_CHRBonus) ELSE target.CHR_L END,
target.CHR_U = CASE WHEN target.CHR_U > 0 THEN (source.CHR_U + @Weapon_CHRBonus) ELSE target.CHR_U END
FROM _RefObjItem target
INNER JOIN _RefObjCommon targetCommon ON target.ID = targetCommon.Link
INNER JOIN @WeaponMapping wm ON targetCommon.CodeName128 = wm.TargetItem
INNER JOIN _RefObjCommon sourceCommon ON sourceCommon.CodeName128 = wm.SourceItem
INNER JOIN _RefObjItem source ON source.ID = sourceCommon.Link
PRINT 'Weapon itemleri güncellendi. Etkilenen kayıt sayısı: ' + CAST(@@ROWCOUNT AS NVARCHAR(10))
-- =====================================================
-- BÖLÜM 2: SHIELD (KALKAN) GÜNCELLEMELERİ
-- =====================================================
DECLARE @Shield_PDMultiplier FLOAT = 5
DECLARE @Shield_MDMultiplier FLOAT = 5
DECLARE @Shield_PDStrMultiplier FLOAT = 2.5
DECLARE @Shield_MDIntMultiplier FLOAT = 2.5
DECLARE @ShieldMapping TABLE (
SourceItem NVARCHAR(128),
TargetItem NVARCHAR(128)
)
INSERT INTO @ShieldMapping (SourceItem, TargetItem) VALUES
('ITEM_CH_SHIELD_14_C_RARE', 'ITEM_CH_SHIELD_14_C_RARE_LEGENDARY'),
('ITEM_EU_SHIELD_14_C_RARE', 'ITEM_EU_SHIELD_14_C_RARE_LEGENDARY')
PRINT 'Shield itemleri güncelleniyor...'
UPDATE target
SET
-- PD (truncate, target > 0)
target.PD_L = CASE WHEN target.PD_L > 0
THEN ROUND(CAST(source.PD_L + (source.PDInc * @Shield_PDMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PD_L END,
target.PD_U = CASE WHEN target.PD_U > 0
THEN ROUND(CAST(source.PD_U + (source.PDInc * @Shield_PDMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PD_U END,
-- MD (truncate, target > 0)
target.MD_L = CASE WHEN target.MD_L > 0
THEN ROUND(CAST(source.MD_L + (source.MDInc * @Shield_MDMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MD_L END,
target.MD_U = CASE WHEN target.MD_U > 0
THEN ROUND(CAST(source.MD_U + (source.MDInc * @Shield_MDMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MD_U END,
-- Reinforces (truncate, target > 0)
target.PDStr_L = CASE WHEN target.PDStr_L > 0
THEN ROUND(CAST(source.PDStr_L + (source.PDInc * @Shield_PDStrMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PDStr_L END,
target.PDStr_U = CASE WHEN target.PDStr_U > 0
THEN ROUND(CAST(source.PDStr_U + (source.PDInc * @Shield_PDStrMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PDStr_U END,
target.MDInt_L = CASE WHEN target.MDInt_L > 0
THEN ROUND(CAST(source.MDInt_L + (source.MDInc * @Shield_MDIntMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MDInt_L END,
target.MDInt_U = CASE WHEN target.MDInt_U > 0
THEN ROUND(CAST(source.MDInt_U + (source.MDInc * @Shield_MDIntMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MDInt_U END
FROM _RefObjItem target
INNER JOIN _RefObjCommon targetCommon ON target.ID = targetCommon.Link
INNER JOIN @ShieldMapping sm ON targetCommon.CodeName128 = sm.TargetItem
INNER JOIN _RefObjCommon sourceCommon ON sourceCommon.CodeName128 = sm.SourceItem
INNER JOIN _RefObjItem source ON source.ID = sourceCommon.Link
PRINT 'Shield itemleri güncellendi. Etkilenen kayıt sayısı: ' + CAST(@@ROWCOUNT AS NVARCHAR(10))
-- =====================================================
-- BÖLÜM 3: ARMOR (ZIRH) GÜNCELLEMELERİ
-- =====================================================
DECLARE @Armor_PDMultiplier FLOAT = 5
DECLARE @Armor_MDMultiplier FLOAT = 5
DECLARE @Armor_PDStrMultiplier FLOAT = 2.5
DECLARE @Armor_MDIntMultiplier FLOAT = 2.5
DECLARE @ArmorMapping TABLE (
SourceItem NVARCHAR(128),
TargetItem NVARCHAR(128)
)
INSERT INTO @ArmorMapping (SourceItem, TargetItem) VALUES
-- (Mapping listesi uzun olduğu için olduğu gibi bırakılmıştır)
('ITEM_CH_M_HEAVY_14_HA_C_RARE', 'ITEM_CH_M_HEAVY_14_HA_C_RARE_LEGENDARY')
-- ... (devamı sizdeki liste ile aynıdır)
;
PRINT 'Armor itemleri güncelleniyor...'
UPDATE target
SET
target.PD_L = CASE WHEN target.PD_L > 0
THEN ROUND(CAST(source.PD_L + (source.PDInc * @Armor_PDMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PD_L END,
target.PD_U = CASE WHEN target.PD_U > 0
THEN ROUND(CAST(source.PD_U + (source.PDInc * @Armor_PDMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PD_U END,
target.MD_L = CASE WHEN target.MD_L > 0
THEN ROUND(CAST(source.MD_L + (source.MDInc * @Armor_MDMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MD_L END,
target.MD_U = CASE WHEN target.MD_U > 0
THEN ROUND(CAST(source.MD_U + (source.MDInc * @Armor_MDMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MD_U END,
target.PDStr_L = CASE WHEN target.PDStr_L > 0
THEN ROUND(CAST(source.PDStr_L + (source.PDInc * @Armor_PDStrMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PDStr_L END,
target.PDStr_U = CASE WHEN target.PDStr_U > 0
THEN ROUND(CAST(source.PDStr_U + (source.PDInc * @Armor_PDStrMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PDStr_U END,
target.MDInt_L = CASE WHEN target.MDInt_L > 0
THEN ROUND(CAST(source.MDInt_L + (source.MDInc * @Armor_MDIntMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MDInt_L END,
target.MDInt_U = CASE WHEN target.MDInt_U > 0
THEN ROUND(CAST(source.MDInt_U + (source.MDInc * @Armor_MDIntMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MDInt_U END
FROM _RefObjItem target
INNER JOIN _RefObjCommon targetCommon ON target.ID = targetCommon.Link
INNER JOIN @ArmorMapping am ON targetCommon.CodeName128 = am.TargetItem
INNER JOIN _RefObjCommon sourceCommon ON sourceCommon.CodeName128 = am.SourceItem
INNER JOIN _RefObjItem source ON source.ID = sourceCommon.Link
PRINT 'Armor itemleri güncellendi. Etkilenen kayıt sayısı: ' + CAST(@@ROWCOUNT AS NVARCHAR(10))
-- =====================================================
-- BÖLÜM 4: ACCESSORY (AKSESUAR) GÜNCELLEMELERİ
-- =====================================================
DECLARE @Acc_PARMultiplier FLOAT = 5
DECLARE @Acc_MARMultiplier FLOAT = 5
DECLARE @AccessoryMapping TABLE (
SourceItem NVARCHAR(128),
TargetItem NVARCHAR(128)
)
INSERT INTO @AccessoryMapping (SourceItem, TargetItem) VALUES
('ITEM_EU_RING_14_C_RARE', 'ITEM_EU_RING_14_C_RARE_LEGENDARY'),
('ITEM_EU_EARRING_14_C_RARE', 'ITEM_EU_EARRING_14_C_RARE_LEGENDARY'),
('ITEM_EU_NECKLACE_14_C_RARE', 'ITEM_EU_NECKLACE_14_C_RARE_LEGENDARY'),
('ITEM_CH_RING_14_C_RARE', 'ITEM_CH_RING_14_C_RARE_LEGENDARY'),
('ITEM_CH_EARRING_14_C_RARE', 'ITEM_CH_EARRING_14_C_RARE_LEGENDARY'),
('ITEM_CH_NECKLACE_14_C_RARE', 'ITEM_CH_NECKLACE_14_C_RARE_LEGENDARY')
PRINT 'Accessory itemleri güncelleniyor...'
UPDATE target
SET
target.PAR_L = CASE WHEN target.PAR_L > 0
THEN ROUND(CAST(source.PAR_L + (source.PARInc * @Acc_PARMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PAR_L END,
target.PAR_U = CASE WHEN target.PAR_U > 0
THEN ROUND(CAST(source.PAR_U + (source.PARInc * @Acc_PARMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.PAR_U END,
target.MAR_L = CASE WHEN target.MAR_L > 0
THEN ROUND(CAST(source.MAR_L + (source.MARInc * @Acc_MARMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MAR_L END,
target.MAR_U = CASE WHEN target.MAR_U > 0
THEN ROUND(CAST(source.MAR_U + (source.MARInc * @Acc_MARMultiplier) AS DECIMAL(18,6)), 2, 1)
ELSE target.MAR_U END
FROM _RefObjItem target
INNER JOIN _RefObjCommon targetCommon ON target.ID = targetCommon.Link
INNER JOIN @AccessoryMapping acc ON targetCommon.CodeName128 = acc.TargetItem
INNER JOIN _RefObjCommon sourceCommon ON sourceCommon.CodeName128 = acc.SourceItem
INNER JOIN _RefObjItem source ON source.ID = sourceCommon.Link
PRINT 'Accessory itemleri güncellendi. Etkilenen kayıt sayısı: ' + CAST(@@ROWCOUNT AS NVARCHAR(10))
PRINT ''
PRINT '====================================================='
PRINT 'TÜM GÜNCELLEMELER TAMAMLANDI! - vSro.Blog'
PRINT '====================================================='
🚀 Uygulama Adımları
- İlgili database için tam yedek alın
- İsterseniz bölümleri tek tek, isterseniz tamamını tek seferde çalıştırın
- Script tamamlandıktan sonra server modüllerini yeniden başlatın
- Oyunda +2/+3/+4/+5 basma farklarını test ederek ince ayar yapın
✅ Fix Sonucu
- ✔️ + basma farkları kontrollü hale gelir
- ✔️ Weapon/Shield/Armor/Accessory balansları tek merkezden yönetilir
- ✔️ Multiplier ve sabit bonus sistemi ile istediğiniz düzene kolayca ulaşırsınız
⚠️ Önemli Uyarılar
- Script, codename mapping mantığı ile çalıştığı için TargetItem isimlerinin doğru olduğundan emin olun
- Yanlış çarpanlar PvP dengesini bozabilir; küçük adımlarla test ederek ilerleyin
- Canlı sunucuda uygulamadan önce test DB’de denenmesi önerilir
🧷 Not
Multiplier değerleri tamamen size bağlıdır. Önerilen yöntem: küçük çarpanlarla başlayıp test ederek artırmaktır.
🔒 Telif & Paylaşım
Bu konu vSro.Blog için özel olarak hazırlanmıştır. İzinsiz kopyalanması veya başka forumlarda paylaşılması yasaktır.



