Ir para conteúdo
  • 0

NPC - Teleport se tiver X horas online


fearwar

Pergunta

Opa,

Estou procurando script de NPC que teleport o player se tiver X horas online, e esse contador reseta todo dia as 00:00...

 

Alguém tem algo parecido?

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

9 respostass a esta questão

Posts Recomendados

  • 0

Pelo que entendi a partir do momento que o player tiver X horas online ele pode ser teleportado quantas vezes quiser certo? Vamos lá!

 

Primeiro, vá em Data/Creaturescripts/Scripts e abra o arquivo login.lua e embaixo da função onLogin() coloque essa linha:

 

setPlayerStorageValue(cid, 777777, os.time()) 

 

Agora vá em Data/Npc e crie um arquivo XML chamado Teleporter.xml (ou o nome que achar melhor) e adicione o código dentro:

 

<?xml version="1.0" encoding="UTF-8"?>

<npc name="Telep" script="Teleporter.lua" walkinterval="4000" floorchange="0" level="1" maglevel="1">
    <health now="150" max="150"/>
    <look type="1421" head="114" body="119" legs="114" feet="114" corpse="2212"/>

    <parameters>
    	<parameter key="message_greet" value="Hello |PLAYERNAME|! Would you like to be teleported? Say {help} or {ajuda} for more informations."/>
    </parameters>
</npc>

 

Agora abra a pasta Scripts dentro da pasta NPC e crie um arquivo chamado Teleporter.lua e adicione o código dentro:

 

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}

function GetHourFromSeconds(hour)
    return 60 * 60 * hour
end  

function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end
function onThink() npcHandler:onThink() end

function creatureSayCallback(cid, type, msg)
 if (not npcHandler:isFocused(cid)) then
    return false
 end


-- VARIÁVEIS --
msg = string.lower(msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

local position = {x= 1500, y= 1500, z= 7} -- POSIÇÃO PARA ONDE SERÁ TELEPORTADO
local tempo_minimo = 1 -- QUANTIDADE DE HORAS QUE SERÁ NECESSÁRIO ESTAR ONLINE PARA SER TELEPORTADO
local local_name = 'Village' -- NOME DO LOCAL OU PARA ONDE SERÁ TELEPORTADO
local storage_time = 777777 -- STORAGE QUE ARMAZENA O TEMPO ONLINE DO PLAYER

----------------------------------- [ DIALOGO COM NPC] ---------------------------------      
    if msgcontains(msg, 'help') or msgcontains(msg, 'ajuda') then
        selfSay("If you want to teleport to {" .. local_name .. "} you need to be at least {" .. tempo_minimo .. "} hour(s) online. Are you online the enough time to be teleported?", cid)
        talkState[talkUser] = 1  

    elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim')) and talkState[talkUser] == 1 then
        if (getPlayerStorageValue(cid, storage_time) + GetHourFromSeconds(tempo_minimo)) <= os.time() then
            selfSay("Good journey!", cid)
            doTeleportThing(cid, position)
                    
        else
            selfSay("You aren't online enough time to be teleported", cid)
        end
    
        talkState[talkUser] = 0
    return true
    
    elseif (msgcontains(msg, 'no') or msgcontains(msg, 'não')) and talkState[talkUser] == 1 then   
        selfSay("Ok, goodbye!", cid)
        talkState[talkUser] = 0
    return true

    else
        selfSay("I didn't understand what you said", cid)
    end
        

return true
end
 
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

Agora vá na pasta Data/Globalevents/Scripts e crie um arquivo chamado ResetTeleportTime.lua e adicione o código dentro:

 

local storage = 777777 -- STORAGE QUE ARMAZENA O TEMPO ONLINE DO PLAYER

function onTimer()
    for _, player in pairs(getPlayersOnline()) do
        if getPlayerStorageValue(player, storage) > 0 then
            setPlayerStorageValue(player, storage, 0)
        end
    end

return true    
end    

 

E por fim, volte na pasta Data/Globalevents e abra o arquivo globalevents.xml e adicione o seguinte código dentro:

 

<globalevent name="reset_teleport" time="00:00" event="script" value="ResetTeleportTime.lua"/> 

 

Eu deixei todas as variáveis comentadas, só alterar os valores desejado nelas.

 

Teste e me avise se der algum problema.

Link para o comentário
Compartilhar em outros sites

  • 0
Em 22/08/2021 em 02:53, Yan Oliveira disse:

Pelo que entendi a partir do momento que o player tiver X horas online ele pode ser teleportado quantas vezes quiser certo? Vamos lá!

 

Primeiro, vá em Data/Creaturescripts/Scripts e abra o arquivo login.lua e embaixo da função onLogin() coloque essa linha:

 


setPlayerStorageValue(cid, 777777, os.time()) 

 

Agora vá em Data/Npc e crie um arquivo XML chamado Teleporter.xml (ou o nome que achar melhor) e adicione o código dentro:

 


<?xml version="1.0" encoding="UTF-8"?>

<npc name="Telep" script="Teleporter.lua" walkinterval="4000" floorchange="0" level="1" maglevel="1">
    <health now="150" max="150"/>
    <look type="1421" head="114" body="119" legs="114" feet="114" corpse="2212"/>

    <parameters>
    	<parameter key="message_greet" value="Hello |PLAYERNAME|! Would you like to be teleported? Say {help} or {ajuda} for more informations."/>
    </parameters>
</npc>

 

Agora abra a pasta Scripts dentro da pasta NPC e crie um arquivo chamado Teleporter.lua e adicione o código dentro:

 


local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}

function GetHourFromSeconds(hour)
    return 60 * 60 * hour
end  

function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end
function onThink() npcHandler:onThink() end

function creatureSayCallback(cid, type, msg)
 if (not npcHandler:isFocused(cid)) then
    return false
 end


-- VARIÁVEIS --
msg = string.lower(msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

local position = {x= 1500, y= 1500, z= 7} -- POSIÇÃO PARA ONDE SERÁ TELEPORTADO
local tempo_minimo = 1 -- QUANTIDADE DE HORAS QUE SERÁ NECESSÁRIO ESTAR ONLINE PARA SER TELEPORTADO
local local_name = 'Village' -- NOME DO LOCAL OU PARA ONDE SERÁ TELEPORTADO
local storage_time = 777777 -- STORAGE QUE ARMAZENA O TEMPO ONLINE DO PLAYER

----------------------------------- [ DIALOGO COM NPC] ---------------------------------      
    if msgcontains(msg, 'help') or msgcontains(msg, 'ajuda') then
        selfSay("If you want to teleport to {" .. local_name .. "} you need to be at least {" .. tempo_minimo .. "} hour(s) online. Are you online the enough time to be teleported?", cid)
        talkState[talkUser] = 1  

    elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim')) and talkState[talkUser] == 1 then
        if (getPlayerStorageValue(cid, storage_time) + GetHourFromSeconds(tempo_minimo)) <= os.time() then
            selfSay("Good journey!", cid)
            doTeleportThing(cid, position)
                    
        else
            selfSay("You aren't online enough time to be teleported", cid)
        end
    
        talkState[talkUser] = 0
    return true
    
    elseif (msgcontains(msg, 'no') or msgcontains(msg, 'não')) and talkState[talkUser] == 1 then   
        selfSay("Ok, goodbye!", cid)
        talkState[talkUser] = 0
    return true

    else
        selfSay("I didn't understand what you said", cid)
    end
        

return true
end
 
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

Agora vá na pasta Data/Globalevents/Scripts e crie um arquivo chamado ResetTeleportTime.lua e adicione o código dentro:

 


local storage = 777777 -- STORAGE QUE ARMAZENA O TEMPO ONLINE DO PLAYER

function onTimer()
    for _, player in pairs(getPlayersOnline()) do
        if getPlayerStorageValue(player, storage) > 0 then
            setPlayerStorageValue(player, storage, 0)
        end
    end

return true    
end    

 

E por fim, volte na pasta Data/Globalevents e abra o arquivo globalevents.xml e adicione o seguinte código dentro:

 


<globalevent name="reset_teleport" time="00:00" event="script" value="ResetTeleportTime.lua"/> 

 

Eu deixei todas as variáveis comentadas, só alterar os valores desejado nelas.

 

Teste e me avise se der algum problema.

Olá,

 

Funcionou perfeitamente!

Para da uma aperfeiçoada na script teria como por level mínimo também?

 

E referente a mensagem de que o player não tem tempo, teria como colocar quanto tempo ele tem online para o player saber?
Exemplo: Você tem apenas 15 minutos e 50 segundos de tempo online até agora você precisa ter 8h online no dia para ter acesso frost.


 

Link para o comentário
Compartilhar em outros sites

  • 0
18 horas atrás, fearwar disse:

Olá,

 

Funcionou perfeitamente!

Para da uma aperfeiçoada na script teria como por level mínimo também?

 

E referente a mensagem de que o player não tem tempo, teria como colocar quanto tempo ele tem online para o player saber?
Exemplo: Você tem apenas 15 minutos e 50 segundos de tempo online até agora você precisa ter 8h online no dia para ter acesso frost.


 

Que bom que funcionou!

 

Tem como sim!

 

Troque o código do arquivo Teleporter.lua (arquivo lua do NPC) por esse:

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}

function GetHourFromSeconds(hour)
    return 60 * 60 * hour
end  

function GetTime(time_seconds)
    local out = {}
    local dateFormat = {
        {'hora', time_seconds / 60 / 60}, 
        {'minuto', time_seconds / 60 % 60},
        }
                                           
        for k, t in ipairs(dateFormat) do
            local v = math.floor(t[2])
            if (v > -1) then
                 table.insert(out, (k < #dateFormat and '' or ' and ') .. v .. '' .. (v <= 1 and t[1] or t[1].."s"))
            end
        end
    
        if tonumber(dateFormat[1][2]) == 0 and tonumber(dateFormat[2][2]) == 0 then
           return "segundos"
        end
    
return table.concat(out)
end

function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end
function onThink() npcHandler:onThink() end

function creatureSayCallback(cid, type, msg)
 if (not npcHandler:isFocused(cid)) then
    return false
 end


-- VARIÁVEIS --
msg = string.lower(msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

local position = {x= 1500, y= 1500, z= 7} -- POSIÇÃO PARA ONDE SERÁ TELEPORTADO
local tempo_minimo = 8 -- QUANTIDADE DE HORAS QUE SERÁ NECESSÁRIO ESTAR ONLINE PARA SER TELEPORTADO
local local_name = 'Village' -- NOME DO LOCAL OU PARA ONDE SERÁ TELEPORTADO
local storage_time = 777777 -- STORAGE QUE ARMAZENA O TEMPO ONLINE DO PLAYER
local level = 100 -- LEVEL MÍNIMO PARA TELEPORTAR
local effect = true -- true PARA TER EFEITO E false SEM EFEITO AO TELEPORTAR
local effect_id = 25 -- ID DO EFEITO AO TELEPORTAR

----------------------------------- [ DIALOGO COM NPC] ---------------------------------      
    if msgcontains(msg, 'help') or msgcontains(msg, 'ajuda') then
        selfSay("If you want to teleport to {" .. local_name .. "} you need to be at least {" .. tempo_minimo .. "} hour(s) online. Are you online the enough time to be teleported?", cid)
        talkState[talkUser] = 1  

    elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim')) and talkState[talkUser] == 1 then

        if getPlayerLevel(cid) >= level then
            if (getPlayerStorageValue(cid, storage_time) + GetHourFromSeconds(tempo_minimo)) <= os.time() then
                selfSay("Good journey!", cid)
                doTeleportThing(cid, position)

                if effect then
                    doSendMagicEffect(getThingPos(cid), effect_id)
                end    
                        
            else
                selfSay("Only is possible to teleport if you are online at least " .. tempo_minimo .. " hours. You are online " .. GetTime(getPlayerStorageValue(cid, storage_time)) .. ".", cid)
            end
        else
            selfSay("You need to be at least level " .. level .. " to teleport.", cid)
        end
        
    
        talkState[talkUser] = 0
    return true
    
    elseif (msgcontains(msg, 'no') or msgcontains(msg, 'não')) and talkState[talkUser] == 1 then   
        selfSay("Ok, goodbye!", cid)
        talkState[talkUser] = 0
    return true

    else
        selfSay("I didn't understand what you said", cid)
    end
        

return true
end
 
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

Na variável level você coloca o nível mínimo, na variável effect mude para false caso não queira efeito ao teleportar e na variável effect_id coloque o id do efeito que quer ao teleportar caso opte pelo efeito. Também precisa ajustar os valores das variáveis que você tinha colocado, no caso da posição e nome do lugar. De resto não precisa alterar mais nada, só colocar o tempo em horas que quer na variável tempo_minimo.

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

  • 0

Uma dúvida, ao usar o contato de horas no login.lua, se caso o player deslogar e depois de um tempo logar ele começa a contar o tempo novamente?

 

Link para o comentário
Compartilhar em outros sites

  • 0
28 minutos atrás, fearwar disse:

Uma dúvida, ao usar o contato de horas no login.lua, se caso o player deslogar e depois de um tempo logar ele começa a contar o tempo novamente?

 

Sim, tanto é que no Login.lua em baixo do onLogin() ele sempre recebe o tempo atual que ele logou pela função os.time():

 

setPlayerStorageValue(cid, 777777, os.time()) 

Como pode ver na linha acima, ele seta o tempo atual do login para a storage 777777. Então sempre que o cara logar, vai começar a contar a partir desse momento.

Link para o comentário
Compartilhar em outros sites

  • 0
2 horas atrás, Yan Oliveira disse:

Sim, tanto é que no Login.lua em baixo do onLogin() ele sempre recebe o tempo atual que ele logou pela função os.time():

 



setPlayerStorageValue(cid, 777777, os.time()) 

Como pode ver na linha acima, ele seta o tempo atual do login para a storage 777777. Então sempre que o cara logar, vai começar a contar a partir desse momento.

Depende quanto tempo que o player desloga, quando ele for relogar ou morrer o "cid" dele não muda?

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

  • 0
3 horas atrás, fearwar disse:

Depende quanto tempo que o player desloga, quando ele for relogar ou morrer o "cid" dele não muda?

Como o CID é um ponteiro, ele vai mudar sim quando o player relogar ou deslogar. Mas por que você precisa ou quer saber essa informação? Essa informação não terá impacto no script que fiz para você, só dependerá do player ficar online.

Link para o comentário
Compartilhar em outros sites

  • 0
3 minutos atrás, Yan Oliveira disse:

Como o CID é um ponteiro, ele vai mudar sim quando o player relogar ou deslogar. Mas por que você precisa ou quer saber essa informação? Essa informação não terá impacto no script que fiz para você, só dependerá do player ficar online.

Essa era minha dúvida, obrigado!

Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...