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

vSro Paylaşım vSRO Otomatik Max Level Ödül Sistemi (Top 100 Silk Ödülü)

Cevaplar0
Görüntüleme6
Ticaret Puanı
0
Katılım
8 Eyl 2026
Mesajlar
88
Tepkime puanı
1
Puanları
0
Mevcut Bakiye
2960 ₺
[SİSTEM & REHBER] vSRO Otomatik Max Level Ödül Sistemi (Top 100 Silk Ödülü)
AddLogChar Tetikleyicisi Üzerinden Hedef Seviyeye İlk Ulaşanlara Sıralamalı Silk ve Notice Sistemi



Merhaba değerli forum sakinleri,

Yeni açılan sunucularda rekabeti artırmak amacıyla oyuncular son seviyeye (Örn: 80, 90, 100 veya 110 Cap) ulaştıklarında ilk 100 oyuncuya sıralamalarına göre kademeli Silk ödülü vermek ve oyundan otomatik notice geçirmek istenir.

Aşağıda; SQL sözdizimi hataları giderilmiş, kayıt sırasını garantileyen tablo yapısı, prosedür ve _AddLogChar entegrasyonu eksiksiz olarak hazırlanmıştır.

Önemli Uyarı' Alıntı:
DİKKAT:
  • Bu sistem SRO_VT_LOG içerisindeki _AddLogChar prosedürünün @EventID = 22 (Level Up Logu) parametresini kullanır.
  • Duyuru kısmı standart olarak MaxiGuard tablosuna (MaxiGuard_User.._BridgeCommands) göre ayarlanmıştır. Farklı bir guard kullanıyorsanız ilgili notice satırını kendi guardınızın notice tablosuna göre düzenleyebilirsiniz.
  • İşlem öncesinde SRO_VT_LOG ve SRO_VT_ACCOUNT yedeklerinizi almayı unutmayınız.



1. ADIM: Log Tablosunu Oluşturma

SQL Management Studio üzerinde SRO_VT_LOG veritabanını seçip aşağıdaki tablo sorgusunu okutun:

SQL:
USE [SRO_VT_LOG]
GO

IF OBJECT_ID('dbo._EventMaxLevelChar', 'U') IS NOT NULL
    DROP TABLE dbo._EventMaxLevelChar
GO

CREATE TABLE dbo._EventMaxLevelChar(
    [ID] INT IDENTITY(1,1) NOT NULL,
    [UserJID] INT NULL,
    [CharID] INT NULL,
    [CharName] VARCHAR(16) NULL,
    [Sira] INT NULL,
    [SilkAmount] INT NULL,
    [Active] INT DEFAULT 0,
    [Zaman] DATETIME DEFAULT GETDATE(),
    CONSTRAINT [PK__EventMaxLevelChar] PRIMARY KEY CLUSTERED ([ID] ASC)
)
GO



2. ADIM: _EventMaxLevel Prosedürünü Oluşturma

Sıralamayı belirleyen ve ödülü SK_Silk tablosuna ekleyen ana prosedür:

SQL:
USE [SRO_VT_LOG]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

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

    DECLARE @Charname16 VARCHAR(16)
    DECLARE @JID INT

    -- Karakter ve Kullanıcı JID Bilgisini Çek
    SELECT @Charname16 = C.CharName16, @JID = U.UserJID
    FROM SRO_VT_SHARD.dbo._Char AS C
    INNER JOIN SRO_VT_SHARD.dbo._User AS U ON C.CharID = U.CharID
    WHERE C.CharID = @CharID

    DECLARE @EventLevel INT = 100 -- Hedef Seviye Sınırı (Cap)

    -- Karakter daha önce bu ödülü almadıysa işleme başla
    IF NOT EXISTS (SELECT 1 FROM dbo._EventMaxLevelChar WHERE CharID = @CharID)
    BEGIN
        -- Mevcut kayıtlı kişi sayısına göre sıralamayı hesapla
        DECLARE @Sira INT = (SELECT COUNT(ID) FROM dbo._EventMaxLevelChar) + 1

        -- Sadece ilk 100 kişiyi ödüllendir
        IF (@Sira <= 100)
        BEGIN
            DECLARE @SilkAmount INT = 0

            -- Kademeli Silk Ödül Dağılımı
            IF (@Sira = 1)                 SET @SilkAmount = 300
            ELSE IF (@Sira BETWEEN 2 AND 10)   SET @SilkAmount = 200
            ELSE IF (@Sira BETWEEN 11 AND 20)  SET @SilkAmount = 140
            ELSE IF (@Sira BETWEEN 21 AND 30)  SET @SilkAmount = 130
            ELSE IF (@Sira BETWEEN 31 AND 40)  SET @SilkAmount = 120
            ELSE IF (@Sira BETWEEN 41 AND 50)  SET @SilkAmount = 110
            ELSE IF (@Sira BETWEEN 51 AND 60)  SET @SilkAmount = 100
            ELSE IF (@Sira BETWEEN 61 AND 70)  SET @SilkAmount = 90
            ELSE IF (@Sira BETWEEN 71 AND 80)  SET @SilkAmount = 80
            ELSE IF (@Sira BETWEEN 81 AND 90)  SET @SilkAmount = 70
            ELSE IF (@Sira BETWEEN 91 AND 100) SET @SilkAmount = 60

            -- Tabloya kayıt aç
            INSERT INTO dbo._EventMaxLevelChar (UserJID, CharID, CharName, Sira, SilkAmount, Active, Zaman)
            VALUES (@JID, @CharID, @Charname16, @Sira, @SilkAmount, 1, GETDATE())

            -- Silk Yükleme İşlemi (SK_Silk)
            IF EXISTS (SELECT 1 FROM SRO_VT_ACCOUNT.dbo.SK_Silk WHERE JID = @JID)
            BEGIN
                UPDATE SRO_VT_ACCOUNT.dbo.SK_Silk 
                SET silk_own = silk_own + @SilkAmount 
                WHERE JID = @JID
            END
            ELSE
            BEGIN
                INSERT INTO SRO_VT_ACCOUNT.dbo.SK_Silk (JID, silk_own, silk_gift, silk_point) 
                VALUES (@JID, @SilkAmount, 0, 0)
            END

            -- MaxiGuard Notice Bildirimi
            DECLARE @Message NVARCHAR(500) = '[' + CAST(@Sira AS VARCHAR(5)) + ']. Karakter ' + CAST(@EventLevel AS VARCHAR(5)) + ' Seviyeye Ulaştı: [' + @Charname16 + '] ' + CAST(@SilkAmount AS VARCHAR(10)) + ' Silk Kazandı!'
            
            INSERT INTO MaxiGuard_User.._BridgeCommands (CommandID, Executor, Data1, Data2, Data3, [Date])
            VALUES (500, 'Sistem', '17', @Message, 'Duyuru', GETDATE())

            -- 100. Kişiye Ulaşıldığında Etkinlik Bitiş Notice'i
            IF (@Sira = 100)
            BEGIN
                DECLARE @EndMsg NVARCHAR(500) = 'TOP 100 (' + CAST(@EventLevel AS VARCHAR(5)) + ' Cap) Seviye Etkinliği Tamamlanmıştır.'
                INSERT INTO MaxiGuard_User.._BridgeCommands (CommandID, Executor, Data1, Data2, Data3, [Date])
                VALUES (500, 'Sistem', '17', @EndMsg, 'Duyuru', GETDATE())
            END
        END
    END
END
GO



3. ADIM: _AddLogChar Tetikleyicisini Bağlama

SRO_VT_LOG
veritabanında yer alan _AddLogChar prosedürünü açın (Modify) ve AS satırının hemen altına şu bloğu ekleyin:

SQL:
-- ===================================================================
-- MAX LEVEL LOG TETİKLEYİCİSİ
-- @Data2: Karakterin ulaştığı yeni leveli temsil eder (Örn: 100)
-- ===================================================================
IF (@EventID = 22 AND @Data2 = 100)
BEGIN
    EXEC dbo._EventMaxLevel @CharID
END



Sistemin İşleyişi

  1. Oyuncu son mobu kesip veya görevi verip 100 Level olduğunda sunucu `_AddLogChar` tablosuna 22 numaralı eventi gönderir.
  2. Prosedür anında çalışır; karakterin daha önce bu ödülü alıp almadığını kontrol eder.
  3. Karakter listede yoksa sırasını hesaplar (1., 2., ... 100.), sıralamasına denk gelen Silk miktarını hesabına yükler.
  4. Tüm sunucuya oyuncunun kaçıncı olduğunu ve kazandığı Silk miktarını sarı notice ile duyurur.

Sorularınızı ve farklı guard sistemleri için notice uyarlamalarını konu altından sorabilirsiniz. Herkese bol rekabetli sezonlar!
 

Konuyu görüntüleyenler

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