- #1
Konu Sahibi
: serkankacan
[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
_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?
- SQL prosedürünü Management Studio üzerinden derleyin (F5 / Execute).
- Çantanızda en az 1 slot boşluk bulunduğundan emin olun.
78036ID'li GiftBox eşyasına sağ tıklayarak kullanın.- Karakteriniz anında oyundan düşecektir (Disconnect).
- 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!

