/*
| @author - Renato Valer
| @version - 2.1.2
| @last update - 2016/02/12 - 08h18min
| @warning: Não me responsabilizo por uso incorreto e possíveis deadlocks. Use por sua conta e risco.
*/
USE MuOnline
GO
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'AccountCharacter_Online' AND type = 'TR')
DROP TRIGGER [AccountCharacter_Online]
GO
CREATE TRIGGER [AccountCharacter_Online] ON [dbo].[AccountCharacter]
AFTER UPDATE AS
SET NOCOUNT ON
/*
| Hipóteses
|
|
| 1 - Se GameIDC foi atualizado, algum char foi foi logado. Surgem hipóteses:
|
| 1.1 - GameIDC e Old_GameIDC são diferentes:
|
| 1.1.1 - Old_GameIDC é NULL, logo é o primeiro char logado (e possivelmente o primeiro criado) na conta,
| pois não existe GameIDC anterior.
| 1.1.2 - Já existe um GameIDC anterior, logo significa que o cara acessou outro char. Surgem 2 hipóteses:
|
| 1.1.2.1 - O cara simplesmente trocou de char sem deslogar a conta:
| 1.1.2.1.1 - O cara logou um char, deletou ele e entrou em outro.
| 1.1.2.2 - O cara relogou a conta e entrou em outro char.
| 1.1.2.2.1 - O cara logou um char, deletou ele, saiu da conta, voltou e entrou em outro.
|
| 1.2 GameIDC e Old_GameIDC são iguais:
|
| 1.2.1 - O cara relogou o char.
| 1.2.2 - O cara relogou a conta e entrou no mesmo char.
|
| 2. Se GameIDC não foi atualizado, não precisa fazer nada, porque significa:
|
| 2.1 - Que um char foi criado, mas não foi logado.
| 2.2 - Que um char foi deletado sem nem mesmo ter sido logado.
|
|
*/
-- Hipótese 1
IF UPDATE(GameIDC) BEGIN
DECLARE @Login VARCHAR(10),
@GameIDC VARCHAR(10),
@Old_GameIDC VARCHAR(10),
@GameIDC_ConnectTM DATETIME,
@GameIDC_ConnectTM_Int INT,
@Old_GameIDC_ConnectTM DATETIME,
@Old_GameIDC_ConnectTM_Int INT,
@GameIDC_DisConnectTM DATETIME,
@GameIDC_DisConnectTM_Int INT,
@Old_GameIDC_DisConnectTM DATETIME,
@Old_GameIDC_DisConnectTM_Int INT,
@Account_DisconnectTM DATETIME,
@Account_DisconnectTM_Int INT,
@Now DATETIME,
@Now_Int INT,
@TimeON BIGINT;
SET @Login = (SELECT Id FROM INSERTED);
SET @GameIDC = (SELECT GameIDC FROM AccountCharacter WHERE Id = @Login);
SET @Old_GameIDC = (SELECT GameIDC FROM DELETED);
SET @Now = GETDATE();
SET @Now_Int = DATEDIFF(s, '19700101', @Now);
SET @Account_DisconnectTM = (SELECT DisconnectTM FROM MEMB_STAT WHERE memb___id = @Login);
SET @Account_DisconnectTM_Int = DATEDIFF(s, '19700101', @Account_DisconnectTM);
-- Hipótese 1.1
IF(@GameIDC <> @Old_GameIDC) BEGIN
-- Hipótese 1.1.1
IF(@Old_GameIDC IS NULL) BEGIN
UPDATE Character SET ConnectTM = @Now WHERE AccountID = @Login AND Name = @GameIDC;
END
-- Hipótese 1.1.2
ELSE BEGIN
SET @Old_GameIDC_DisconnectTM = @Now
SET @Old_GameIDC_DisconnectTM_Int = @Now_Int;
-- Hipótese 1.1.2.1
IF(@Account_DisconnectTM_Int <> @Old_GameIDC_DisconnectTM_Int) BEGIN
-- Verificação da Hipótese 1.1.2.1.1
IF EXISTS(SELECT Name FROM Character WHERE AccountID = @Login AND Name = @Old_GameIDC) BEGIN
SET @Old_GameIDC_ConnectTM = (SELECT ConnectTM FROM Character WHERE AccountID = @Login AND Name = @Old_GameIDC);
SET @Old_GameIDC_ConnectTM_Int = DATEDIFF(s, '19700101', @Old_GameIDC_ConnectTM);
SET @TimeON = @Old_GameIDC_DisconnectTM_Int - @Old_GameIDC_ConnectTM_Int;
UPDATE Character SET TimeON = TimeON + @TimeON, DisConnectTM = @Now WHERE AccountID = @Login AND Name = @Old_GameIDC;
END
END
-- Hipótese 1.1.2.2 e "fim" da Hipótese 1.1.2.1
-- A query é a mesma e um "else" é desnecessário.
/*
| Não é necessário atualizar tempo on, porque se o cara relogou a conta
| a WZ_DISCONNECT_MEMB já fez o serviço. Só precisamos atualizar o momento
| de connect do novo char.
*/
UPDATE Character SET ConnectTM = @Now WHERE AccountID = @Login AND Name = @GameIDC;
END
END
--Hipótese 1.2.
ELSE BEGIN
-- Apenas precaução...
IF(@GameIDC IS NOT NULL) BEGIN
/*
| Desnecessário checar se o char existe, porque se essa parte
| do script está sendo executada, é porque o char foi logado
| agora, logo é presumível que existe.
*/
SET @GameIDC_ConnectTM = (SELECT ConnectTM FROM Character WHERE AccountID = @Login AND Name = @GameIDC);
SET @GameIDC_ConnectTM_Int = DATEDIFF(s, '19700101', @GameIDC_ConnectTM);
SET @GameIDC_DisconnectTM_Int = @Now_Int;
-- Hipótese 1.2.1
IF(@Account_DisconnectTM_Int < @GameIDC_ConnectTM_Int) BEGIN
SET @TimeON = @GameIDC_DisconnectTM_Int - @GameIDC_ConnectTM_Int;
UPDATE Character SET TimeON = TimeON + @TimeON, DisConnectTM = @Now, ConnectTM = @Now WHERE AccountID = @Login AND Name = @GameIDC;
END
-- Hipótese 1.2.2
ELSE BEGIN
/*
Não é necessário atualizar tempo on, porque se o cara relogou a conta
a WZ_DISCONNECT_MEMB já fez o serviço.
*/
UPDATE Character SET ConnectTM = @Now WHERE AccountID = @Login AND Name = @GameIDC;
END
END
END
SET NOCOUNT OFF
END