Ir para conteúdo

Tutorial Os.time E Storage Values


noobinhu

Posts Recomendados

O usuário alex me pediu ontem um tutorial explicando melhor como fiz meu sistema VIP, para ser baseado em dias, horas, minutos e segundos.

 

A resposta é storage value + os.time.

 

Explicação de os.time:

os.time() - Uma function que retorna o tempo atual do CPU em segundos, sendo contado desde a criação da linguagem LUA.

 

Exemplo:

os.time()

989013659

 

Não sei que data é esta 989013659 nem que hora, se o seu objetivo é saber isto.

Tem que usar a function os.date, pesquise mais sobre a mesma pelo google, você encontrará bastante explicações.

 

Agora, vamos entender como funciona meu sistema VIP.

É o seguinte, no script de adicionar a VIP, eu coloquei um os.time() dentro da function, para retornar o tempo em segundos daquele exato momento, quando foi colocado a VIP, somei este valor com os segundos que são precisos para no caso, 30 dias de VIP e adicionei este valor em um storage value qualquer, no caso foi o 29000.

 

3600 segundos = 1 hora

3600 segundos *24 = 24 horas = 1 dia

3600 segundos * 24 * 30 = 1 mês comercial

 

Exemplo:

local tempo_em_segundos_agora = os.time() -- segundos retornados pelo CPU

local tempo_da_vip = 3600*24*30 -- 30 dias

tempo_total = tempo_em_segundos_agora+tempo_da_vip

setPlayerStorageValue(player,29000,tempo_total)

 

Player pode ser qualquer player, param UID, cid e etc... O importante é entender que quando eu adicionei a VIP, eu simplesmente guardei um valor de quando foi que eu coloquei somado com os segundos para a quantidade de dias de tal VIP para o player.

 

Agora, checando se essa VIP ainda é válida.

Este é bem simples também, você pega o tempo em segundos do exato momento, onde o player quer executar uma ação de VIP, subtrai pelo valor que colocamos na storage value anteriormente, de quando foi adicionada a VIP, e então se este valor for maior que 0, ele é vip, caso contrário não.

Olhe o exemplo:

local tempo_da_vip = getPlayerStorageValue(player,29000)

local tempo_em_segundos_agora = os.time() -- segundos retornados pelo CPU

tempo_restante = tempo_da_vip-tempo_em_segundos_agora

if tempo_restante > 0 then

-- é vip, executa quaisquer ações vips

else

-- não é vip, retorna algum erro

end

 

Existem outras formas de ver se ele é VIP, mas são mais complexas, esta é forma mais simples.

 

Caso tenham dúvidas, podem postar sem medo, assim que eu ver, respondo :)

 

//Yunie~

Editado por noobinhu
Link para o comentário
Compartilhar em outros sites

O tutor é bem dificil, mais se vc ler ele todo vc vai intender muito bem.

 

muita gente quer aprender isso pra usar em alguma função.dps eu vou usar pra fazer a minha ^^

 

axo q esse é o unico tutor de os.time xD

parabens noobinhu

 

NOTA 10

 

aprovado :button_ok:

Editado por alex0007
Link para o comentário
Compartilhar em outros sites

  • 1 year later...

Fala noobinhu!

 

Antes de mais nada parabéns pelos seus tópicos, são sempre muito interessantes!

 

Bom, desculpe reviver esse tópico que já não comentam faz tempo, é que eu gostei muito desse tutorial, entendi a funcionalidade dele só que estou querendo aplicar no meu sistema que é linkaco com o site, ou seja, ele compra 15 dias de vip no site e é adicionado direto na conta do cara. E eu queria que esse script de retirar os dias realmente funcionasse pois eu já tentei de TUDO e não consigo, eu vou mostrar um que utilizo só que ele quando passa alguns segundos ele ZERA todos os valores (vip, vip_time e vip_days) da account e não tirando de 1 em 1 segundo do vip_time conforme eu imagino que deva ser.

 

C:\xampp\htdocs\shopsystem.php (está funcionando normal até aqui, só preciso saber também como adicinar um storage value aqui, que vá direto na conta, eu já tentei um monte de coisa também e nada.)

					if(isset($buy_offer['id'])) {  //item exist in database
					if($user_premium_points >= $buy_offer['points']) {
						if(check_name($buy_name)) {
							$buy_player = new OTS_Player();
							$buy_player->find($buy_name);
							if($buy_player->isLoaded()) {
								$buy_player_account = $buy_player->getAccount();
								if($_SESSION['viewed_confirmation_page'] == 'yes' && $_POST['buy_confirmed'] == 'yes') {
									if($buy_offer['type'] == 'pacc') {
										$player_vip_days = $buy_player_account->getCustomField('vip_days');
										$player_lastlogin = $buy_player_account->getCustomField('lastday');
										$save_transaction = 'INSERT INTO '.$SQL->tableName('z_shop_history_pacc').' (id, to_name, to_account, from_nick, from_account, price, pacc_days, trans_state, trans_start, trans_real) VALUES (NULL, '.$SQL->quote($buy_player->getName()).', '.$SQL->quote($buy_player_account->getId()).', '.$SQL->quote($buy_from).',  '.$SQL->quote($account_logged->getId()).', '.$SQL->quote($buy_offer['points']).', '.$SQL->quote($buy_offer['days']).', \'realized\', '.$SQL->quote(time()).', '.$SQL->quote(time()).');';
                                           $SQL->query($save_transaction);

                                           $buy_player_account->setCustomField('vip_days', $player_vip_days+$buy_offer['days']);
										$buy_player_account->setCustomField('vip_time', $player_vip_days*86400+$buy_offer['days']*86400);
										$buy_player_account->setCustomField('vip', $player_vip=1);


										$account_logged->setCustomField('premium_points', $user_premium_points-$buy_offer['points']);
										$user_premium_points = $user_premium_points - $buy_offer['points'];
                              				if($player_vip_days == 0) {
											$buy_player_account->setCustomField('lastday', time());
                                                    }

 

data\globalevents\scripts\removevip.lua (aqui começa o problema)

function onThink(interval, lastExecution, thinkInterval)
    Query = db.getResult("SELECT `id`, `vip_time` FROM `accounts` WHERE `accounts`.`vip` = 1")
         if(Query:getID() == -1) then
              return true
         end
         for i = 1, Query:getRows() do
              local AccID = Query:getDataInt("id")
              local VipTime = Query:getDataInt("vip_time")
         if VipTime >= os.time() then
              db.executeQuery("UPDATE `accounts` SET `vip_days` = ".. math.ceil((VipTime - os.time()) / 86400) .." WHERE `accounts`.`id` = ".. AccID ..";")
         else
              db.executeQuery("UPDATE `accounts` SET `vip_time` = 0 WHERE `accounts`.`id` = ".. AccID ..";")
              db.executeQuery("UPDATE `accounts` SET `vip_days` = 0 WHERE `accounts`.`id` = ".. AccID ..";")
              db.executeQuery("UPDATE `accounts` SET `vip` = 0 WHERE `accounts`.`id` = ".. AccID ..";")
              db.executeQuery("UPDATE `players` SET `reset_temple` = 1 WHERE `players`.`account_id` = ".. AccID ..";")
         end
              Query:next()
         end
              Query:free()
         return true
end

 

data\globalevents\globalevents.xml (aqui está assim):

<globalevent name="RemoveVipDays" interval="600" event="script" value="removevip.lua"/>

 

Como eu disse a account recebe os pontos certinho (caso ele compre 15 dias): vip = 1, vip_days = 15, vip_time = 1296000.

Mais no Script removevip.lua o problema deve estar antes do if VipTime >= os.time() then, pois ele não chega a contar nada, ele pega e espera o tempo que está no globalevents.xml (interval="600") e ZERA todos os pontos que ele tem (vip, vip_days e vip_time).

 

Tá complicado eu escrevi muito mais espero que consiga me ajudar, eu nunca mechi tanto com script pra tentar resolver esse problema, já estou ficando com dor de cabeça rs! Me ajuda ae se possível!

 

Abraço

 

 

-----------------

EDIT:

 

Já consegui resolver o meu problema!

Não precisa responder caso veja! Até =)

Editado por GODHalf
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...