- #1
Konu Sahibi
: serkankacan
[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
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
- Oyuncu son mobu kesip veya görevi verip 100 Level olduğunda sunucu `_AddLogChar` tablosuna 22 numaralı eventi gönderir.
- Prosedür anında çalışır; karakterin daha önce bu ödülü alıp almadığını kontrol eder.
- Karakter listede yoksa sırasını hesaplar (1., 2., ... 100.), sıralamasına denk gelen Silk miktarını hesabına yükler.
- 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!

