Ir para conteúdo

Pasta Data - Movements


tibiaa4e

Posts Recomendados

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 em

onStepOut = 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 bota

right 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!!!)

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

  • 2 months later...
  • 2 months later...
  • 2 weeks later...
  • 1 year later...

Qual a função para quando um player pegar um item e colocá-lo em qualquer lugar nele (feet, bag, arrow) ele adicione +1 de mana?

E ao remover, que remova 1 de mana?

e que cheque o número desses itens (no maximo 6 <=5)

Se puder me ajudar, rep+ .D

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...