Ir para conteúdo
  • Cadastre-se

(Resolvido)Sistema para evento programado com tps [8.60]


Ir para solução Resolvido por Adriano SwaTT,

Posts Recomendados

Bom galera, o sisteminha é um pouquim complexo, mas vamos lá...

 

Gostaria que todo dia 1°, às 12:00, abram 6 TPs no mapa.

Esses tps devem ficar abertos por 12 horas, após esse horários eles desapareçam.

 

Porém, há dois problemas:

Um dos TPs só poderá ser acessado contendo 5 diferentes storages (o player tem que ter os 5).

O player após entrar 1 vez em qualquer um dos TPs, ele só poderá entrar novamente em qualquer um dos tps na próxima vez que o evento iniciar, ou seja, no próximo dia 1.

 

PS.: incluir mensagens informando que o evento inciou e os Tps abriram, quando os tps fecharem, que o player não pode entrar novamente no tp (caso já tenha entrado)

 

Desde já agreço!

Editado por lolksky (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Solução

Boa noite.

Criei e testei o script, as funções básicas que precisa consegui executar com sucesso.

 

1. Ele cria os teleportes, cada um com uma ActionID diferente para que você possa criar um script para cada teleporte e assim configurar os requisitos para poder entrar.

2. Ele cria os teleportes no horário programado no GlobalEvents.xml, e a data fica configurada dentro do próprio script.

3. Ele remove os teleportes depois do tempo programado.

4. Ele bloqueia players que já acessaram um dos teleportes, já configurado para liberar a cada evento.

 

Vamos em GlobalEvents.xml e adicionar a tag abaixo:

<globalevent name="Teleports" time="12:00" event="script" value="teleports_progs.lua"/>

 

Agora na pasta scripts da referida, criaremos o arquivo "teleports_progs.lua" e adicionaremos o script abaixo:

--------- Script by: Adriano Swatt' ------
local dia = '1' -- qual dia do mês
local horas = 12 -- hora do evento & horas para remover os tps
local tp_id = 5023 -- ID do Teleport (Pode ser outro item, se desejar)
local gstrg_control = 12129 -- Não precisa mexer (Global Storage de Controle de Acesso)
local tp_pos = {{x=000, y=000, z=0}, {x=000, y=000, z=0}, {x=000, y=000, z=0}, {x=000, y=000, z=0}, {x=000, y=000, z=0}, {x=000, y=000, z=0}} -- Coordenada Onde Nascerá os TPs
local tp_acts = {11111, 22222, 33333, 44444, 55555, 66666} -- ActionID para Cada TP (Terá que registrar em movements.xml as memas que colocar aqui)
----------- FIM DAS CONFIGURAÇÕES ---------

function onTimer()
local checkday = os.date("%d")
    if checkday == dia then
        for x = 1, #tp_pos do
        doItemSetAttribute(doCreateItem(tp_id, 1, tp_pos[x]), "aid", tp_acts[x])
        end -- FOR
        addEvent(RemoveTps, horas * 60 * 60 * 1000)
        doBroadcastMessage("Hoje é dia "..checkday.." e são exatamente "..horas..":00 horas, os teleportes de bonus foram abertos e permanecerão por "..horas.." horas.")
        if getGlobalStorageValue(gstrg_control) <= 0 then
            setGlobalStorageValue(gstrg_control, 1)
        else
            setGlobalStorageValue(gstrg_control, (getGlobalStorageValue(gstrg_control) + 1))
        end
        return true
    else
        doBroadcastMessage("Lembrem-se: Todo dia "..checkday.." às "..horas.." horas terá o evento dos teleportes.")
    end
return true
end

function RemoveTps()
    for y = 1, #tp_pos do
    doRemoveItem(getTileItemById(tp_pos[y], tp_id).uid, 1)
    end -- FOR
    doBroadcastMessage("Os teleportes foram removidos, o evento abrirá novamente no próximo dia "..dia.." exatamente às "..horas..":00 horas.")
return true
end

 

Agora em Movements.xml adicionaremos a tag, como abaixo: (Substitua os números de acordo com que configurou o script anterior/acima)

<movevent type="StepIn" actionid="11111;22222;33333;44444;55555;66666" event="script" value="Teleports_Progs.lua"/>

 

E em scripts, criaremos o arquivo "Teleports_Progs.lua" e adicionaremos o código abaixo:

-------- Script by: Adriano Swatt' -------
local gstrg_control = 12129 -- Não precisa mexer (Global Storage de Controle de Acesso)
local tp_exe = 11111 -- ID da ActionID do Teleport Exclusivo (Necessita 5 storages)
local stors = {11111, 22222, 33333, 44444, 55555} -- Storages o player precisa para o teleport exclusivo
local tp_acts = {
    [11111] = {{x=000, y=000, z=0}}, -- ActionID de cada teleport e coordenada pra onde o player irá (Tem que ser a mesma do outro script)
    [22222] = {{x=000, y=000, z=0}}, -- teleport 2
    [33333] = {{x=000, y=000, z=0}}, -- teleport 3
    [44444] = {{x=000, y=000, z=0}}, -- teleport 4
    [55555] = {{x=000, y=000, z=0}}, -- teleport 5
    [66666] = {{x=000, y=000, z=0}}  -- teleport 6
}
local msgs = {
"Você não tem todas as quests necessárias.", -- Mensagem quando não tiver todas storages
"Você já entrou em um dos teleportes bônus hoje.", -- Mensagem quando já tiver acessado um dos teleportes
"Parabéns, você entrou no teleporte bônus." -- Mensagem ao entrar em algum teleporte
} -- Mensagens
----------- FIM DAS CONFIGURAÇÕES ---------

function onStepIn(cid, item, position, fromPosition)
local tp_check = tp_acts[item.actionid]
local gstrg = getGlobalStorageValue(gstrg_control)
local getSto = getPlayerStorageValue

    if item.actionid ~= tp_exe then
        if tp_check then
            if getSto(cid, gstrg_control) < (gstrg) then
                doPlayerSendCancel(cid, msgs[3])
                doTeleportThing(cid, tp_check[1])
                setPlayerStorageValue(cid, gstrg_control, (getGlobalStorageValue(gstrg_control)))
            else
                doPlayerSendCancel(cid, msgs[2])
                doTeleportThing(cid, fromPosition)
            end
        end
    else
        if getSto(cid, gstrg_control) < (gstrg) then
            if getSto(cid, stors[1]) >= 1 and getSto(cid, stors[2]) >= 1 and getSto(cid, stors[3]) >= 1 and getSto(cid, stors[4]) >= 1 and getSto(cid, stors[5]) >= 1 then
                doPlayerSendCancel(cid, msgs[3])
                doTeleportThing(cid, tp_check[1])
                setPlayerStorageValue(cid, gstrg_control, (getGlobalStorageValue(gstrg_control)))
            else
                doPlayerSendCancel(cid, msgs[1])
                doTeleportThing(cid, fromPosition)
            end
        else
            doPlayerSendCancel(cid, msgs[2])
            doTeleportThing(cid, fromPosition)
        end
    end
    return true
end
 

 

Testei e funcionou perfeitamente.

 

Boa sorte.

Caso ocorra algum erro, ou até mesmo para agradecer, dê um FeedBack. ;)

 

Abraços.

Gosta do meu trabalho?

Curta e siga a página do meu projeto de 2016 e 2017 (Lab Z Games) que trará vários servidores OTServs.

 

Atenciosamente,
Adriano Swatt'

 

Para ver meus tutoriais acesse meu perfil.

 

cbCyOSZ.png

Link para o post
Compartilhar em outros sites

Cara, eu cometi um erro e passei uma informação errônea.

 

onde se lê: "2°  O player após entrar 1 vez em qualquer um dos TPs, ele só poderá entrar novamente em qualquer um dos tps na próxima vez que o evento iniciar, ou seja, no próximo dia 1."

Seria na verdade: " O player após entrar 1 vez no TP que precisa dos storages, ele só poderá entrar novamente em qualquer um dos tps na próxima vez que o evento iniciar, ou seja, no próximo dia 1."

 

Teria como corrigir isso?  Peço-lhe desculpas, foi falta de atenção minha.  :D

Link para o post
Compartilhar em outros sites

Tente substituir o movements por este:

-------- Script by: Adriano Swatt' -------
local gstrg_control = 12129 -- Não precisa mexer (Global Storage de Controle de Acesso)
local tp_exe = 11111 -- ID da ActionID do Teleport Exclusivo (Necessita 5 storages)
local stors = {11111, 22222, 33333, 44444, 55555} -- Storages o player precisa para o teleport exclusivo
local tp_acts = {
    [11111] = {{x=000, y=000, z=0}}, -- ActionID de cada teleport e coordenada pra onde o player irá (Tem que ser a mesma do outro script)
    [22222] = {{x=000, y=000, z=0}}, -- teleport 2
    [33333] = {{x=000, y=000, z=0}}, -- teleport 3
    [44444] = {{x=000, y=000, z=0}}, -- teleport 4
    [55555] = {{x=000, y=000, z=0}}, -- teleport 5
    [66666] = {{x=000, y=000, z=0}}  -- teleport 6
}
local msgs = {
"Você não tem todas as quests necessárias.", -- Mensagem quando não tiver todas storages
"Você já entrou em um dos teleportes bônus hoje.", -- Mensagem quando já tiver acessado um dos teleportes
"Parabéns, você entrou no teleporte bônus." -- Mensagem ao entrar em algum teleporte
} -- Mensagens
----------- FIM DAS CONFIGURAÇÕES ---------

function onStepIn(cid, item, position, fromPosition)
local tp_check = tp_acts[item.actionid]
local gstrg = getGlobalStorageValue(gstrg_control)
local getSto = getPlayerStorageValue

    if item.actionid ~= tp_exe then
        if tp_check then
            doPlayerSendCancel(cid, msgs[3])
            doTeleportThing(cid, tp_check[1])
        end
    else
        if getSto(cid, gstrg_control) < (gstrg) then
            if getSto(cid, stors[1]) >= 1 and getSto(cid, stors[2]) >= 1 and getSto(cid, stors[3]) >= 1 and getSto(cid, stors[4]) >= 1 and getSto(cid, stors[5]) >= 1 then
                doPlayerSendCancel(cid, msgs[3])
                doTeleportThing(cid, tp_check[1])
                setPlayerStorageValue(cid, gstrg_control, (getGlobalStorageValue(gstrg_control)))
            else
                doPlayerSendCancel(cid, msgs[1])
                doTeleportThing(cid, fromPosition)
            end
        else
            doPlayerSendCancel(cid, msgs[2])
            doTeleportThing(cid, fromPosition)
        end
    end
    return true
end

 

Boa sorte.

Gosta do meu trabalho?

Curta e siga a página do meu projeto de 2016 e 2017 (Lab Z Games) que trará vários servidores OTServs.

 

Atenciosamente,
Adriano Swatt'

 

Para ver meus tutoriais acesse meu perfil.

 

cbCyOSZ.png

Link para o post
Compartilhar em outros sites

Não é para substituir o arquivo LUA do globalevents, e sim o do movements. "Teleports_Progs.lua".

É o segundo script.

Gosta do meu trabalho?

Curta e siga a página do meu projeto de 2016 e 2017 (Lab Z Games) que trará vários servidores OTServs.

 

Atenciosamente,
Adriano Swatt'

 

Para ver meus tutoriais acesse meu perfil.

 

cbCyOSZ.png

Link para o post
Compartilhar em outros sites

Mas é da pasta movements e não globalevents.

O da globalevents tem que ficar o primeiro que te mandei.

 

Veja o que postou:

Evento onTime not found (data/globalevents/scripts/teleports_progs.lua)

 

Está colocando errado, abra a pasta movements e pegue o script que te mandei.

Gosta do meu trabalho?

Curta e siga a página do meu projeto de 2016 e 2017 (Lab Z Games) que trará vários servidores OTServs.

 

Atenciosamente,
Adriano Swatt'

 

Para ver meus tutoriais acesse meu perfil.

 

cbCyOSZ.png

Link para o post
Compartilhar em outros sites

 

Muda:

function onTimer()
para:
function onTime()
E vê se o erro continua.

 

Boa noite,

Zipter98, o erro está acusando porque ele substituiu o arquivo errado, como pode ver no erro, ele substituiu o arquivo do globalevents, e colocou um do movements, onde não existe a função onTimer().

Por isso o erro.

Gosta do meu trabalho?

Curta e siga a página do meu projeto de 2016 e 2017 (Lab Z Games) que trará vários servidores OTServs.

 

Atenciosamente,
Adriano Swatt'

 

Para ver meus tutoriais acesse meu perfil.

 

cbCyOSZ.png

Link para o post
Compartilhar em outros sites

Há servidores, como o seu, que existe a função onTimer. Já, em outros servidores, esta função não existe ou adota o nome de onTime. Se você cria um arquivo com o callback onTimer num servidor que o correto seria onTime, vai acusar este erro que o autor postou. 

Editado por zipter98 (veja o histórico de edições)

não respondo pms solicitando suporte em programação/scripting

Link para o post
Compartilhar em outros sites

Eu fiz o que o zipter disse e sumiu o erro.

Porém, quanto ao funcionamento, os TPS abrem e talz, mas qdo eu passo sobre eles, nao teleporta. É como se andasse sobre ele normalmente.

 

@UP

 

tinha um errim aqui no AID.

Vou testar novamente corrigido.

 

 

Está ocorrendo o seguinte: mesmo com os storages, quando eu passo no TP q precisa dos storages, diz que eu não os tenho.

Editado por lolksky (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Há servidores, como o seu, que existe a função onTimer. Já, em outros servidores, esta função não existe ou adota o nome de onTime. Se você cria um arquivo com o callback onTimer num servidor que o correto seria onTime, vai acusar este erro que o autor postou. 

Sei disso, porém, acho que ele testou o script e pediu pra eu corrigir o script dos teleports.

Caso realmente não esteja cometendo o erro de por o arquivo movements em globalevents, realmente mudando a função onTime() resolverá.

 

#TOPICO:

Você adicionou as actionsID em movements.xml e registrou o script movements corretamente?

Editado por Adriano SwaTT (veja o histórico de edições)

Gosta do meu trabalho?

Curta e siga a página do meu projeto de 2016 e 2017 (Lab Z Games) que trará vários servidores OTServs.

 

Atenciosamente,
Adriano Swatt'

 

Para ver meus tutoriais acesse meu perfil.

 

cbCyOSZ.png

Link para o post
Compartilhar em outros sites

Que bom que ajudou.

Só vou pedir para clicar em "Melhor Resposta" pro tópico ficar como Solucionado.

Gosta do meu trabalho?

Curta e siga a página do meu projeto de 2016 e 2017 (Lab Z Games) que trará vários servidores OTServs.

 

Atenciosamente,
Adriano Swatt'

 

Para ver meus tutoriais acesse meu perfil.

 

cbCyOSZ.png

Link para o post
Compartilhar em outros sites

Se for outro script, sugiro que crie um tópico específico.

 

Estamos no aguardo.

Gosta do meu trabalho?

Curta e siga a página do meu projeto de 2016 e 2017 (Lab Z Games) que trará vários servidores OTServs.

 

Atenciosamente,
Adriano Swatt'

 

Para ver meus tutoriais acesse meu perfil.

 

cbCyOSZ.png

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.


  • Conteúdo Similar

    • Por luanluciano93
      Olá pessoal, estou desenvolvendo esse sistema vip para TFS 1.x, se precisarem de alguma função nova é só comentar, criei para usar em um servidor meu e resolvi postar, bom proveito a todos.
       
      É só ir no arquivo data/lib/core/player.lua e adicionar esse código no começo do script:
      -- ALTER TABLE `accounts` ADD `vip_time` BIGINT(20) NOT NULL DEFAULT 0; -- player:getVipTime() function Player.getVipTime(self) local resultId = db.storeQuery("SELECT `vip_time` FROM `accounts` WHERE `id` = '".. self:getAccountId() .."';") local time = resultId ~= false and result.getNumber(resultId, "vip_time") or 0 result.free(resultId) return time end -- player:isVip() function Player.isVip(self) return self:getVipTime() > os.time() and true or false end -- player:addVipDays(days) function Player.addVipDays(self, days) return(self:isVip() and tonumber((days * 86400))) and db.query("UPDATE `accounts` SET `vip_time` = '".. (self:getVipTime() + (days * 86400)) .."' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") or db.query("UPDATE `accounts` SET `vip_time` = '".. (os.time() + (days * 86400)) .."' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") end -- player:removeVipDays(days) function Player.removeVipDays(self, days) return(self:isVip() and tonumber((days * 86400))) and db.query("UPDATE `accounts` SET `vip_time` = '".. (self:getVipTime() - (days * 86400)) .."' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") or db.query("UPDATE `accounts` SET `vip_time` = '".. (os.time() - (days * 86400)) .."' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") end -- player:setVipDays(days) function Player.setVipDays(self, days) return db.query("UPDATE `accounts` SET `vip_time` = '".. (os.time() - (days * 86400)) .."' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") end -- player:removeVip() function Player.removeVip(self) db.query("UPDATE `accounts` SET `vip_time` = '0' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") end -- player:sendVipDaysMessage() function Player.sendVipDaysMessage(self) if self:isVip() then local vipTime = self:getVipTime() - os.time() local vipDays = 1 + (math.floor(vipTime / 86400)) return self:getVipTime() ~= false and self:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, 'You have '.. vipDays .. ' vip day(s) in your account.') end end -- player:checkVipLogin() function Player.checkVipLogin(self) if self:getVipTime() > 0 and not self:isVip() then return self:removeVip() and self:teleportTo(self:getTown():getTemplePosition()) end end  
       
      As funções são:
      • player:getVipTime() - Retorna o valor da tabela vip_time (igual esta na database).
      • player:isVip() - Retorna se o player é vip ou não.
      • player:addVipDays(days) - Usa-se em algum script para para adicionar dias de vip ao player (parâmetro de entrada "days").
      • player:removeVipDays(days) - Usa-se em algum script para para remover dias de vip do player (parâmetro de entrada "days").
      • player:setVipDays(days) - Usa-se em algum script para para mudar os dias de vip do player (parâmetro de entrada "days").
      • player:removeVip() - Usa-se em algum script para para remover todo tempo de vip do player.
      • player:sendVipDaysMessage() - Retorna uma mensagem no player mostrando os dias de vip que ainda restam ao player.
      • player:checkVipLogin() - Checa se a vip do player acabou, se sim teleporta ele para o templo.
       

      Qualquer dúvida ou erro/bug poste aqui.
    • Por Xagah
      Olá, bom dia a todos.
       
      Como tenho visto muitíssimos pedidos neste sentido, lhes apresento o LMS - Last Man Standing com BroadCast




       
    • Por Killua
      Como funciona?
      A cada monstro que vc mata, seus itens equipados ganham 1 de exp. Quando seus itens chegarem às quantidades de exp definidas, eles upam e ficam com o nome assim: Demon Helmet + 1. Helmets, armors, legs, e boots recebem 1 de arm a cada vez que upam. Armas recebem 1 de ataque e escudos 1 de defesa.
       
      Para o monstro contar, ele deve dar um mínimo de exp (definido no script). O número de exp a que me refiro é aquele um presente no arquivo .xml.
       
      Para instalar, crie Killua Items Upgrade.lua em data/creaturescripts/scripts e coloque:
        Em data/creaturescripts/creaturescripts.xml coloque essas duas tags:
      <event type="kill" name="Item level" event="script" value="Killua Items Upgrade.lua"/> <event type="login" name="Item levell" event="script" value="Killua Items Upgrade.lua"/> Configurando: Na tabela table_of_slots, coloque em quais slots os itens upam.
      min_exp é a experiência mínima que o monstro deve ter para contar exp para o item. Se vc colocar 500, somente os monstros que tem exp igual ou superior a 500 no arquivo.xml vão valer.
      exp_levels são os valores de exp que os itens devem atingir para upar. No meu caso, quando o item alcançar 50 de exp, ele upa para o level 1. Quando alcançar 50 de exp, upa para o level 2 e assim por diante.
    • Por Leohige
      Evento Loteria 
       
       
      Esse evento loteria é diferente dos demais que existem hoje nos servidores, é baseado em cima de um evento que ocorre no CraftLandia (um servidor de Minecraft).
      Quando o evento for iniciado o jogador poderá pagar um valor (configurável) para tentar acertar o número premiado (que vai de 1 até o número configurado). O evento tem um tempo de duração (configurável) e o primeiro jogador a acertar qual é o número premiado levará um premio em dinheiro (configurável) e o evento será encerrado.
       
      Demonstrações:
       
       
       
       
      Comandos:
       
       
      Configuração:
       
       
      Caso queira implementar este evento em seu servidor, crie os arquivos abaixo.
       
      data/lib/lottery/event.lua (as configurações ficam neste arquivo)
       
       
      data/globalevents/scripts/lottery.lua
       
       
      data/globalevents/globalevents.xml
       
      você pode por com um intervalo de tempo
       
       
      ou horário fixo
       
       
      data/talkactions/scripts/lottery.lua
       
       
      data/talkactions/talkactions.xml
       
       
      Tradução para PT-BR!
       
      Caso deseje traduzir o evento, substitua o Lottery.messages inteiro em data/lib/lottery/event.lua por este
       
       
      Qualquer problema, sugestão, bug ou dúvida utilize este tópico!!!
    • Por Sekk
      Bom, procurei esse Castle por MUITO TEMPO, mas não achei em NENHUM LUGAR DA INTERNET. Ontem, eu estava vendo alguns mapas do @Deathrocks, e vi nos prints, que o mapa possuia o evento que eu queria!
       
      Então baixei o mapa e extrai o evento, então venho lhes trazer!
       
       
      Nome: Castle 24H
      Cliente: 8.6
      Versão TFS: 0.4
      Tipo: Evento
       
      Bom, para começar, vamos em actions/scripts e crie 2 arquivos:
       
      castledoor1.lua
       
      castlewar1.lua
       
        Agora em actions.xml adicione as tags:
       
      Agora em monster/traps crie 3 arquivos:
       
      porta.xml
       
      protectcastle.xml  
      statue.xml  
      Agora em monsters.xml adicione as tags:    
      Vamos para movements/scripts e crie 2 arquivos:
       
      castlewar2.lua
       
      level.lua  
      Agora em movements.xml adicione as tags:  
       
      Pronto. Agora você só precisa baixar o mapa, inserir o mesmo ao seu servidor, configurar os teleports, e as hunts dentro do castle etc.
       
      PRINTS:
      1ª parte
       
      2ª parte:
       
      Obs.: Todos os ActionID e monsters já estão no mapa! Você só precisa configurar as coordenadas dos teleports, e o que possui no castle!
       
      Obs².: Tudo o que você pode configurar, já está escrito em cada script!
       
       
      Créditos:
      @DeathRocks
      PC98
      mapa.rar
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo