/*
| @modifications - Renato Valer
| @version - 2.0.0
| @last update - 2015/08/28 - 09h25min
| @warning: Não me responsabilizo por uso incorreto e possíveis deadlocks. Use por sua conta e risco.
*/
USE MuOnline
GO
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'WZ_DISCONNECT_MEMB')
DROP PROCEDURE [DBO].[WZ_DISCONNECT_MEMB]
GO
CREATE PROCEDURE [DBO].[WZ_DISCONNECT_MEMB] @memb___id VARCHAR(10) AS BEGIN
SET NOCOUNT ON
DECLARE @Find_ID VARCHAR(10),
@ConnectStat TINYINT,
@LoginTime INT,
@LogoutTime INT,
@ConnectTM INT,
@DisConnectTM INT,
@TimeON_Account BIGINT,
@TimeON_Char BIGINT,
@GameIDC VARCHAR(10),
@CharConnectTM DATETIME,
@CharConnectTM_Int INT,
@Now DATETIME,
@Now_Int INT;
SET @ConnectStat = 0
SET @Find_ID = 'NOT'
SET @Now = GETDATE();
SELECT @Find_ID = S.memb___id FROM MEMB_STAT S INNER JOIN MEMB_INFO I ON S.memb___id = I.memb___id WHERE I.memb___id = @memb___id;
IF( @Find_ID <> 'NOT' ) BEGIN
UPDATE MEMB_STAT SET ConnectStat = @ConnectStat, DisconnectTM = @Now WHERE memb___id = @memb___id;
/*
Selecionamos os momentos de login e logout da conta e convertemos para números inteiros.
*/
SET @ConnectTM = (SELECT DATEDIFF(s, '19700101', MEMB_STAT.ConnectTM) FROM MEMB_STAT WHERE memb___id = @memb___id);
SET @DisConnectTM = DATEDIFF(s, '19700101', @Now);
/*
Executamos os cálculos para obtermos o tempo total online da conta.
*/
SET @TimeON_Account = @DisConnectTM - @ConnectTM;
/*
Atualizamos o tempo total online da conta.
*/
UPDATE MEMB_INFO SET TimeON = TimeON + @TimeON_Account WHERE memb___id = @memb___id;
/*
Selecionando nick do último char logado
*/
SET @GameIDC = (SELECT GameIDC FROM AccountCharacter WHERE Id = @memb___id);
/*
Algum char foi logado antes de sair da conta.
Mesmo que o cara tenha logado na conta e criado o char, o GameIDC
só vai ser preenchido se o cara logar na conta.
Sendo assim, se GameIDC for NULL, indica que nenhum char
nunca foi logado nessa conta, então não tem necessidade de contar tempo on.
*/
IF(@GameIDC IS NOT NULL) BEGIN
/*
Verificamos se esse char existe.
Motivo: o cara pode ter clicado em "selecionar char", deletado o char
e depois deslogado da conta.
Se não existe, não precisa fazer nada.
*/
IF EXISTS (SELECT Name FROM Character WHERE AccountID = @memb___id AND Name = @GameIDC) BEGIN
/*
Verificação: quando foi o último connect desse char que acabou de deslogar?
Se for nulo, significa que ocorreu algum problema na trigger, então
adicionamos o valor de "agora" convertido em timestamp para possibilitar o cálculo.
*/
SET @CharConnectTM = (SELECT ConnectTM FROM Character WHERE AccountID = @memb___id AND Name = @GameIDC);
IF (@CharConnectTM IS NULL) BEGIN
SET @CharConnectTM_Int = DATEDIFF(s, '19700101', @Now);
END
/*
Se não for nulo, convertemos para timestamp.
*/
ELSE BEGIN
SET @CharConnectTM_Int = DATEDIFF(s, '19700101', @CharConnectTM);
END
/*
Executamos os cálculos para obtermos o tempo total online
do último char logado.
*/
SET @TimeON_Char = (@DisConnectTM - @CharConnectTM_Int);
/*
Atualizamos o tempo total online do último char logado.
*/
UPDATE Character SET TimeON = TimeON + @TimeON_Char, DisConnectTM = @Now WHERE AccountID = @memb___id AND Name = @GameIDC;
END
END
END
SE <--- ERRO
END