Tudo ok então.
Peço desculpas pelos transtornos, realmente foi falha minha.
Tópico atualizado.
Versão da trigger atualizada para 2.1.2.
Versão Imprimível
Tudo ok então.
Peço desculpas pelos transtornos, realmente foi falha minha.
Tópico atualizado.
Versão da trigger atualizada para 2.1.2.
Será que funciona na season8 da x-team ? :D
Citação:
/*
| @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
@ Renato
No meu teste season8.3 da x-team..
Esta funcionando porem o tempo total ONLINE da conta é contabilizado já o TEMPO TOTAL ONLINE DO CHAR não esta contabilizando.
Outra duvida é possível adicionar um ranking diário / semanal e mensal ? Com a contagem de tempo total online do CHAR ?
Citação:
/*
Atualizamos o tempo total online da conta.
*/
UPDATE MEMB_INFO SET TimeON = TimeON + @TimeON_Account WHERE memb___id = @memb___id;
/*
EXEMPLO PARA CRIAR O RANKING EM QUE MENCIONEI :Citação:
/*
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;
Abraços.Citação:
UPDATE Character SET TimeON = TimeON + @TimeON_Char, DisConnectTM = @Now WHERE AccountID = @memb___id AND Name = @GameIDC;
UPDATE Character SET Time_Day = Time_Day + @TimeON_Char, DisConnectTM = @Now WHERE AccountID = @memb___id AND Name = @GameIDC;
UPDATE Character SET Time_Week = Time_Week + @TimeON_Char, DisConnectTM = @Now WHERE AccountID = @memb___id AND Name = @GameIDC;
UPDATE Character SET Time_Month = Time_Month + @TimeON_Char, DisConnectTM = @Now WHERE AccountID = @memb___id AND Name = @GameIDC;
Boa tarde.
ConnectTM da table Character não está atualizando;
OnlineHours da table MEMB_STAT não está calculando a diferença entre ConnectTM e DisConnectTM.
Alguém poderia me ajudar?
Obrigado.
@lucasubatuba o script não usa coluna "OnlineHours" na table MEMB_STAT. Remova todo e qualquer sistema de contagem de tempo online que use para não dar interferência nesse. Depois, refaça a instalação.
@Mr.Junior, você rodou a trigger? Usa algum outro sistema de contagem de tempo online além desse meu?
Me chama no skype pra eu ver o que está acontecendo.
Poderia me explicar como o script funciona?Citação:
Postado originalmente por Renato [Only registered and activated users can see links. Click Here To Register...]
Gostaria de entender o processo para identificar meu erro.
Obrigado.
@lucasubatuba são 3 scripts que trabalham em conjunto.
A procedure WZ_CONNECT_MEMB, original da WEBZEN, atualiza a coluna ConnectTM da tabela MEMB_STAT toda vez que a conta loga. Com isso, temos o exato momento em que você fez o login e, portanto, o marco inicial da nossa contagem.
A trigger AccountCharacter_Online é chamada toda vez que você "entra" ou "sai" de um personagem. Quando você entra, a trigger armazena o momento exato na coluna ConnectTM da tabela Character. Quando você sai do char (sem deslogar da conta), ela armazena esse momento na coluna DisConnectTM da tabela Character e faz um cálculo para saber quanto tempo ficou on. De posse do resultado, ela soma isso à coluna TimeON da tabela Character. Os valores são salvos em segundos.
A procedure WZ_DISCONNECT_MEMB (modificada) atualiza a coluna DisConnectTM da tabela MEMB_STAT toda vez que a conta é deslogada, bem como a coluna DisConnectTM da tabela Character. Com base nos dados e login e logout da conta, o script calcula quanto tempo a conta ficou online e soma isso à coluna TimeON da tabela MEMB_INFO.
Além disso, se o logout foi "direto", sem sair do char antes (como dar alt+f4, por exemplo), ela também atualiza o tempo online do char, seguindo a mesma lógica da trigger AccountCharacter_Online. Todo o tempo é armazenado em segundos.
É isso.
Por ser um procedimento totalmente sincronizado, não pode existir outro método de contagem de tempo online instalado, caso contrário pode gerar conflitos.
[]'s
@Renato
Primeiramente, gostaria de te agradecer: explicação clara e objetiva. Muito obrigado.
<?php
$findSTAT = mssql_query("SELECT * FROM MEMB_STAT WHERE memb___id='".$userName."'");
$fetchSTAT = mssql_fetch_object($findSTAT);
$seconds = $fetchSTAT->TimeON;
$hours = floor($seconds / 3600);
$seconds -= $hours * 3600;
$minutes = floor($seconds / 60);
$seconds -= $minutes * 60;
$timeON = (''.$hours.'h'.$minutes.'min'.$seconds.'sec');
echo $timeON;
?>
Utilizando este código, terei o valor referente ao tempo online da conta, independente de qual char estiver, certo? (DisConnectTM - ConnectTM) da tabela MEMB_STAT;
De acordo com o que você explicou, estou com problema na trigger AccountCharacter_Online,
Pois a mesma não está armazenando o momento em que logo em um personagem na coluna ConnectTM da tabela Character.
@lucasubatuba sim, com esse código você obtém o tempo online da conta.
Se fizermos uma pequena modificação, podemos usar o mesmo código para pegar o tempo on do char, bastando informar o "nome" dele com a variável $name.
Apesar disso resolver, eu recomendo fazer uma classe que poderá ser usada para ambos, pois se você notar, apenas a query muda, de modo que se uma classe for feita, evitará repetição de código.Código PHP:
<?php
$findSTAT = mssql_query("SELECT TimeON FROM Character WHERE name='".$name."'");
$fetchSTAT = mssql_fetch_object($findSTAT);
$seconds = $fetchSTAT->TimeON;
$hours = floor($seconds / 3600);
$seconds -= $hours * 3600;
$minutes = floor($seconds / 60);
$seconds -= $minutes * 60;
$timeON = (''.$hours.'h'.$minutes.'min'.$seconds.'sec');
echo $timeON;
Sobre a trigger AccountCharacter_Online, precisaria mais informações sobre o que está acontecendo no SQL.
@Renato
Na Table MEMB_STAT não possuo a Column TimeON, e sim OnlineHours (que não calcula quanto tempo a conta ficou online).
Na Table Character como eu já disse, a Column ConnectTM não atualiza com a hora que logo o personagem.
Fico no aguardo por instruções.
Obrigado!