- #1
Konu Sahibi
: serkankacan
[SİSTEM & ETKİNLİK] vSRO Max Level İlk 100/110 Oyuncuya Otomatik Ödül Sistemi
_AddLogChar Üzerinden Seviye Sınırına Ulaşan İlk Oyunculara İstismarsız (Anti De-Level) Otomatik Ödül Dağıtımı
_AddLogChar Üzerinden Seviye Sınırına Ulaşan İlk Oyunculara İstismarsız (Anti De-Level) Otomatik Ödül Dağıtımı
Merhaba değerli forum sakinleri,
Yeni açılan sunucularda rekabeti ve kasılma hırsını artırmak amacıyla en çok tercih edilen sistemlerin başında **Max Level Yarışı (İlk X Kişiye Ödül)** gelir. Oyuncu belirlenen tavan seviyeye (Örn: 80, 90, 100, 110 Cap) ulaştığı an sistem otomatik olarak ödülünü envanterine tanımlar ve duyuru geçer.
İnternette paylaşılan eski sorgularda
sec_content hatalı kullanıldığı için normal oyuncular ödül alamamakta, üstelik oyuncular 109'a düşüp tekrar 110 olarak sistemi sonsuz eşya/silk buguna sokabilmektedir.Aşağıda paylaşılan optimize sistem;
- Oyuncunun ödülü daha önce alıp almadığını kontrol ederek **De-Level (seviye düşüp tekrar alma) bugunu %100 engeller**,
- Belirlediğiniz kişi kotası (Örn: **İlk 100 kişi**) dolduğunda ödül dağıtımını otomatik olarak durdurur,
- Tüm ödül alan karakterleri tarih ve sıralama bilgisiyle ayrı bir log tablosunda saklar.
Teknik Bilgilendirme (Event ID)' Alıntı:
- _AddLogChar EventID = 22: Karakterin seviye atladığını (Level Up) belirten Joymax sistem log kodudur.
- @data2: Karakterin atladığı yeni seviyedir (Örn: 110).
- İşlem öncesinde SRO_VT_LOG ve SRO_VT_SHARD yedeklerinizi alınız.
1. ADIM: Ödül Takip Tablosunu Oluşturma
Ödül alanların kaydını tutmak ve tekrar almalarını önlemek için SRO_VT_SHARD üzerinde şu tabloyu oluşturun:
SQL:
USE [SRO_VT_SHARD]
GO
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = '_MaxLevelRewards')
BEGIN
CREATE TABLE dbo._MaxLevelRewards (
ID INT IDENTITY(1,1) PRIMARY KEY,
CharID INT NOT NULL,
CharName VARCHAR(16) NOT NULL,
RewardOrder INT NOT NULL,
ReachLevel INT NOT NULL,
RewardDate DATETIME DEFAULT GETDATE()
)
PRINT 'Ödül takip tablosu (_MaxLevelRewards) başarıyla oluşturuldu.'
END
2. ADIM: _AddLogChar Prosedürüne Eklenecek Kod
SRO_VT_LOG veritabanındaki **[_AddLogChar]** prosedürünü açın (
Modify) ve AS satırının hemen altına aşağıdaki bloğu ekleyin:
SQL:
-- ===================================================================
-- MAX LEVEL ÖDÜL SİSTEMİ (İLK 100 KİŞİ)
-- @EventID = 22: Level Atlaması
-- @data2: Yeni ulaşılan seviye (Örn: 110)
-- ===================================================================
IF (@EventID = 22 AND @data2 = 110)
BEGIN
DECLARE @MaxRewardLimit INT = 100 -- Ödül verilecek toplam kişi sayısı (Kota)
DECLARE @TargetLevel INT = 110 -- Hedef seviye
-- 1. Bu karakter daha önce bu seviyenin ödülünü aldı mı? (De-Level Bug Fix)
IF NOT EXISTS (SELECT 1 FROM SRO_VT_SHARD.dbo._MaxLevelRewards WITH (NOLOCK) WHERE CharID = @CharID AND ReachLevel = @TargetLevel)
BEGIN
-- 2. Şu ana kadar ödülü kaç kişi aldı?
DECLARE @CurrentRewardCount INT = (SELECT COUNT(1) FROM SRO_VT_SHARD.dbo._MaxLevelRewards WITH (NOLOCK) WHERE ReachLevel = @TargetLevel)
-- 3. Kota dolmadıysa ödülü ver
IF (@CurrentRewardCount < @MaxRewardLimit)
BEGIN
DECLARE @RewardOrder INT = @CurrentRewardCount + 1
DECLARE @WinnerCharName VARCHAR(16) = (SELECT CharName16 FROM SRO_VT_SHARD.dbo._Char WITH (NOLOCK) WHERE CharID = @CharID)
-- Ödülü Çantaya Gönder (Örn: 50 Adet Arena Coin)
EXEC SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @WinnerCharName, 'ITEM_ETC_ARENA_COIN', 50, 0
-- Tabloya Başarıyla Kaydet (Tekrar almasını engeller)
INSERT INTO SRO_VT_SHARD.dbo._MaxLevelRewards (CharID, CharName, RewardOrder, ReachLevel)
VALUES (@CharID, @WinnerCharName, @RewardOrder, @TargetLevel)
END
END
END
3. ADIM: Ödül Kazananları Görüntüleme (Yönetici Sorgusu)
Sunucunuzda seviye ödülünü kazanan oyuncuları sıralı liste halinde görmek için:
SQL:
USE [SRO_VT_SHARD]
GO
SELECT
RewardOrder AS [Sıralama],
CharName AS [Karakter Adı],
ReachLevel AS [Ulaşılan Seviye],
RewardDate AS [Ödül Alınma Tarihi]
FROM dbo._MaxLevelRewards WITH (NOLOCK)
ORDER BY RewardOrder ASC
Nasıl Test Edilir?
- Tabloyu ve prosedürü derledikten sonra oyuna bir test karakteriyle girin.
- Karakteri
109seviyeye getirin ve canavar keserek110seviyeye atlatın. - Çantanıza ödülün geldiğini ve
_MaxLevelRewardstablosuna kaydınızın 1. sıra olarak düştüğünü doğrulayın. - Karakterle canavara ölüp 109'a düşün ve tekrar 110 olun; sistemin de-level kontrolü sayesinde ikinci kez ödül vermediğini test edin.
Sorularınızı ve ek ödül fikirlerinizi konu altından iletebilirsiniz. Herkese keyifli geliştirmeler!

