Npc travel por rota

Slicer
Por Slicer
em NPCs, monsters e raids
  • 1
  • 2

Slicer

Insanity
avatar
Príncipe
Príncipe

INFOS

Grupo: PríncipeRegistrado: 19/08/10Posts: 4014Gênero: Masculino

Ola galera, cabei de fazer um npc de travel que move o player por uma rota determinada no mapa editor! Peguei como base a ideia dos novos npcs de travel da pxg... Vamos la então...

 

1* Vão na pasta lib/ e criem um arquivo la com o nome Travel.lua, e coloquem isso dentro...

 

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

 

 

2* Vão na pasta npc/ e criem o arquivo .xml do npc... Vou deixar um exemplo aki...

 

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

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

</npc>

 

 

3* Vão na pasta npc/scripts/ e criem um arquivo la com o nome Water Travel.lua e colem isso dentro...

 

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 = 988, y = 1067, z = 7}] = {posIni = {x = 987, y = 1069, z = 7}, posFinal = {x = 947, y = 1110, z = 7}},
[{x = 945, y = 1112, z = 7}] = {posIni = {x = 947, y = 1111, z = 7}, posFinal = {x = 986, y = 1069, z = 7}},


[{x = 107, y = 77, z = 7}] = {posIni = {x = 110, y = 78, z = 7}, posFinal = {x = 81, y = 79, z = 7}},
[{x = 84, y = 77, z = 7}] = {posIni = {x = 81, y = 78, z = 7}, posFinal = {x = 110, y = 79, z = 7}},


[{x = 116, y = 60, z = 7}] = {posIni = {x = 119, y = 58, z = 7}, posFinal = {x = 72, y = 59, z = 7}},
[{x = 69, y = 62, z = 7}] = {posIni = {x = 72, y = 60, z = 7}, posFinal = {x = 119, y = 57, z = 7}},  
}

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 = 1440} or {lookType = 1439} --outfit q o player vai ganhar, a 1* eh female e a 2* eh male
local msg = msg:lower()
------------------------------------------------------------------------------
if msgcontains(msg, 'travel') then
  ------------------------- Se nao usarem um serv pokemon podem tirar essa parte! -------------------------------------------
  local storages = {17000, 63215, 17001, 13008, 5700}
  for s = 1, #storages do
   if getPlayerStorageValue(cid, storages[s]) >= 1 then
	  return selfSay("You can't do that while is Flying, Riding, Surfing, Diving or mount a bike!", cid) and true
   end
  end
  if #getCreatureSummons(cid) >= 1 then
  return selfSay("Return your pokemon!", cid) and true
  end
  --------------------------------------------------------------------------------------------------------------------------
  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())

 

 

Pronto, agora vamos as configurações...

 

Configuraçoes:

1* Aki vocês configuram as posições dos npcs e as posições iniciais e finais da rota q o player vai seguir:

 

local posis = {
--[pos do npc] = {pos inicial, pos final},
[{x = 988, y = 1067, z = 7}] = {posIni = {x = 987, y = 1069, z = 7}, posFinal = {x = 947, y = 1110, z = 7}},
[{x = 945, y = 1112, z = 7}] = {posIni = {x = 947, y = 1111, z = 7}, posFinal = {x = 986, y = 1069, z = 7}},


[{x = 107, y = 77, z = 7}] = {posIni = {x = 110, y = 78, z = 7}, posFinal = {x = 81, y = 79, z = 7}},
[{x = 84, y = 77, z = 7}] = {posIni = {x = 81, y = 78, z = 7}, posFinal = {x = 110, y = 79, z = 7}},


[{x = 116, y = 60, z = 7}] = {posIni = {x = 119, y = 58, z = 7}, posFinal = {x = 72, y = 59, z = 7}},
[{x = 69, y = 62, z = 7}] = {posIni = {x = 72, y = 60, z = 7}, posFinal = {x = 119, y = 57, z = 7}},  
}

 

 

2* Aki vocês configuram a outfit q o player vai ganhar quando começar o travel, podendo ser outfit de moto, carro, kaike e afins:

local outfit = getPlayerSex(cid) == 0 and {lookType = 1440} or {lookType = 1439} --outfit q o player vai ganhar, a 1* eh female e a 2* eh male

 

3* Caso não usem um servidor de pokemon, podem tirar essa parte...

 

------------------------- Se nao usarem um serv pokemon podem tirar essa parte! -------------------------------------------
  local storages = {17000, 63215, 17001, 13008, 5700}
  for s = 1, #storages do
   if getPlayerStorageValue(cid, storages[s]) >= 1 then
	  return selfSay("You can't do that while is Flying, Riding, Surfing, Diving or mount a bike!", cid) and true
   end
  end
  if #getCreatureSummons(cid) >= 1 then
  return selfSay("Return your pokemon!", cid) and true
  end
  --------------------------------------------------------------------------------------------------------------------------

 

 

4* Essa é a imagem de como vocês tem q configurar as rotas:

travellegenda.png

Para fazer as rotas usem a ferramenta 'No-Logout' do mapa editor... lembrando que as posições finais tambem tem que ter o piso no-logout!

Podem fazer a rota como quiserem, mas por favor, nao tentem 'forçar' o script.

 

 

Importante: O npc tem q tar imóvel, ele n pode se mover da posição que foi colocada na tabela no script Water Travel.lua!

Importante: Esse script foi inicialmente feito para travels na agua, mas eu testei aki e da pra fazer rotas na terra normalmente!

 

Importante: Quem for usar num servidor pokemon olhem o spoiler abaixo:

 

1* Vão no arquivo actions/scripts/goback.lua e achem essa parte...

if getPlayerStorageValue(cid, 17000) >= 1 or getPlayerStorageValue(cid, 17001) >= 1 or getPlayerStorageValue(cid, 63215) >= 1  then
  return true																													
end

e deixem assim...

if getPlayerStorageValue(cid, 17000) >= 1 or getPlayerStorageValue(cid, 17001) >= 1 or getPlayerStorageValue(cid, 63215) >= 1 or getPlayerStorageValue(cid, 75846) >= 1  then
  return true																													  
end

 

2* Vão no arquivo movements/scripts/surf.lua e logo abaixo dessa linha:

function onStepIn(cid, item, position, fromPosition)

coloquem isso..

if getPlayerStorageValue(cid, 75846) >= 1 then return true end

 

3* Caso usem a barra de pokemons do kpdo:

vão em lib/some functions.lua e achem isso...

function doGoPokemon(cid, item)

e façam a mesma coisa do '1*' ali emcima.

 

 

Espero que gostem, qualquer duvida ou bug podem postar aki, Vlw!

"Só a beira do abismo que os seres humanos acham forças para mudar."... E isso me da nojo... ¬¬

"Insanity is doing the exact... same fucking thing... over and over again expecting... shit to change... That. Is. Crazy." -Vass/Einstein

 

craigmabbit

avatar
Barão
Barão

INFOS

Grupo: BarãoRegistrado: 05/10/12Posts: 245

muito bom slicer, rep+

HesLife

avatar
Artesão
Artesão

INFOS

Grupo: ArtesãoRegistrado: 20/12/12Posts: 114

é de tibia?

Caronte

Ex-Moderador de Scripting
avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 25/09/10Posts: 1341Gênero: Masculino

Muito bom , se eu tivesse um servidor dedicado não hesitaria a colocar nele .

Reputado . ótimo tutorial como sempre e valeu pela dica no meu tutorial slicer :D

Slicer

Insanity
avatar
Príncipe
Príncipe

INFOS

Grupo: PríncipeRegistrado: 19/08/10Posts: 4014Gênero: Masculino

@HesLife

funciona em tibia sim.. soh q como soh tenhu serv de pokemon aki, eu fiz nele..

"Só a beira do abismo que os seres humanos acham forças para mudar."... E isso me da nojo... ¬¬

"Insanity is doing the exact... same fucking thing... over and over again expecting... shit to change... That. Is. Crazy." -Vass/Einstein

 

Gabriel Couto

Anyur
avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 22/04/11Posts: 2455Gênero: MasculinoChar no Tibia: Thyn Zare

Se você melhorar a formatação (por em codes), eu coloco no portal, bem interessante!

Gabriel Couto, 23 anos. Acadêmico de Medicina.

Ex-Diretor Geral do XTibia.

 

www.tibiatv.com.br

 

 

Slicer

Insanity
avatar
Príncipe
Príncipe

INFOS

Grupo: PríncipeRegistrado: 19/08/10Posts: 4014Gênero: Masculino

eu n coloquei em code pq iria fica bemmm grande o post mas... posso tentar por.. ;x

"Só a beira do abismo que os seres humanos acham forças para mudar."... E isso me da nojo... ¬¬

"Insanity is doing the exact... same fucking thing... over and over again expecting... shit to change... That. Is. Crazy." -Vass/Einstein

 

Gabriel Couto

Anyur
avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 22/04/11Posts: 2455Gênero: MasculinoChar no Tibia: Thyn Zare

eu n coloquei em code pq iria fica bemmm grande o post mas... posso tentar por.. ;x

 

Dentro dos spoilers é possível, não?

Gabriel Couto, 23 anos. Acadêmico de Medicina.

Ex-Diretor Geral do XTibia.

 

www.tibiatv.com.br

 

 

Huntre

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 23/02/11Posts: 157

Nossa esse script vai ajudar muita gente, parabéns cara nao teste ainda no meu serve mais certeza que vou utilizar ele mais pra frente.

Slicer

Insanity
avatar
Príncipe
Príncipe

INFOS

Grupo: PríncipeRegistrado: 19/08/10Posts: 4014Gênero: Masculino

pronto anyur ^^

 

vlw huntre essa eh ms a ideia ^^

"Só a beira do abismo que os seres humanos acham forças para mudar."... E isso me da nojo... ¬¬

"Insanity is doing the exact... same fucking thing... over and over again expecting... shit to change... That. Is. Crazy." -Vass/Einstein

 

picapau100

avatar
Artesão
Artesão

INFOS

Grupo: ArtesãoRegistrado: 22/07/12Posts: 121

Slicer..

 

to testando aqui e é o seguinte:

 

fiz aqui e so funcionou um lado da hunt

exemplo:

imagem.PNG

 

local posis = {

--[pos do npc] = {pos inicial, pos final},

[{x = 997, y = 1123, z = 7}] = {posIni = {x = 975, y = 1124, z = 7}, posFinal = {x = 1016, y = 1123, z = 7}},

[{x = 1015, y = 1121, z = 7}] = {posIni = {x = 1016, y = 1122, z = 7}, posFinal = {x = 975, y = 1125, z = 7}},

 

so ta funfando essa parte de baixo >> [{x = 1015, y = 1121, z = 7}] = {posIni = {x = 1016, y = 1122, z = 7}, posFinal = {x = 975, y = 1125, z = 7}},

 

o lado que tem uma Bola vermelha e o lado que ta funcionando e no lado azul

quando vc fala com o npc e depois travel,yes ai vc se teleporta para o lado vermelho que começa ir para o lado azul

 

e outra coisa quando vc ja ta de barco ou outra coisa e ja ta indo para o outro lado etc.. ai vc consegui deslogar, e quando

vc desloga vc pode andar na agua rsrs

 

 

flw ai ^^

Vinc

The white fox
avatar
Conde
Conde

INFOS

Grupo: CondeRegistrado: 30/10/11Posts: 625Gênero: Masculino

cara precisa melhora a identação do script,ta muito feio.e tbm precisa melhora o codigo em si

^w^

Slicer

Insanity
avatar
Príncipe
Príncipe

INFOS

Grupo: PríncipeRegistrado: 19/08/10Posts: 4014Gênero: Masculino

/\ eu uso OTScript Live! dai ja viu neh... ;/

"Só a beira do abismo que os seres humanos acham forças para mudar."... E isso me da nojo... ¬¬

"Insanity is doing the exact... same fucking thing... over and over again expecting... shit to change... That. Is. Crazy." -Vass/Einstein

 

picapau100

avatar
Artesão
Artesão

INFOS

Grupo: ArtesãoRegistrado: 22/07/12Posts: 121

ta Slicer /\

¬¬ mais ate agora nao respondeu oq eu falei em cima ¬¬

Slicer

Insanity
avatar
Príncipe
Príncipe

INFOS

Grupo: PríncipeRegistrado: 19/08/10Posts: 4014Gênero: Masculino

sinceramente n intendi nd q vc flo ;x

e tpw.. cuidado com esse npc ae.. ele eh grande e eh complicado pegar a pos 'real' dele...

"Só a beira do abismo que os seres humanos acham forças para mudar."... E isso me da nojo... ¬¬

"Insanity is doing the exact... same fucking thing... over and over again expecting... shit to change... That. Is. Crazy." -Vass/Einstein

 

  • 1
  • 2