PDA

View Full Version : Contagem de tempo online de conta + char.



Rick Barbosa
23/04/2020, 02:31 PM
Olá, alguém teria uma job/trigger que contabilize o tempo online da conta e do personagem e quando o jogador sair da conta o tempo em que ele ficou online seja atualizado.
Eu usava uma do Renato que ele postou em um outro fórum, mas a mesma não contabilizava o tempo online corretamente..

Obs.: versão 97d.

Vou deixar a Trigger abaixo.

♦ Versões atuais dos Scripts:

- TRIGGER: 2.1.2
- WZ_DISCONNECT_MEMB: 2.0.0


♦ ALTER TABLES
Código:

USE [MUOnline]
GO

ALTER TABLE [dbo].[MEMB_STAT]
ALTER COLUMN [ConnectTM] [datetime] NULL
GO

ALTER TABLE [dbo].[MEMB_STAT]
ALTER COLUMN [DisConnectTM] [datetime] NULL
GO

ALTER TABLE [dbo].[MEMB_INFO]
ADD [TimeON] [bigint] NOT NULL DEFAULT 0
GO

ALTER TABLE [dbo].[Character]
ADD [ConnectTM] [datetime] NULL
GO

ALTER TABLE [dbo].[Character]
ADD [DisConnectTM] [datetime] NULL
GO

ALTER TABLE [dbo].[Character]
ADD [TimeON] [bigint] DEFAULT ((0)) NOT NULL
GO


♦ TRIGGER - AccountCharacter_Online


/*
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
*/

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

[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]

[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]

-- Hipótese 1.1
[Only registered and activated users can see links]

-- Hipótese 1.1.1
[Only registered and activated users can see links]

[Only registered and activated users can see links]

END
-- Hipótese 1.1.2
ELSE BEGIN

[Only registered and activated users can see links]
[Only registered and activated users can see links]

-- Hipótese 1.1.2.1
[Only registered and activated users can see links]

-- Verificação da Hipótese 1.1.2.1.1
[Only registered and activated users can see links]

[Only registered and activated users can see links]
[Only registered and activated users can see links]

[Only registered and activated users can see links]

[Only registered and activated users can see links]

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.
*/
[Only registered and activated users can see links]

END

END
--Hipótese 1.2.
ELSE BEGIN
-- Apenas precaução...
[Only registered and activated users can see links]

/*
| 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.
*/

[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]

-- Hipótese 1.2.1
[Only registered and activated users can see links]

[Only registered and activated users can see links]
[Only registered and activated users can see links]

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.
*/
[Only registered and activated users can see links]

END

END

END
SET NOCOUNT OFF
END


♦ PROCEDURE WZ_DISCONNECT_MEMB


/*
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
*/

USE MuOnline
GO

IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'WZ_DISCONNECT_MEMB')
DROP PROCEDURE [DBO].[WZ_DISCONNECT_MEMB]
GO

[Only registered and activated users can see links]

SET NOCOUNT ON

[Only registered and activated users can see links]
@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;

[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]

[Only registered and activated users can see links]

[Only registered and activated users can see links]

[Only registered and activated users can see links]


/*
Selecionamos os momentos de login e logout da conta e convertemos para números inteiros.
*/

[Only registered and activated users can see links]
[Only registered and activated users can see links]


/*
Executamos os cálculos para obtermos o tempo total online da conta.
*/

[Only registered and activated users can see links]

/*
Atualizamos o tempo total online da conta.
*/

[Only registered and activated users can see links]


/*
Selecionando nick do último char logado
*/

[Only registered and activated users can see links]

/*
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.
*/
[Only registered and activated users can see links]

/*
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.
*/
[Only registered and activated users can see links]

/*
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.
*/

[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
END
/*
Se não for nulo, convertemos para timestamp.
*/
ELSE BEGIN
[Only registered and activated users can see links]
END

/*
Executamos os cálculos para obtermos o tempo total online
do último char logado.
*/

[Only registered and activated users can see links]

/*
Atualizamos o tempo total online do último char logado.
*/

[Only registered and activated users can see links]

END
END
END
SET NOCOUNT OFF
END



Agredeço desde já.

3 Dias 19 Horas:------- Atualizado -------

Alguém? :s