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

vSro Paylaşım vSRO GiftBox (Hediye Kutusu / Kasa Açma) Scroll Sistemi

Cevaplar0
Görüntüleme7
Ticaret Puanı
0
Katılım
8 Eyl 2026
Mesajlar
88
Tepkime puanı
1
Puanları
0
Mevcut Bakiye
2960 ₺
[REHBER & SİSTEM] vSRO GiftBox (Hediye Kutusu / Kasa Açma) Scroll Sistemi
_AddLogItem Tetikleyicisi ve Rastgele Ödül Havuzu Üzerinden Çantaya Otomatik İtem Tanımlama



Merhaba değerli forum sakinleri,

Silkroad Online sunucularında oyuncuların moblardan, etkinliklerden veya Silk mağazasından elde ettikleri **GiftBox (Hediye Sandığı / Şans Kutusu)** eşyasına sağ tıkladıklarında, çantasındaki ilk boş slota rastgele belirlenen ödül havuzundan bir eşya kazandıran stabil sistemi paylaşıyoruz.

Aşağıda paylaşılan prosedür; oyuncunun çantasında boş yer olup olmadığını kontrol eder, belirlenen hediye havuzundan rastgele bir eşya seçer, `_Items` ve `_Inventory` tablolarına hatasız işler ve bellek senkronizasyonu için karakteri güvenle oyundan düşürür (DC eder).

Önemli Sistem Kuralları' Alıntı:
DİKKAT:
  • Karakterin çantasında en az **1 adet boş slot** bulunması zorunludur. Çantası tamamen dolu olan oyuncuların kutuyu boşa tüketmesi engellenmiştir.
  • Yeni üretilen eşyanın çantada anında parlaması ve GameServer hafızasıyla çakışmaması için oyuncu kutuyu açtığı anda otomatik olarak DC edilir.
  • Ödül listesini ve oranlarını prosedür içerisindeki [@RewardPool] geçici tablosundan dilediğiniz gibi çoğaltabilirsiniz.
  • İşlem öncesinde SRO_VT_LOG ve SRO_VT_SHARD yedeklerinizi almayı unutmayınız.



1. ADIM: _GIFT_BOX_OPEN Prosedürünü Oluşturma

SRO_VT_LOG
veritabanını seçip aşağıdaki ana hediye dağıtıcı motor prosedürünü okutun:

SQL:
USE [SRO_VT_LOG]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE OR ALTER PROCEDURE dbo._GIFT_BOX_OPEN
    @CharID INT
AS
BEGIN
    SET NOCOUNT ON;

    -- 1. Çantadaki ilk boş slotu tespit et (Slot 13 ile 108 arası standart çanta)
    DECLARE @EmptySlot INT = (
        SELECT TOP 1 Slot 
        FROM SRO_VT_SHARD.dbo._Inventory WITH (NOLOCK)
        WHERE CharID = @CharID 
          AND Slot BETWEEN 13 AND 108 
          AND ItemID = 0 
        ORDER BY Slot ASC
    )

    -- Eğer çantada boş slot yoksa işlemi durdur (İtem heba olmasın)
    IF (@EmptySlot IS NULL)
        RETURN;

    -- 2. Hediye Eşya Havuzunu Tanımla (Rastgele Seçim)
    -- Buraya kutudan çıkmasını istediğiniz eşyaların RefItemID değerlerini ve adetlerini yazın:
    DECLARE @RewardPool TABLE (
        RowID INT IDENTITY(1,1),
        RefItemID INT,
        ItemCount INT
    )

    INSERT INTO @RewardPool (RefItemID, ItemCount) VALUES
    (24414, 1), -- Örnek 1: Devil Spirit B
    (3848, 11), -- Örnek 2: Global Chatting (11 Adet)
    (3696, 5),  -- Örnek 3: Reverse Return Scroll (5 Adet)
    (3854, 1),  -- Örnek 4: Extension Gear (Pet Süre Uzatıcı)
    (3752, 1)   -- Örnek 5: Sabun / Özel Elixir

    -- Havuzdan rastgele 1 adet ödül seç
    DECLARE @RandomID INT
    SELECT TOP 1 @RandomID = RowID FROM @RewardPool ORDER BY NEWID()

    DECLARE @SelectedRefItemID INT
    DECLARE @SelectedCount INT

    SELECT 
        @SelectedRefItemID = RefItemID, 
        @SelectedCount = ItemCount 
    FROM @RewardPool 
    WHERE RowID = @RandomID

    -- 3. Yeni Eşyayı _Items Tablosuna Ekle
    DECLARE @NewItemID64 BIGINT

    INSERT INTO SRO_VT_SHARD.dbo._Items (
        RefItemID, OptLevel, Variance, Data, MagParamNum, 
        MagParam1, MagParam2, MagParam3, MagParam4, MagParam5, 
        MagParam6, MagParam7, MagParam8, MagParam9, MagParam10, 
        MagParam11, MagParam12
    )
    VALUES (
        @SelectedRefItemID, 0, 0, @SelectedCount, 0, 
        NULL, NULL, NULL, NULL, NULL, 
        NULL, NULL, NULL, NULL, NULL, 
        NULL, NULL
    )

    SET @NewItemID64 = SCOPE_IDENTITY()

    -- 4. Eşyayı Çantanın Boş Slotuna Yerleştir
    UPDATE SRO_VT_SHARD.dbo._Inventory
    SET ItemID = @NewItemID64
    WHERE CharID = @CharID 
      AND Slot = @EmptySlot

    -- 5. KRİTİK: İtemin görünmesi ve bellek eşitliği için karakteri güvenle DC et
    UPDATE SRO_VT_SHARD.dbo._User 
    SET Sec_Primary = 1 
    WHERE CharID = @CharID
END
GO



2. ADIM: _AddLogItem Tetikleyicisine Bağlama

SRO_VT_LOG
içerisindeki **_AddLogItem** prosedürünü açarak (Modify) AS satırının hemen altına tetikleyici bloğunu ekleyin:

SQL:
-- ===================================================================
-- GIFT BOX (ŞANS KUTUSU) TETİKLEYİCİSİ
-- @Operation = 41 (Eşya Tüketimi)
-- 78036 (Kullandığınız GiftBox Scroll RefItemID Değeri)
-- ===================================================================
IF (@Operation = 41 AND @ItemRefID = 78036)
BEGIN
    EXEC SRO_VT_LOG.dbo._GIFT_BOX_OPEN @CharID
END



Nasıl Test Edilir?

  1. SQL prosedürünü Management Studio üzerinden derleyin (F5 / Execute).
  2. Çantanızda en az 1 slot boşluk bulunduğundan emin olun.
  3. 78036 ID'li GiftBox eşyasına sağ tıklayarak kullanın.
  4. Karakteriniz anında oyundan düşecektir (Disconnect).
  5. Oyuna tekrar girdiğinizde çantanızdaki ilk boş alana havuzdan rastgele çıkan ödül eşyasının başarıyla eklendiğini göreceksiniz.

Sorularınızı ve eklemek istediğiniz özel kutu konseptlerini konu altından iletebilirsiniz. Herkese bol şans ve keyifli geliştirmeler!
 

Konuyu görüntüleyenler

Yükleniyor...
Yükleniyor...
Etiketler
Etiketler Etiketler
gift box item prosedür sql vsro
Şu anda sitemizde 40,332 Aktif Kullanıcı
Çevrimiçi üyeler
Konular 1,311
Mesajlar 4,191
Kullanıcılar 1,624
Son üye mrt
Geri
Üst