HiHo!
Como prometido, escrevi o tutorial de Movements =) Bom... demorei 5 horas pra escrever isso. Eu sei que o número de pessoas que vai ler isso com intusiasmo e interesse eh quase nulo mas se eu conseguir ajudar uma pessoa apenas já estou feliz =)
Provavelmente você não vai intender tudo da primeira vez que você ler (talvez nem da segunda) pois eh muita coisa para aprender. Leia com atenção, com calma, com carinho ( =p ), analise vários scripts/movements (todos que ver na frente de preferência \o/) e o mais importante: tenha persistência Tentei facilitar ao máximo, tentei organizar mais porém se eu sintetizasse mais iria perder conteúdo =x... Se você ainda tiver alguma dúvida me mande uma pm ou poste aki mesmo =p Ficarei feliz em te ajudar a resolver seu problema.
Se você não souber programar em lua ou não conhecer direito as funções do SVN(antigo CVS) dê uma olhadinha no tutorial de actions do colex primeiro. Olhar aqui antes de ter experiência com actions provavelmente não irá adiantar muita coisa =)
PS .: Faço apenas um pedido, se você for postar esse tutorial em outro lugar me mande uma pm me contando onde que eu mando o tópico até com o BBC pra não precisar reformatar tudo =)
Pergunta ~> Tá... Vou ler um tutorial de Movements, mais o que isso faz?!?
Resposta ~> Toda vez que você movimentar alguma coisa (itens, você mesmo, outros players - enfim, todo tipo de movimento) ou criar itens em algum lugar (ex. criar firefields) poderá acontecer alguma coisa. Podemos configurar BoH, rings com movements, adicionar damage nos fields, configurar traps e muuuito mais =)
Começaremos analizando o movements.xml (data/movements/)
Vamos estudá-lo um pouco:
Para cada event você vai usar um argumento < (...) >. Por isso vamos estudar movements divididos em seções - events.<?xml version="1.0"?><movements>
<movevent event="EVENT" (... argumentos ...) />
</movements>
</xml>
EVENTS:
<movevent event="StepIn" (...) />
Usada quando o player mover para alguma coisa. Corresponde à antiga função de actions OnWalkIn
Argumentos:
itemid/uniqueid/actionid ~> use apenas um deles, nunca mais de um (se usar itemid não use uniqueid, se usar actionid não use itemid, etc). Quando o player andar em cima de um item com itemid/uniqueid/actionid X, executar o movement.
script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde, não se preocupe =). Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player pisa em algum item de itemid/uniqueid/actionid X
Exemplo: <movevent event="StepIn" itemid="1487" script="arquivo.lua" />
<movevent event="StepOut" (...) />
Usada quando o player mover para fora (sair de cima) de um item X. Corresponde à antiga função para actions OnWalkOut
Argumentos:
itemid/uniqueid/actionid ~> use apenas um deles, nunca mais de um (se usar itemid não use uniqueid, se usar actionid não use itemid, etc). Quando o player mover pra fora de um item com itemid/uniqueid/actionid X, executar o movement.
script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde, não se preocupe =). Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player "sai" de cima de algum item de itemid/uniqueid/actionid X
Exemplo: <movevent event="StepOut" itemid="1487" script="arquivo.lua" />
<movevent event="Equip" (...) />
Usada quando o player colocar um equipamento no corpo(pro corpo, não para a bp =p) em algum slot
Argumentos:
itemid/uniqueid/actionid ~> use apenas um deles (se usar itemid não use uniqueid ou actionid). Quando o player mover um item de itemid/uniqueid/actionid X para o corpo, executar o movement.
script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde, não se preocupe =). Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player "veste" algum item de itemid/uniqueid/actionid X.
slot ~> o slot (mão, pé, corpo, etc) que o item deverá ficar pra executar a ação. Pode ser:
.: head ~> cabeça
.: necklace ~> colar
.: backpack ~> slot da backpack
.: armor ~> armadura
.: right-hand ~> mão direita
.: left-hand ~> mão esquerda
.: legs ~> calça
.: feet ~> pé
.: ring ~> rings (anéis)
Exemplo: <movevent event="Equip" itemid="2168" slot="ring" script="arquivo.lua" />
<movevent event="deEquip" (...) />
Usada quando o player retirar um equipamento de um certo slot do corpo
Argumentos:
itemid/uniqueid/actionid ~> use apenas um deles (se usar itemid não use uniqueid ou actionid). Quando o player mover um item de itemid/uniqueid/actionid X para fora do corpo, executar o movement.
script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde. Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player tira algum item de itemid/uniqueid/actionid X do corpo.
slot ~> o slot (mão, pé, corpo, etc) que o item deverá ficar pra executar a ação. Pode ser:
.: head ~> cabeça
.: necklace ~> colar
.: backpack ~> slot da backpack
.: armor ~> armadura
.: right-hand ~> mão direita
.: left-hand ~> mão esquerda
.: legs ~> calça
.: feet ~> pé
.: ring ~> rings (anéis)
Exemplo: <movevent event="DeEquip" itemid="2168" slot="ring" script="arquivo.lua" />
<movevent event="AddItem" (...) />
Usada quando o player adicionar um item x em algum tile (mover de um tile pro outro, quando o player taca uma runa de field ofensiva em alguém)
Argumentos:
itemid/uniqueid/actionid ~> use apenas um deles (se usar itemid não use uniqueid ou actionid). Quando o player "criar" um item de itemid/uniqueid/actionid X, executar o movement.
script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde. Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player adiciona/move alguma coisa pro tile.
tileitem ~> pode ser 0(false - desativado) ou 1(true - ativado). Se for 0, o script é executado assim que você move/cria o item no chão. Se for 1, o script só é adicionado quando você taca outro item em cima do item de itemid/uniqueid/actionid X
Exemplo: <movevent event="AddItem" tileitem="0" itemid="2424" script="script.lua" />
<movevent event="RemoveItem" (...) />
Usada quando o player remover um item x (mover de um tile pro outro, usar destroy field)
Argumentos:
itemid/uniqueid/actionid ~> use apenas um deles (se usar itemid não use uniqueid ou actionid). Quando o player "remover/tirar" um item de itemid/uniqueid/actionid X de um tile, executar o movement.
script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde. Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player tira algum item de itemid/uniqueid/actionid X do corpo.
tileitem ~> pode ser 0(false - desativado) ou 1(true - ativado). Se for 0, o script é executado assim que você move/cria o item no chão. Se for 1, o script só é adicionado quando você tira outro item de cima do item de itemid/uniqueid/actionid X
Exemplo: <movevent event="RemoveItem" tileitem="0" itemid="2424" script="script.lua" />
ARQUIVOS.LUA:
Nas actions o modelo básico é:
Porém em movements o modelo depende do Event adicionado no xml. Cada event tem seu modelo básico... Irei explicar um por um.function onUse(cid,item,frompos,item2,topos)return 1
end
StepIn
Seu modelo básico é:
Argumentos:function onStepIn(cid, item, pos)-- aqui ficam as instruções
return 1
end
.: cid ~> o UID do player que andou em cima de item;
.: item ~> o item que o player cid pisou. Possui: item.uid, item.itemid, item.type, item.actionid
.: pos ~> a posição do item que o player cid pisou
StepOut
Seu modelo básico é:
Argumentos:function onStepOut(cid, item, pos)-- aqui ficam as instruções
return 1
end
.: cid ~> o UID do player que saiu de cima de item;
.: item ~> o item que o player cid saiu. Possui: item.uid, item.itemid, item.type, item.actionid
.: pos ~> a posição do item que o player cid saiu
Equip
Seu modelo básico é:
Argumentos:function onEquip(cid, item, slot)-- aqui ficam as instruções
end
.: cid ~> o UID do player que "vestiu" o item;
.: item ~> o item que o player cid "vestiu". Possui: item.uid, item.itemid, item.type, item.actionid
.: slot ~> o lugar do corpo que o item foi colocado. Pode ser:
.:. 1 ~> cabeça
.:. 2 ~> colar
.:. 3 ~> slot da backpack
.:. 4 ~> armadura
.:. 5 ~> mão direita
.:. 6 ~> mão esquerda
.:. 7 ~> calça
.:. 8 ~> pé
.:. 9 ~> anel
DeEquip
Seu modelo básico é:
Argumentos:function onDeEquip(cid, item, slot)-- aqui ficam as instruções
end
.: cid ~> o UID do player que tirou o item do corpo;
.: item ~> o item que o player cid tirou do corpo. Possui: item.uid, item.itemid, item.type, item.actionid
.: slot ~> o lugar do corpo que o item foi retirado. Pode ser:
.:. 1 ~> cabeça
.:. 2 ~> colar
.:. 3 ~> slot da backpack
.:. 4 ~> armadura
.:. 5 ~> mão direita
.:. 6 ~> mão esquerda
.:. 7 ~> calça
.:. 8 ~> pé
.:. 9 ~> anel
AddItem
Seu modelo básico é:
Argumentos:function onAddItem(moveitem, tileitem, pos)-- aqui ficam as instruções
return 1
end
.: moveitem ~> O item que está sendo movido. Tem os seguintes atributos: moveitem.uid, moveitem.itemid, moveitem.type, moveitem.actionid. OBSERVAÇÃO: se você marcou tileitem="1" o item que está no xml não vai ser moveitem e sim tileitem. Moveitem será o item que você arrastou em cima do item que está no xml!!! (dêem outra olhada no xml do event AddItem na parte do tileitem para intenderem melhor. Se precisar olhem os exemplos mais em baixo
.: tileitem ~> você irá usar isso apenas se marcou tileitem="1" no xml. tileitem é o item que você colocou no xml, o item que os players irão mover outros items em cima (se precisar dêem outra olhada no xml do event AddItem na parte do tileitem para intenderem melhor. Se precisar olhem os exemplos mais em baixo). OBSERVAÇÃO: Por mais que esteja escrito tileitem, o tileitem não precisa ser necessáriamente um tile =) pode ser qualquer item que você possa mover coisas em cima dele.
.: pos ~> a posição que o o moveitem foi movido/criado. (posição depois de mover)
RemoveItem
Seu modelo básico é:
Argumentos:function onRemoveItem(moveitem, tileitem, pos)-- aqui ficam as instruções
return 1
end
.: moveitem ~> O item que está sendo movido. Tem os seguintes atributos: moveitem.uid, moveitem.itemid, moveitem.type, moveitem.actionid. OBSERVAÇÃO: se você marcou tileitem="1" o item que está no xml não vai ser moveitem e sim tileitem. Moveitem será o item que você arrastou de cima do item que está no xml!!! (dêem outra olhada no xml do event AddItem na parte do tileitem para intenderem melhor. Se precisar olhem os exemplos mais em baixo
.: tileitem ~> você irá usar isso apenas se marcou tileitem="1" no xml. tileitem é o item que você colocou no xml, o item que os players irão mover outros items em cima (se precisar dêem outra olhada no xml do event AddItem na parte do tileitem para intenderem melhor. Se precisar olhem os exemplos mais em baixo). OBSERVAÇÃO: Por mais que esteja escrito tileitem, o tileitem não precisa ser necessáriamente um tile =) pode ser qualquer item que você possa mover coisas em cima dele.
.: pos ~> a posição que o o moveitem foi removido (posição antes de mover).
FUNCTIONS vs SCRIPTS:
Bom... Quando eu estava explicando os xmls eu falei que você pode usar script ou function. Provavelmente você já está acostumado a usar script. script="arquivo.lua" etc etc =) Mas... pra que serve function e porque eu não uso script quando uso function?!?
Em movements você tem algumas funções especiais para fazer seu trabalho "andar mais rápido". Você não precisa criar nenhum aruqivo.lua! Basta saber quais são as funções especiais e como/quando usá-las
OBS: Os items que serão usados nas funções especiais precisam estar configurados em data/items/items.xml!!!
1ª função ~> onStepInField
Como o próprio nome já diz ela deve ser usada com o event StepIn =p Serve para adicionar damage em fields...
Você não precisa de um arquivo.lua, apenas coloque:
<movevent event="StepIn" itemid="ID_DO_FIELD" function="onStepInField" />
e seu field já estará dando damage assim que alguém pisa em cima dele =p
2ª função ~> onAddField
Usada com o event AddItem =p Serve para adicionar damage quando o player está em um tile e outro player taca um firefield em baixo do player.
<movevent event="AddItem" tileitem="0" itemid="ID_DO_FIELD" function="onAddField" />
OBS: Aconselho sempre que você usar onStepInField (1ª função) adicionar onAddField com o mesmo id para dar um ar mais real ao server.
3ª função ~> onEquipItem
Usada com o event Equip. Serve para configurar rings, amuletos, etc etc...
<movevent event="Equip" itemid="ID_DO_ITEM" slot="ring" function="onEquipItem" />
OBS: é bom você colocar 2 tags, uma com o ID_DO_ITEM não usado e outra com o ID_DO_ITEM usando, gastando tempo.
4ª função ~> onDeEquipItem
Usada com o event DeEquip. Serve para quando o player tirar o ekip especial cancelar os efeitos desse equipamento.
<movevent event="DeEquip" itemid="ID_DO_ITEM_ATIVO" slot="ring" function="onDeEquipItem" />
OBS: ID_DO_ITEM_ATIVO é o id do item sendo usado...
EXEMPLOS:
Bom... depois de toooooda essa teoria vamos ao que interessa o/ exemplos =) (tem poucos - até mesmo porque existem vários exemplos na pasta scripts dos ots - mais se eu achar que precisa com o tempo vou adicionando novos exemplos)
Exemplo 01 .:. Configurando Stealth Ring
Abra data/movements/movements.xml e adicione:<movevent event="Equip" itemid="2165" slot="ring" function="onEquipItem" /> <movevent event="Equip" itemid="2202" slot="ring" function="onEquipItem" /> <movevent event="DeEquip" itemid="2202" slot="ring" function="onDeEquipItem" />Agora vá em data/items/items.xml e adicione:
<item id="2165" name="stealth ring"> <attribute key="transformEquipTo" value="2202"/> <attribute key="canDecay" value="0"/> <attribute key="showduration" value="1"/> </item> <item id="2202" name="stealth ring"> <attribute key="transformDeEquipTo" value="2165"/> <attribute key="duration" value="600"/> <attribute key="showduration" value="1"/> <attribute key="invisible" value="1"/> </item>E pronto, seu Stealth Ring já está prontinho para funcionar
Exemplo 02 .:. Como usar tileitem
Vamos fazer pão a partir da massa (ja com a massa pronta - id 2693) pra aprendermos =pVocê precisa da massa do pão(2693) e de um forno aceso(1786). Arraste a massa para cima do forno e a massa esquentará e virará um pão \o/
em data/movements/movements.xml
<movevent event="AddItem" tileitem="1" itemid="1786" script="pao.lua" />Observe o detalhe: o itemid é do forno e tileitem está ativado(tileitem="1"), ou seja, o script irá ser ativado quando você arrastar alguma coisa pra cima do forno, não quando você arrastar o forno!
Agora crie um arquivo chamado pao.lua em data/movements/scripts/ e coloque isso:
function onAddItem(moveitem, tileitem, pos) if moveitem.itemid == [b]2693[/b] then -- ID da massa do pão doTransformItem(moveitem.uid,2689) -- transforma a massa em pão(2689) end return 1 endAssim sempre que você arrastar um item de id 2693 pro forno (tileitem="1", lembra?) o moveitem(que no caso vai ser a massa do pão) vai se transformar em pão o/
ÚLTIMAS PALAVRAS:
Difícil? Talvez =p
Se você tiver chegado até aqui e intendido, o que está esperando? vá fazer seus próprios movements \o/
Se você não tiver intendido, levante do pc, dê uma andadinha básica pela casa de uns 10 minutinhos para assimilar as informações e volte para reler o/
Boa sorte =)
FlW
CyA!