Ir para conteúdo
  • Cadastre-se

(Resolvido)NPC - TRAVEL (COM ANIMAÇÃO)


Ir para solução Resolvido por LeoTK,

Posts Recomendados

Boa Tarde TibiaKing!!!

 

Bom estou precisando arrumar um script, não deve ser muito difícil !! (pra quem sabe :) !)

Quem poder ajudar já agradeço.

 

Resumindo apartir do momento que falo Travel, Yes para o npc ele me teleporta para posicao inicial me transformando(LookType) e precisa me levar até o destino final. (posFinal)

até ai tudo bem problema que ele comeca a funcionar e me leva para lugar aleatorio e fica parado lá imovel. ( não da erro na Distro ) Apenas fico parado na LookType de barco.

 

Uso tfs 0.4 8.60
 

local posis = {
--[pos do npc] = {pos inicial, pos final},
[{x = 115, y = 143, z = 10}] = {posIni = {x = 114, y = 134, z = 10}, posFinal = {x = 76, y = 134, z = 10}},
[{x = 74, y = 132, z = 10}] = {posIni = {x = 76, y = 134, z = 10}, posFinal = {x = 95, y = 147, z = 10}},
}

 

 é um NPC

 

 

.LUA DO NPC

Spoiler

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid)
     posInicial = nil
     posFinal = nil
     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
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
---------------------- CONFIGS --------------------------------------
local posis = {
--[pos do npc] = {pos inicial, pos final},
[{x = 115, y = 143, z = 10}] = {posIni = {x = 114, y = 134, z = 10}, posFinal = {x = 76, y = 134, z = 10}},
[{x = 74, y = 132, z = 10}] = {posIni = {x = 76, y = 134, z = 10}, posFinal = {x = 95, y = 147, z = 10}},
}

for npcPos, pos in pairs(posis) do
if isPosEqual(getThingPos(getNpcCid()), npcPos) then
   posInicial = pos.posIni  
   posFinal = pos.posFinal
   break
end
end
if not posInicial then selfSay("A error has occored!", cid) print("A error has occored, npc travel aren't in the correct place!") return false end

local outfit = getPlayerSex(cid) == 0 and {lookType = 880} or {lookType = 880} --outfit q o player vai ganhar, a 1* eh female e a 2* eh male
local msg = msg:lower()
------------------------------------------------------------------------------
if msgcontains(msg, 'travel') then
  selfSay("Are you sure do you want to travel?", cid)
  talkState[talkUser] = 1
  return true
elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'Yes')) and talkState[talkUser] == 1 then
  selfSay("Ok then, good travel!", cid)
  doTeleportThing(cid, posInicial, false)
  doSendMagicEffect(getThingPos(cid), 21)
  mayNotMove(cid, true)
  setPlayerStorageValue(cid, 75846, 1)
  doSetCreatureOutfit(cid, outfit, -1)
  moveTravel(cid, posFinal)
  talkState[talkUser] = 0
  return true
end
return true
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

LIB - TRAVEL.LUA

Spoiler

function isPosEqual(pos1, pos2)
  if pos1.x == pos2.x and pos1.y == pos2.y and pos1.z == pos2.z then
     return true
  end    
return false
end

function isPosInArray(array, pos)
if not next(array) then return false end
for i = 1, #array do
if isPosEqual(pos, array[i]) then
   return true
end
end
return false
end

function moveTravel(cid, posFinal, oldPos)
if not isPlayer(cid) then return true end
local pos = getThingPos(cid)
local oldPos = oldPos or {}
if isPosEqual(pos, posFinal) then
  moveTravel(cid, {x=0, y=0, z=0}, oldPos)
  doRemoveCondition(cid, CONDITION_OUTFIT)
  doSendMagicEffect(getThingPos(cid), 21)
  mayNotMove(cid, false)
  setPlayerStorageValue(cid, 75846, -1)
  return true
end
for i = 0, 7 do
local newPos = getPosByDir(pos, i)                                  
if not isPosInArray(oldPos, newPos) and getTileInfo(newPos).nologout then
   doTeleportThing(cid, newPos, true)
   table.insert(oldPos, pos)
   if isPosEqual({x=0, y=0, z=0}, posFinal) then return true end
   addEvent(moveTravel, 150, cid, posFinal, oldPos)
   return true
end
end
return false
end

 

 

 

,XML
 

Spoiler

<?xml version="1.0" encoding="UTF-8"?>
<npc name="Nave" script="viaja.lua" walkinterval="350000" floorchange="0" speed="0" lookdir="2">
<health now="150" max="150"/>
<look type="881" head="10" body="15" legs="20" feet="25"/>

<parameters>
    <parameter key="message_greet" value="Hi, you would like to {travel}?."/>
</parameters>

</npc>

Link para o post
Compartilhar em outros sites
  • Moderador

Este tópico foi movido para a seção de Suporte Otserv.

29 minutos atrás, Maniaco disse:

até ai tudo bem problema que ele comeca a funcionar e me leva para lugar aleatorio e fica parado lá imovel. ( não da erro na Distro ) Apenas fico parado na LookType de barco.

 

cara eu fraguei +/- a idéia, você consegue fazer um video explicando como está, e como deveria funcionar? ou alguma imagem que exemplifique pf?

Link para o post
Compartilhar em outros sites
Em 24/07/2022 em 18:19, FeeTads disse:

Este tópico foi movido para a seção de Suporte Otserv.

 

cara eu fraguei +/- a idéia, você consegue fazer um video explicando como está, e como deveria funcionar? ou alguma imagem que exemplifique pf?

@FeeTads Video:
 

 

Editado por Maniaco (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Solução
Em 25/07/2022 em 18:40, Maniaco disse:

@FeeTads Video:
 

 

 

Salve demorou mas consegui achar ta ai bro

 

 

é um MOD okCrie um arquivo na pasta mod e coloque esse código

 

Spoiler



<?xml version="1.0" encoding="UTF-8"?>
<mod name="BoatSystem" enabled="yes" author="MatheusMkalo" forum="XTibia.com">

<config name="BoatSystemLib"><![CDATA[
mydirs= {
   [1] = {type = 1, ids = {3587, 3590, 3591}, xy = {0, -1}},
   [2] = {type = 2, ids = {3592, 3595, 3596}, xy = {1, 0}},
   [3] = {type = 1, ids = {3587, 3590, 3591}, xy = {0, 1}},
   [4] = {type = 2, ids = {3592, 3595, 3596}, xy = {-1, 0}}
}

allids = {3587, 3590, 3591, 3592, 3595, 3596}

function newEndb(endb, dir)
   local xx = endb.x
   local yy = endb.y
   for i = 1, #dir do
       xx = xx+mydirs[dir[i]].xy[1]
       yy = yy+mydirs[dir[i]].xy[2]
   end
   return {x=xx, y=yy, z=endb.z}
end

function doMoveBoat(post, dir, cid)
   local newboat = {}
   for i,s in ipairs(post) do
       local backu = getThingPos(s)
       doRemoveItem(s, 1)
       doCreateItem(mydirs[dir].ids[i], 1, {x=backu.x+mydirs[dir].xy[1], y=backu.y+mydirs[dir].xy[2], z=backu.z})
       table.insert(newboat, getThingFromPos({x=backu.x+mydirs[dir].xy[1], y=backu.y+mydirs[dir].xy[2], z=backu.z, stackpos=1}).uid)
   end
   if mydirs[dir].type ~= post.type and mydirs[dir].type == 1 then
       doCreateItem(getThing(newboat[1]).itemid, 1, {x=getThingPos(newboat[1]).x+1, y=getThingPos(newboat[1]).y-1, z=getThingPos(newboat[1]).z})
       doRemoveItem(newboat[1], 1)
       doCreateItem(getThing(newboat[3]).itemid, 1, {x=getThingPos(newboat[3]).x-1, y=getThingPos(newboat[3]).y+1, z=getThingPos(newboat[3]).z})
       doRemoveItem(newboat[3], 1)
   elseif mydirs[dir].type ~= post.type and mydirs[dir].type == 2 then
       doCreateItem(getThing(newboat[1]).itemid, 1, {x=getThingPos(newboat[1]).x-1, y=getThingPos(newboat[1]).y+1, z=getThingPos(newboat[1]).z})
       doRemoveItem(newboat[1], 1)
       doCreateItem(getThing(newboat[3]).itemid, 1, {x=getThingPos(newboat[3]).x+1, y=getThingPos(newboat[3]).y-1, z=getThingPos(newboat[3]).z})
       doRemoveItem(newboat[3], 1)
   end
   if cid then
       doTeleportThing(cid, {x=getCreaturePosition(cid).x+mydirs[dir].xy[1], y=getCreaturePosition(cid).y+mydirs[dir].xy[2], z=getCreaturePosition(cid).z}, false) 
   end
end

function getPosBoat(cid, pos)
   local pcid = not pos and getCreaturePosition(cid) or pos
   local check = getThingFromPos({x=pcid.x, y=pcid.y, z=pcid.z, stackpos=1}).itemid == mydirs[1].ids[2] and 1 or 2
   if check == 1 then
       return {getThingFromPos({x=pcid.x, y=pcid.y-1, z=pcid.z, stackpos=1}).uid, getThingFromPos({x=pcid.x, y=pcid.y, z=pcid.z, stackpos=1}).uid, getThingFromPos({x=pcid.x, y=pcid.y+1, z=pcid.z, stackpos=1}).uid, type = check}
   elseif check == 2 then
       return {getThingFromPos({x=pcid.x-1, y=pcid.y, z=pcid.z, stackpos=1}).uid, getThingFromPos({x=pcid.x, y=pcid.y, z=pcid.z, stackpos=1}).uid, getThingFromPos({x=pcid.x+1, y=pcid.y, z=pcid.z, stackpos=1}).uid, type = check}
   end
return false
end

function reverse(t)
   local result = {}
   for i = #t, 1, -1 do
       table.insert(result, t[i] == 1 and 3 or t[i] == 2 and 4 or t[i] == 3 and 1 or t[i] == 4 and 2)
   end
return result
end

]]></config>

<movevent type="StepIn" actionid="6616" event="script"><![CDATA[
   domodlib("BoatSystemLib")
   local t = {4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}
   local postart = {x=968, y=1001, z=7, stackpos=1}
   local posback = {x=994, y=978, z=7, stackpos=1}
   local delay = 350
   if toPosition.x == posback.x and toPosition.y == posback.y then
       doCreatureSetNoMove(cid, true)
       for i = 1, #reverse(t) do
           addEvent(function() doMoveBoat(getPosBoat(cid), reverse(t)[i], cid) end, i*delay)
       end
       addEvent(doCreatureSetNoMove, delay*#reverse(t)+100, cid, false)
       addEvent(function() doItemSetAttribute(getThingFromPos(postart).uid, "aid", 6616) end, delay*#t+100)
   elseif toPosition.x == postart.x and toPosition.y == postart.y then
       doCreatureSetNoMove(cid, true)
       for i = 1, #t do
           addEvent(function() doMoveBoat(getPosBoat(cid), t[i], cid) end, i*delay)
       end
       addEvent(doCreatureSetNoMove, delay*#t+100, cid, false)
       addEvent(function() doItemSetAttribute(getThingFromPos(posback).uid, "aid", 6616) end, delay*#t+100)
   end
]]></movevent>

<movevent type="StepIn" actionid="6617" event="script"><![CDATA[
   domodlib("BoatSystemLib")
   if not isInArray(allids, getThingFromPos({x=toPosition.x, y=toPosition.y, z=toPosition.z, stackpos=1}).itemid) then
       doTeleportThing(cid, fromPosition, false)
   end
]]></movevent>

</mod>


 

 

 

Agora as configurações
 

local t = {4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}
local postart = {x=968, y=1001, z=7, stackpos=1}

local posback = {x=994, y=978, z=7, stackpos=1}

local delay = 350

 

No local t, sao todas as direçoes que o barco vai andar, em sentido horario:

1 = norte

2 = leste

3 = sul

4 = oeste

No local postart eh a posiçao que o meio do barco vai estar quando ele estiver indo para algum lugar.

No local posback eh a posiçao que o meio do barco vai estar quando ele estiver voltando.

O delay eh o tempo em milesegundos que demora pra o barco andar.

Adicionando no Map editor:

Faça 3 sqms do id 4820.

Adicione o actionid 6617 nesses sqms.

Faça 3 ids de barco, voce escolhe se eh o virado para cima ou para o lado.

Bote o actionid 6616 no meio do barco.

OBS: PONHA OS SQMS DA ROTA PARA NAO PODER LOGA SE ALGUEM LOGA NO BARCO VAI DAR BUG

 

@Maniaco

 

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

Compre seus Scripts Agora totalmente seguro e de forma rápida, aceitamos também encomendas.

discord.gg/phJZeHa2k4

 

Projeto ATS (Naruto)

Informações Abaixo

Facebook

Youtube
Discord

 

Tutoriais / Conteúdos

Clique Aqui

Link para o post
Compartilhar em outros sites
1 minuto atrás, LeoTK disse:

Isso é apenas um teleport do player para uma área e change outfit para mudar para a outfit da nave ai o player anda até os locais que estiver e depois remove o change outfit voltando a outfit que o player estava antes...

Problema que ele simplesmente não vai para o lugar certo '0'

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 Maniaco
      Salve TibiaKing!!! TFS 0.4 . 8.60
       
      Estou implementando o Sistema do @WooX de Cave Exlusiva

      Link:
       
      Porem estou com um problema seguindo o tutorial completo dele acabo tendo um retorno de erro na Distro! E ja que o mesmo nao entra no forum deis de 14/01! Venho solicitar ajuda de vocês!
      Caso alguem tenha o Discord Dele Favor me Passe  
      Vamos lá!
      Erro:
       
      Script :
       
      Lib
       
       
      Print Rme:
       
       
      Lembrando que nao esta funcionando em geral, Acrédito que eu tenha pulado algo ou deixado passar despercebido!
      Espero que alguem consiga me ajudar vlw!
    • Por MatteusDeli
      Nesse tópico você irá aprender a diferença entre ItemID, ActionID e UniqueID na criação de scripts.
       
      Primeiramente vamos começar com o ItemID, imagine que você está criando um simples script que o player pode ter acesso a uma área VIP, só que para ele entrar, primeiro precisará passar por um tile especial que possui o ID 471, até aqui tudo bem, só que qualquer player do servidor irá ter acesso também, já que não possui nenhuma restrição.
       
      Como poderíamos resolver isso?
       
      É aqui que entra a função da ActionID, com ela podemos dizer que os tiles que tiverem o valor 1000 no atributo ActionID, serão os tiles referentes a área VIP. Agora temos uma maneira de diferenciar os tiles comuns dos que são VIPs, veja como ficaria:
       

      (tiles sem as ActionIDs no valor de 1000)
       
      Repare que os 3 tiles tem apenas o atributo ItemID: [471]. Todos os players poderiam passar sem problemas… Caso você use apenas esse tipo de tile para as suas áreas VIPs então não tem problema, agora se você usa esses mesmos tiles para outras finalidades, então você precisará recorrer a ActionID, para que assim consiga diferenciá-los.
       
      Vamos adicionar as ActionIDs então:
       

      (tiles com as ActionIDs adicionados no valor de 1000)
       
      Pronto, agora apenas esse tiles terão a função de controlar a entrada para a área VIP!
       
      Bom, então você deve estar se perguntando, aonde que o UniqueID entra nessa história?
       
      O UniqueID é parecido com a ActionID com apenas uma diferença. O valor que você define para ele deve ser único para o servidor inteiro, caso ele se repita aparecerá um aviso na sua distro, mais ou menos como este…
       

       
      Repare quantos UniqueIDs duplicados existem, isso é ruim porque quanto mais tiver mais tempo demorará para o servidor iniciar, entre outras coisas como conflitos de scripts.
       
      Concluindo…
       
      O ItemID é usado quando você quer que todos os itens com esse ID façam uma ação, por exemplo a fishing rod, qualquer player pode comprar uma no NPC e começar a pescar.
       
      A ActionID é usado geralmente quando você quer diferenciar os mesmos itens um dos outros. Eu tenho 2 crystal rings só que apenas um deles vai me curar 500 de vida quando usá-lo.
       
      O UniqueID é quando você quer definir um ID único para um determinado item e só terá apenas um dele no servidor, um exemplo seria uma estátua que vai dar ao player um determinado item e só existirá somente uma dela no jogo.
       
      Tentei ser o mais breve e direto sobre esse assunto, espero que tenha ficado claro… Agora é só praticar!
    • Por FlameArcixt
      ?HORDER LEADER SYSTEM?
      Já vou me adiantando, fiz o script mas não sou programador, testei varias e varias vezes aqui e deu certo, se não der ai eu não ofereço suporte, sorry, se algum programador quiser melhorar o código fica a vontade.
      Como Funciona: Um monstro especial "Boss", quando você targeta nele, ele Cria vários outros monstros mais fracos para ajudar ele. só fiz esse script pra contribuir aqui no tk.
      ?Em data\creaturescript\creaturescript.xml registre?
      ?Em data\creaturescript\script crie um arquivo com nome "target.lua" e cole o código?
      ?Para isso funcionar, você deve registrar os eventos nos monstros que você for usar EX: ?
      O que mudei no script desde o beta? simples, agora só vai spawnar se o monstro levar dano, e a storage global só volta a -1 se o monstro morrer.
      Prováveis problemas? sim, o script foi feito para boss, ou seja, se tiver mais de dois boss no mapa pode dar problema, por exemplo, um boss é atacado e a storage fica ativada, mas ele não é morto então não desativa a storage, se você for matar o outro boss, os monstros não irão nascer, pois a storage já vai estar ativada, ou seja, deixe apenas um boss por vez.
      Só isso mesmo, suporte só com 10zão no pixpobre?
      Agradecimentos ao @Vodkart(Ajudou muito com erros/ediçoes).
    • Por Erimyth
      Fala galerinha eu estava e um amigo meu me pediu um script de health e mana por talkaction por MSN, fiz ele e resolvi postar-lo aqui no TK para a galera usar-lo.

      Vá em data > talkactions > talkactions.xml e adicione a seguinte tag:

      <talkaction words="!buyhealth;!buymana" event="script" value="buylife.lua">
      Agora vá até a pasta scripts dentro de talkactions, crie um arquivo chamado buylife.lua com isto dentro:
      -- [( Script created by Matheus for TibiaKing.com )] -- function onSay(cid, words, param) local health = 1000 -- Vida que será adicionada ao player após ele usar o comando! local mana = 1000 -- Mana que será adicionada ao player após ele usar o comando! local cost = 10000 -- Preço para você comprar mana ou health! if (words == "!buymana") then if (doPlayerRemoveMoney(cid, cost) == TRUE) then doCreatureAddMana(cid, mana) doSendMagicEffect(getCreaturePosition(cid), 12) else doPlayerSendCancel(cid, "Sorry, you need "..cost.." gold coins to buy mana.") return TRUE end elseif (words == "!buyhealth") then if (doPlayerRemoveMoney(cid, cost) == TRUE) then doCreatureAddHealth(cid, health) doSendMagicEffect(getCreaturePosition(cid), 12) else doPlayerSendCancel(cid, "Sorry, you need "..cost.." gold coins to buy mana.") end return TRUE end end
      Prontinho, espero que gostem, é um script bem simples mas pode ser útil para alguns.  
        Você gostou deste conteúdo!? Este conteúdo te ajudou!? Isso será realmente útil pra você!? Então, se possível, faça uma doação (de qualquer valor) que estará me ajudando também!  
    • Por Gustavo Ferreira
      Olá galerinha do TibiaKinG,
       

       
       
       
       
       
      Hoje trago a vocês o script do Castle War 24horas vendido por algumas empresas, Vou postar o script e vocês configurem do gosto de vocês!
       
      Segue Abaixo o Link
       
       
      #Caracteristicas
       
      - Disponível para Linux ou Windows;
      - Mapa completo (Castle);
      - Avisos de invasores ao castle (2 configurados);
      - Somente players com guild tem acesso;
      - Fácilidade na configuração apenas em um arquivo;
      - Configuração de início por dia e hora;
       
       
      Link >  http://www.mediafire.com/download/99n461m4bbrbi46/[DS]_Castle_War.rar
       
       
      Não dou suporte para o script, o mesmo já foi testado e funciona, Configurem do seus gostos!
       
       
      Att~~Gustavo
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo