Merhabalar değerli SilkroadPortal üyeleri,
Bu konu içerisinde sizlerle, MaxiGuard altyapısı kullanılarak hazırlanmış olan
Lucky Global Event sistemini paylaşacağım.
Bu etkinlik sayesinde, event süresi boyunca global atan oyuncular arasından
rastgele bir kazanan seçilir ve otomatik olarak ödüllendirilir.
Başka bir rehberde görüşmek üzere, herkese iyi forumlar.
NOT:
Paylaşılan tablolar ve prosedürler benim SYSTEM veritabanımda oluşturulmuştur.
Siz farklı bir DB yapısı kullanıyorsanız (ör. SHARD / ACCOUNT), ilgili kısımları
kendinize göre düzenlemeyi unutmayın.
Bu tablo, Lucky Global eventinin aktif olup olmadığını kontrol etmek için kullanılır.
SQL:
USE SRO_VT_SYSTEM;
GO
CREATE TABLE dbo._EventStatus (
EventName VARCHAR(50) NOT NULL,
Registration TINYINT NOT NULL,
Service TINYINT NOT NULL
);
Event süresi boyunca atılan global mesajlar bu tabloda tutulur.
SQL:
USE SRO_VT_SYSTEM;
GO
CREATE TABLE dbo._LuckyGlobalLog (
Idx INT IDENTITY(1,1) PRIMARY KEY,
CharName16 VARCHAR(16) NOT NULL,
Message VARCHAR(255) NOT NULL,
Date DATETIME DEFAULT GETDATE() NOT NULL
);
Bu trigger, event aktif olduğu sürece atılan global mesajları otomatik olarak loglar.
SQL:
USE [MaxiGuard_User];
GO
CREATE TRIGGER dbo._GlobalLogs
ON dbo._GlobalLog
AFTER INSERT
AS
BEGIN
IF EXISTS (
SELECT 1
FROM SRO_VT_SYSTEM.._EventStatus
WHERE EventName = 'LuckyGlobal' AND Service = 1
)
BEGIN
INSERT INTO SRO_VT_SYSTEM.._LuckyGlobalLog (CharName16, Message, Date)
SELECT CharName16, Message, GETDATE()
FROM inserted;
END
END;
Bu prosedür eventi başlatır, logları sıfırlar ve başlangıç duyurularını atar.
SQL:
USE SRO_VT_SYSTEM;
GO
CREATE PROCEDURE dbo._Event_LuckyGlobal
AS
BEGIN
SET NOCOUNT ON;
UPDATE _EventStatus
SET Service = 1
WHERE EventName = 'LuckyGlobal';
TRUNCATE TABLE _LuckyGlobalLog;
INSERT INTO MaxiGuard_User.._BridgeCommands
(CommandID, Executor, Data1, Data2, Date)
VALUES (500, 'ff0000', 17,
'[Lucky Global] Etkinliği başladı! 1 dakika içinde global atın!', GETDATE());
WAITFOR DELAY '00:00:03';
INSERT INTO MaxiGuard_User.._BridgeCommands
(CommandID, Executor, Data1, Data2, Date)
VALUES (500, 'ff0000', 17,
'Rastgele bir oyuncu [75] Silk kazanacak! Bol şans!', GETDATE());
INSERT INTO MaxiGuard_User.._BridgeCommands_Planned
(CommandID, Executor, Data1, DateToExecute)
VALUES (100, 'EndLuckyGlobal',
'EXEC SRO_VT_SYSTEM.._Event_LuckyGlobal_END',
DATEADD(MINUTE, 1, GETDATE()));
END;
Event sonunda rastgele bir kazanan seçilir ve ödülü otomatik verilir.
SQL:
USE SRO_VT_SYSTEM;
GO
ALTER PROCEDURE dbo._Event_LuckyGlobal_END
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT 1 FROM _LuckyGlobalLog)
BEGIN
INSERT INTO MaxiGuard_User.._BridgeCommands
(CommandID, Executor, Data1, Data2, Date)
VALUES (500, 'ff0000', 17,
'[Lucky Global] Event sona erdi, global atan olmadı.', GETDATE());
UPDATE _EventStatus SET Service = 0 WHERE EventName = 'LuckyGlobal';
RETURN;
END
DECLARE @CharName VARCHAR(16), @CharID INT;
SELECT TOP 1
@CharName = CharName16,
@CharID = (SELECT CharID FROM SRO_VT_SHARD.._Char
WHERE CharName16 = egl.CharName16)
FROM _LuckyGlobalLog egl
ORDER BY NEWID();
EXEC MaxiGuard_User.dbo.__AddSilkToCharacter @CharID, 0, 75;
INSERT INTO MaxiGuard_User.._BridgeCommands
(CommandID, Executor, Data1, Data2, Date)
VALUES (500, 'ff0000', 17,
'[Lucky Global] Kazanan: ' + @CharName + ' | Ödül: 75 Silk', GETDATE());
UPDATE _EventStatus SET Service = 0 WHERE EventName = 'LuckyGlobal';
TRUNCATE TABLE _LuckyGlobalLog;
END;
Belirlediğiniz saatlerde Lucky Global eventinin otomatik başlamasını sağlar.
SQL:
INSERT INTO MaxiGuard_User.dbo._Scheduler
(Name, Day, Time, Query, IsEnabled, Comment)
VALUES
('Lucky Global Event', '0', '09:54:10',
'EXEC SRO_VT_SYSTEM.._Event_LuckyGlobal',
1, 'Lucky Global otomatik başlatma');
Sorularınız veya geliştirme önerileriniz varsa konu altından paylaşabilirsiniz.
