İçeriğe geç
Türkiye'nin SRO tanıtım & topluluk platformu

vSro Paylaşım vSRO KGuardEDGE Chaos Bölgesine Girişte Eşya Verme ve Çıkışta Temizlem

Cevaplar0
Görüntüleme3
Ticaret Puanı
0
Katılım
8 Eyl 2026
Mesajlar
88
Tepkime puanı
1
Puanları
0
Mevcut Bakiye
2960 ₺
[REHBER & SİSTEM] vSRO KGuardEDGE Chaos Bölgesine Girişte Eşya Verme ve Çıkışta Temizleme
Log_Teleport ve _AddLogChar Üzerinden Otomatik Chaos Balyozu (Hammer) Tanımlama ve Güvenli Silme Prosedürü



Merhaba değerli forum sakinleri,

Silkroad Online sunucularında özel etkinlik alanlarında (Chaos Arena, Survival Arena, PvP Event vb.) oyuncular içeri girdiği anda geçici bir etkinlik eşyası (örneğin **Chaos Hammer / Balyoz**) almasını; etkinlik bittiğinde veya oyuncu arenadan çıktığında bu eşyanın envanterinden **arkasında yetim kayıt bırakmadan** silinmesini isteyebilirsiniz.

İnternette paylaşılan eski kodlarda `else` şartı hatalı kurgulandığı için oyuncu her teleport olduğunda sorgu çalışır, ayrıca `_Items` tablosundan silme yapılmadığı için veritabanında gereksiz şişme yaşanır.

Aşağıda paylaşılan optimize sistem sayesinde;
  • Oyuncu Chaos bölgesine girdiği an envanterine balyoz tanımlanır ve ekrana bildirim mesajı iletilir.
  • Oyuncu bölgeden ayrıldığında veya etkinlik sonlandığında (EventID = 5) balyoz hem `_Inventory` hem de `_Items` tablosundan eksiksiz temizlenir.

Kritik Envanter & Bölge Uyarısı' Alıntı:
DİKKAT:
  • Kodlardaki 25580 değeri Chaos Arena'nın örnek RegionID değeridir. Kendi sunucunuzdaki arena bölgesinin ID'siyle değiştirmeyi unutmayınız.
  • ITEM_SILKROADPVP_HAMMER alanına sunucunuzdaki özel etkinliğin eşya kodunu yazınız.
  • _Items Tablosu Temizliği: Eşya silinirken sadece slot 0 yapılmaz, `_Items` tablosundaki `ID64` satırı da temizlenir; böylece veritabanınız gereksiz şişmez.
  • İşlem öncesinde KGuardEDGE ve SRO_VT_SHARD yedeklerinizi alınız.



1. ADIM: Log_Teleport Prosedürüne Eklenecek Kod

KGuardEDGE
veritabanındaki **[Log_Teleport]** prosedürünü açın (Modify) ve en altına (END satırının hemen önüne) aşağıdaki bloğu ekleyin:

SQL:
-- ===================================================================
-- CHAOS ARENA BÖLGESİ GİRİŞ - ÇIKIŞ KONTROLÜ
-- 25580: Chaos Arena RegionID (Örnektir, kendinize göre düzenleyin)
-- ===================================================================

-- 1. BÖLGEYE GİRİŞ YAPILDIĞINDA (Eşya Ver + Bildirim Gönder)
IF (@TargetRegionID = 25580 AND @CurrentRegionID != 25580)
BEGIN
    -- Eşyayı Çantaya Gönder
    EXEC SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @CharName, 'ITEM_SILKROADPVP_HAMMER', 1, 0

    -- KGuard Ekran Bildirimleri
    INSERT INTO KGuardEDGE.dbo._DeveloperCommands (Cmd, Data1, Data2, Data3) 
    VALUES ('private_sendturkishnote', @CharName, 'Envanterine gelen Chaos Hammer ile rakiplerine meydan oku! Hızlı olan kazanır.', '#10F280')

    INSERT INTO KGuardEDGE.dbo._DeveloperCommands (Cmd, Data1, Data2, Data3) 
    VALUES ('private_sendenglishnote', @CharName, 'Challenge your opponents using the Chaos Hammer sent to your inventory!', '#10F280')
END

-- 2. BÖLGEDEN AYRILINDIĞINDA (Yalnızca Arenadan Çıkış Yapılıyorsa Eşyayı Sil)
ELSE IF (@CurrentRegionID = 25580 AND @TargetRegionID != 25580)
BEGIN
    -- Karakterin üzerindeki balyoz eşyalarının ID64 listesini al
    DECLARE @DeletedHammerItems TABLE (ItemID64 BIGINT)

    INSERT INTO @DeletedHammerItems (ItemID64)
    SELECT INV.ItemID
    FROM SRO_VT_SHARD.dbo._Inventory INV WITH (NOLOCK)
    INNER JOIN SRO_VT_SHARD.dbo._Items I WITH (NOLOCK) ON INV.ItemID = I.ID64
    INNER JOIN SRO_VT_SHARD.dbo._RefObjCommon ROC WITH (NOLOCK) ON I.RefItemID = ROC.ID
    WHERE INV.CharID = @CharID
      AND ROC.CodeName128 = 'ITEM_SILKROADPVP_HAMMER'
      AND INV.ItemID > 0

    -- Envanter yuvasını sıfırla
    UPDATE SRO_VT_SHARD.dbo._Inventory
    SET ItemID = 0
    WHERE CharID = @CharID
      AND ItemID IN (SELECT ItemID64 FROM @DeletedHammerItems)

    -- _Items tablosundaki fiziksel eşya satırını temizle (Yetim kayıt kalmaz)
    DELETE FROM SRO_VT_SHARD.dbo._Items
    WHERE ID64 IN (SELECT ItemID64 FROM @DeletedHammerItems)
END



2. ADIM: _AddLogChar Prosedürüne Eklenecek Kod (Etkinlik Bitişi)

Etkinlik süresi bittiğinde (EventID tetiklendiğinde) arenadaki karakterlerin çantasında balyoz kalmaması için SRO_VT_LOG.._AddLogChar prosedürüne aşağıdaki bloğu ekleyin:

SQL:
-- ===================================================================
-- CHAOS ETKİNLİK BİTİŞ TETİKLEYİCİSİ
-- 5: KGuardEDGE Etkinlik ID Karşılığıdır (Kendi panelinize göre düzenleyin)
-- ===================================================================
IF (@EventID = 5)
BEGIN
    DECLARE @EventHammerItems TABLE (ItemID64 BIGINT)

    INSERT INTO @EventHammerItems (ItemID64)
    SELECT INV.ItemID
    FROM SRO_VT_SHARD.dbo._Inventory INV WITH (NOLOCK)
    INNER JOIN SRO_VT_SHARD.dbo._Items I WITH (NOLOCK) ON INV.ItemID = I.ID64
    INNER JOIN SRO_VT_SHARD.dbo._RefObjCommon ROC WITH (NOLOCK) ON I.RefItemID = ROC.ID
    WHERE INV.CharID = @CharID
      AND ROC.CodeName128 = 'ITEM_SILKROADPVP_HAMMER'
      AND INV.ItemID > 0

    -- Yuvaları temizle
    UPDATE SRO_VT_SHARD.dbo._Inventory
    SET ItemID = 0
    WHERE CharID = @CharID
      AND ItemID IN (SELECT ItemID64 FROM @EventHammerItems)

    -- Fiziksel eşyayı sil
    DELETE FROM SRO_VT_SHARD.dbo._Items
    WHERE ID64 IN (SELECT ItemID64 FROM @EventHammerItems)
END



Nasıl Test Edilir?

  1. Yukarıdaki kod bloklarını ilgili prosedürlere (Log_Teleport ve _AddLogChar) ekleyip F5 (Execute) ile derleyin.
  2. Oyuna bir test karakteriyle girip belirlenen Region'a (25580) ışınlanın.
  3. Çantanıza balyozun geldiğini ve ekranda yeşil renkle bildirim mesajının belirdiğini doğrulayın.
  4. Şehre geri ışınlanın; çantanızdaki balyozun silindiğini ve SQL'de _Items tablosunda yetim satır bırakmadığını kontrol edin.

Sorularınızı ve farklı etkinlik mekaniği taleplerinizi konu altından paylaşabilirsiniz. Herkese keyifli geliştirmeler!
 

Konuyu görüntüleyenler

Yükleniyor...
Yükleniyor...
Şu anda sitemizde 40,335 Aktif Kullanıcı
Çevrimiçi üyeler
Konular 1,311
Mesajlar 4,191
Kullanıcılar 1,624
Son üye mrt
Geri
Üst