Pasta Enciclopedia com todos os links de outros tutoriais !
http://www.xtibia.com/forum/Pasta-Data-Enc...r-E-t99746.html
Tutorial de Movements
Bem, inicialmente minha ideia era aderir movements e talk actions juntos. Porém as talk actions evoluiram nesses
3 meses de planejamento e trabalho arduo...
Infelizmente meus tutoriais, pelo menos os ultimos parecem que foram esquecidos, espero que esses futuros sejam uteis
para pelo menos 10 pessoas, que já valerá a pena.
Funções
Ao contrario das actions os movements possuem mais de uma função. Ela possue 4 funções são elas :
onStepIn = Ao andar emonStepOut = Ao sair de
onAddItem = Ao adicionar o item
OnRemoveItem = Ao remover o item
E fora algumas coisas que são apenas organizadas nos movements.xml
onStepIn e onStepOut
Essas funções foram por anos, suplicadas pelos scripters lua para a SVN, e apenas na RevBattleSys, elas foram atendidas.
Elas executam o script quando se movimenta sobre o tile ou item indicado, isso revolucionou os ots e quests antes sonhadas foram
possiveis.
Os dois tem a mesma sintaxe, a diferença é que um é executado ao pisar no item, e o outro ao sair dele.
function onStepIn(cid, item, position, fromPosition)
Onde :
cid: Creature Id, ou seja, o Player
item: Item executado na ação
position:Posição do player ou do item utilizado(normalmente os dois)
fromPosition: A posição que ele veio (OnStepIn) ou a posição que ele irá (onStepOut)
O modo de programa-lo é praticamente o mesmo das actions.
Bem depois de muitos tutoriais, usar um script facil, seria substimar a cabeça dos guerreiros que leram todos esses
longos tutoriais, então vamos aumentar o nivel de dificuldade:
--Function by Ta4e 28/09/2008-- --90% Arena quest in tibia rl-- --Version 3.0-- function onStepIn(cid, item, position, fromPosition) --Position of create a globet-- globet1 = {x=1215, y=869, z=7, stackpos = 1} globet2 = {x=1215, y=876, z=7, stackpos = 1} globet3 = {x=1215, y=883, z=7, stackpos = 1} ------------------------------------------------------------------------------------------------------------------------------------------------ if item.actionid == 5010 then doTransformItem(item.uid, 425) if getPlayerStorageValue(cid,5017) == -1 then local golden = doCreateItem(8698,1,globet1) doSetItemSpecialDescription(golden, 'Vencedor foi'..getPlayerName(cid)..'.') doSendMagicEffect(globet1,10) setPlayerStorageValue(cid,5017,1) else doSendMagicEffect(globet1,2) end elseif item.actionid == 5011 then doTransformItem(item.uid, 425) if getPlayerStorageValue(cid,5016) == -1 then local golden = doCreateItem(7370,1,globet2) doSetItemSpecialDescription(golden, 'Vencedor foi'..getPlayerName(cid)..'.') doSendMagicEffect(globet2,10) setPlayerStorageValue(cid,5016,1) else doSendMagicEffect(globet2,2) end elseif item.actionid == 5012 then doTransformItem(item.uid, 425) if getPlayerStorageValue(cid,5015) == -1 then local golden = doCreateItem(7371,1,globet3) doSetItemSpecialDescription(golden, 'Vencedor foi'..getPlayerName(cid)..'.') doSendMagicEffect(globet3,10) setPlayerStorageValue(cid,5015,1) else doSendMagicEffect(globet3,2) end end end
O script acima é o que faz o troféu da arena, não é tão avançado assim.
Ele faz ao se pisar no item com actionid 5010, 5011 ou 5012 executar as ações acima.
Ai ele transforma o item no item 425 (chão de dp "pisado"), checa se o player tem o storage, coloca uma
descrição especial e manda os efeito e os storage.
Acho que se você leu o tutorial de actions, você entende como fazer scripts com onStepIn e OnStepOut
Caso você saiba fazer actions e ache estranho isso, apenas pense :
Nas actions você imagine o script quando o player clicar em algo
Aqui é quando ele andar em algo, pisar ou sair (Otimos para armadilhas)
Aqui um script simples, porém pode ser util.
No caso ela se inspirou no script da Inquisition Quest, quando se mata o boss Ungreez. No caso apenas o que sair da sala
com mais exp leva o addon. Então eu criei esse script
De uma olhada no meu script da Demon Oak, pode te dar um pouco de inspiração (existem outros, porém não estou lembrando)
onAddItem e onRemoveItem
Essas ai já são diferentes, tem umas frescuras e você demorará para acostumar com algumas coisas.
A sintaxe dos dois é igual então :
function onAddItem(moveitem, tileitem, pos)
[cor=a]moveitem:[/color] O item que foi movido ou seja o escolhido para o script
[cor=a]tileitem:[/color] A "pica" do additem, ele é o item que receberá o outro item ou item principal.
[cor=a]pos:[/color] Posição do moveitem ou tileitem (depende de uma coisa)
Bem essa "pica" de tileItem, foi meio dificil de eu aprender, como sempre o meu amigo Soulblaster foi que descobriu
ainda na epóca do revBattleSys. E veja que não existe cid nele.
function onAddItem(moveitem, tileitem, pos) if moveitem.itemid == 2048 then doRemoveItem(moveitem.uid, 1) doTransformItem(tileitem.uid, 6280) end end
Esse script imbecil é o que faz o bolo pegar a vela e transforma-lo no outro bolo.
<movevent event="AddItem" tileitem="1" itemid="6279" script="cake.lua"/>
Veja a tag dele no movements.xml
Agora vou explicar
Quando se coloca tileitem = "1", esse item será o que recebe e o principal. No caso esse 6279 é o tileitem.
Veja que o bolo que é importante nesse script, ele só se transforma se receber a vela. Ao mover o item 2048 (vela)
no tileitem (o item 6279 indicado no movements), ele irá remover o moveitem (vela) e transforma o tileitem (bolo)
em bolo com vela (6280)
Veja que essa porcaria complica até um script de 3 linhas, e bem inutil como esse.
Entenda que não daria para fazer ao contrario. Como jogar o bolo na vela, por isso o bolo é o tileitem.
A maioria dos scripts o tileitem é 1, Outro exemplo é o scarab coin. Que quando você adiciona ele e está no fire
você é teleportado para o outro lado:
function onAddItem(moveitem, tileitem, pos) local checkpos = {x=1024, y=899, z=8, stackpos=253} local gopos = {x=1026, y=897, z=8, stackpos=253} local getcheck = getThingfromPos(checkpos) if moveitem.itemid == 2159 and tileitem.actionid == 5050 then doSendMagicEffect(pos,15) doRemoveItem(moveitem.uid, 1) if getcheck.itemid > 0 then doTeleportThing(getcheck.uid,gopos) doSendMagicEffect(gopos,10) doSendMagicEffect(checkpos,10) end end end
Esse já é maior, porém é facinho também
Se o moveitem for 2159(scarab coin) e o o tileitem tiver actionid 5050 (o coal, aquela bandeja verde) começa o script
Ele manda o efeito de fogo e remove o scarab coin.
Se o player tiver no fogo azul (pos checkpos) ele teleporta ele para a gopos e manda aquele efeito de teleport no local antigo.
Se não tiver nada lá ele apenas queima a moeda.
A tag do movements.xml é
<movevent event="AddItem" tileitem="1" actionid="5050" script="scarab.lua"/>
Aqui fuçando achei um exemplo que não é tileitem. A parchment quest do tio Soul (Primeiro script de movements que vi, isso em 4 foruns brasileiros
e internacionais).
---Criado por Soulblaster(Xtibia)--------7.8 function onRemoveItem(item, tileItem, pos) --editando as variaveis-- demonpos1 = {x=815, y=684, z=15} demonpos2 = {x=815, y=688, z=15} demonpos3 = {x=821, y=684, z=15} demonpos4 = {x=821, y=688, z=15} posicaoX = 818 posicaoY = 685 posicaoZ = 15 ----------------------- if pos.x == posicaoX and pos.y == posicaoY and pos.z == posicaoZ then doSummonCreature("Demon", demonpos1) doSummonCreature("Demon", demonpos2) doSummonCreature("Demon", demonpos3) doSummonCreature("Demon", demonpos4) end return 1 end
<movevent event="RemoveItem" tileitem="0" itemid="4857" script="parchment.lua" />
Ele tem algumas coisas maiores, porém funcionou lindamente. Ao remover o item (4857) da posição estipulada
ele sumona dos demons e deixa o cara lascado. Simples e facil de explicar. Porque não tem tileitem...
Espero que tenham entendido essa parte
No caso do RemoveItem é a mesma coisa, mesma regra
Aqui um ultimo scritp que engloba os dois scripts e pode dar ideias :
-- Ignore o nome tosco das variaveis function onAddItem(moveitem, tileitem, position) local pos1 = {x=918, y=703, z=12, stackpos = 1} local posi1 = getThingfromPos(pos1) if moveitem.itemid == 5995 and tileitem.actionid == 15030 then doSetItemActionId(posi1.uid,15031) end return TRUE end function onStepIn(cid, item, position, fromPosition) if item.itemid == 1387 and item.actionid == 15031 then macaco1 = getPlayerExperience(cid) setPlayerStorageValue(cid,15032,macaco1) local total = macaco1 - macaco if total >= 500 then setPlayerStorageValue(cid,15031,2) end elseif item.itemid == 1387 and item.actionid == 15032 then macaco = getPlayerExperience(cid) if getPlayerStorageValue(cid,15031) == -1 then setPlayerStorageValue(cid,15030,macaco) end end end
Claro que essa logica só funciona com uma sala unica e com apenas o ungreez. (dava para fazer com creatures scripts)
No caso quando o monstro morre (onAddItem e o id do corpo dele em tile com actionid 15030) o teleport ao final da sala
fica com uid 15031. E ai quando o player sai, o script checa a exp que ele tem.
Porém quando ele entrou na sala o script ja checou o exp dele, ai ele compara e ve se a diferença for 500 ou + ele adiciona
o storage necessario para o NPC.
Bem, isso será explicado melhor no tutorial de Mega Quests (ou algo parecido com esse nome)
Movements.xml
Para se declarar o script no movements.xml deve se estipular o nome do arquivo, item principal e evento:
<movevent event="StepIn" actionid="6015" script="dream.lua"/> <movevent event="StepOut" uniqueid="32193" script="dotile.lua" /> <movevent event="AddItem" tileitem="1" itemid="6279" script="cake.lua"/> <movevent event="RemoveItem" tileitem="0" itemid="4857" script="parchment.lua" />
Um exemplo de cada, isso é facil. Porém em movements.xml não se faz apenas declaração
Isso ficará mais claro com o tutorial de items, porém se você ja fuçou e manja um inglês tecnico matará isso facinho.
Se você é curioso, ja desceu o movements.xml e viu um monte de treco estranho.
São as funções
onEquipItem e onDeEquipItem
Essas funções são executadas quando o player se equipa ou desequipa de um item com o id estipulado
<movevent event="Equip" itemid="2195" slot="feet" function="onEquipItem"/>
Esse codigo faz o servidor perceber que esse item 2195 (boots of haste) faz algo especial, arrumado no item.xml
E também :
<movevent event="Equip" itemid="7886" slot="feet" function="onEquipItem"> <vocation name="Sorcerer"/> <vocation name="Master Sorcerer" showInDescription="0"/> <vocation name="Druid"/> <vocation name="Elder Druid" showInDescription="0"/> </movevent>
Nesse caso o item 7886 (sei lá) só poderá ser usado em sorcerer,master ou druid e elder.
E esse showInDescription é aquela mensagem quando se da look, dizendo que ela só pode ser usada em sorcerer ou druid. No caso
ela não mostrará que master e elder podem usar, o que seria idiota. O default delá é 1.
No caso apenas essas vocações poderão usar o item, ou no minimo ter os efeitos certos (não me lembro se só bloquea o item ou
não deixa nem o player colocar)
Bem para ajudar esse slot é o local, então eles são
feet - slot da botaright hand - mão direita
left hand - mão esquerda (a do player não a sua)
legs - Pernas
armor - peito
head - cabeça
ring - anel
neckacle - colar
A do arrow deve ser arrow e da backpack o mesmo. (eu acho, to sem sources para verificar)
E quando você for mudar o slot da mão, lembre se de programar as duas.
<movevent event="DeEquip" fromid="8905" toid="8909" slot="right-hand" function="onDeEquipItem"/> <movevent event="Equip" itemid="8900" slot="left-hand" level="30" function="onEquipItem"> <vocation name="Sorcerer"/> <vocation name="Master Sorcerer" showInDescription="0"/> <vocation name="Druid"/> <vocation name="Elder Druid" showInDescription="0"/> </movevent> <movevent event="DeEquip" itemid="8900" slot="left-hand" function="onDeEquipItem"/> <movevent event="Equip" itemid="8900" slot="right-hand" level="30" function="onEquipItem"> <vocation name="Sorcerer"/> <vocation name="Master Sorcerer" showInDescription="0"/> <vocation name="Druid"/> <vocation name="Elder Druid" showInDescription="0"/> </movevent>
E sempre use o DeEquip e Equip e os dois slots!
Bem espero que seja util esse breve tutorial, e você guerreiro que anda lendo essa monte de porcaria
consiga fazer algo e aprender.
Peço que comentem, deem sugestões no meu SACO (Serviço de Antendimento ao Cliente hOnorario[Já pensaram besteira]), e me ajudem a melhorar isso.
Esperem os proximos, que devido a falta de tempo podem demorar, mais sempre terá essa qualidade (é uma porcaria, mais sei que vocês ama!!!)