Ir para conteúdo

Npc travel por rota


Slicer

Posts Recomendados

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!

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

  • 3 weeks later...

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 ^^

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...