- #1
Konu Sahibi
: serkankacan
[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ü
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
25580değeri Chaos Arena'nın örnek RegionID değeridir. Kendi sunucunuzdaki arena bölgesinin ID'siyle değiştirmeyi unutmayınız.ITEM_SILKROADPVP_HAMMERalanına sunucunuzdaki özel etkinliğin eşya kodunu yazınız.- _Items Tablosu Temizliği: Eşya silinirken sadece slot
0yapı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?
- Yukarıdaki kod bloklarını ilgili prosedürlere (
Log_Teleportve_AddLogChar) ekleyip F5 (Execute) ile derleyin. - Oyuna bir test karakteriyle girip belirlenen Region'a (
25580) ışınlanın. - Çantanıza balyozun geldiğini ve ekranda yeşil renkle bildirim mesajının belirdiğini doğrulayın.
- Şehre geri ışınlanın; çantanızdaki balyozun silindiğini ve SQL'de
_Itemstablosunda 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!

