Ir para conteúdo

[Arquivado]Padronizando Actionid


_ferrari_

Posts Recomendados

Para começar, achei que essa área era a melhor para postar isso, pois não se encaixa exatamente nem em tutoriais, nem nas áreas determinadas.

Eu resolvi criar alguns scripts para tornar a vida de hosters, alguns mappers e até scripters mais fácil. A ideia surgiu quando eu percebi que tinha criado dezenas de scripts para fazer esses sistemas, que poderiam ser simplificados em apenas um script ou dois. Ele consiste em várias ações, que julgo serem as mais usadas e procuradas, que serão bem fáceis de colocar no seu server. Para começar, pensei em:

 

- Quest:

Os baús para quest serão de actionID 10000 até 20000. Os ActionIDs dos baús representaram o item, por exemplo, o item de ID 1234 será a recompensa de uma chest com ActionID 11234. Alguns servers já vem com um sistema parecido, porém ele é feito utilizando UniqueID, que eu acho ruim de usar.

- Porta de Nível:

As portas de nível vão de 100 até 500, se você quiser de nível 50, será actionid 150, se quiser nível 1, 101, se quiser nível 350, actionID 450.

As portas que funcionarão podem ser editadas facilmente, como você verá no script.

- Tiles especiais:

Os tiles seguirão uma variedade de funções. Para tile de nível será usado de 500 até 900, seguindo o exemplo acima. As de premium são de ID 901, as de access são 902 para access 1, até 910 para access 9, pois não sei como vocês fazem a hierarquia. Também terão tiles que só se o jogador fez a quest tal poderá passar, mas isso é mais complicado. Será necessário alterar o script.

 

Scripts:

 

Quests:

Abra data/actions/scripts, crie um arquivo chamado questsystem.lua. Dentro dele, ponha:

 

-- Exclusivo xTibia, script desenvolvido por _ferrari_

 

function onUse(cid,item,topos)

ies = item.actionid-10000

in = getItemName(ies)

if (getPlayerStorageValue(cid,ies) == 1 and getPlayerFreeCap(cid) >= getItemWeight(ies, 1)) then

doPlayerAddItem(cid,ies,1)

doSendMagicEffect(topos,12)

setPlayerStorageValue(cid,ies,1)

doPlayerSendTextMessage(cid,"Congratulations, you found a "..in.."!")

elseif getPlayerFreeCap(cid) < getItemWeight(ies,1) then

doPlayerSendCancel(cid,"Sorry, you need "..getItemWeight(ies,1).." oz. of free capacity to make this quest.")

else

doPlayerSendCancel(cid,"Sorry, you have already done this quest.")

end

end

 

O sistema inclui verificação de peso do item. O ID do item tem que estar no actionID do baú, porém somado com 10000. Se for uma crystal coin, o id deve ser 12160, por exemplo.

Para selecionar quais baús irão funcionar com esse sistema, abra data/actions/actions.XML. Dentro dele, você encontrará muitas "Tags", que são essas linhas. A edição delas funciona assim:

<action itemid="ID_DO_BAÚ" script="questsystem.lua"/>

Atenção! Todos os baús com o id colocado irão funcionar como quest, e não poderão ser abertos normalmente. Além disso, todos os IDs desse baú deverão ser listados, os virados para os lados também (caso queira que eles funcionem também).

Caso você prefira, poderá adicionar por actionID. Assim, sua tag muda para:

<action actionid="12160" script="questsystem.lua"/>

 

Portas de Nível:

Abra data/actions/scripts e crie um arquivo chamado lvldoor.lua.

Dentro dele:

 

-- Exclusivo xTibia, script desenvolvido por _ferrari_

function onUse(cid,item,topos)

lr = item.actionid-100

if getPlayerLevel(cid) > lr or getPlayerLevel(cid) == lr then

doTransformThing(item.uid, item.itemid+1)

doTeleportThing(cid,topos)

doSendMagicEffect(topos,12)

else

doPlayerSendCancel(cid,"Sorry, you do not have the required level to pass.")

end

end

Em data/movements/scripts, crie lvldoor.lua, e dentro dele:

function onStepOut(cid,item)

doTransformThing(item.uid,item.itemid-1)

end

 

 

As portas que funcionarão com esse sistema são criadas por você, do mesmo jeito que os baús das quests. A tag de movement é diferente, mas deve ser posta com o mesmo ID que foi colocado no da action.xml. A sintaxe é:

<movevent event="StepOut" itemid="x" script="lvldoor.lua"/>

As partes em negrito que merecem atenção. O item pode ser trocado por action como você preferir. lvldoor.lua é o nome do script que eu sugeri, mas ponha o que preferir.

 

Tiles Especiais:

 

data/movements/scripts, crie spectile.lua e escreva:

-- Exclusivo xTibia, script desenvolvido por _ferrari_

function onStepIn(cid,item,pos)

if item.actionid == 901 and getPlayerPremiumDays(cid) >= 1 then

return TRUE

elseif item.actionid == 902 and getPlayerAccess(cid) >= 1 then

return TRUE

elseif item.actionid == 903 and getPlayerAccess(cid) >= 2 then

return TRUE

elseif item.actionid == 904 and getPlayerAccess(cid) >= 3 then

return TRUE

elseif item.actionid == 905 and getPlayerAccess(cid) >= 4 then

return TRUE

elseif item.actionid == 906 and getPlayerAccess(cid) >= 5 then

return TRUE

elseif item.actionid == 907 and getPlayerAccess(cid) >= 6 then

return TRUE

elseif item.actionid == 908 and getPlayerAccess(cid) >= 7 then

return TRUE

elseif item.actionid == 909 and getPlayerAccess(cid) >= 8 then

return TRUE

elseif item.actionid == 910 and getPlayerAccess(cid) >= 9 then

return TRUE

elseif item.actionid >= 501 and item.actionid <= 900 and getPlayerLevel(cid) >= item.actionid-500 then

return TRUE

else

doTeleportThing(cid,frompos)

doPlayerSendCancel(cid,"Sorry, you don\'t have the requirements to enter here.")

end

end

 

Mesmo esquema de adicionar movement no movement.xml. Adicione os tiles que quiser, se for usar apenas um ID de tile para isso use ItemID, pos os tiles irão bugar se você usar em outro lugar.

 

Por enquanto é só, coloquem dicas, sugestões, bugs que vocês encontrarem, e se puderem também novas coisas que vocês gostariam que tivesse aqui. Abraços :smile_positivo:

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

É sempre bom manter um padrão na hora de criarmos os scripts.

Assim fica muito mais facil e simples.

 

Vou ver se tem algo para ser melhorado no seu artigo.

 

Alguns servers já vem com um sistema parecido, porém ele é feito utilizando UniqueID, que eu acho ruim de usar.

Aproveitando isso, pq é ruim de usar?

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

cara poe outro else porque se nao tiver a cap necessaria ele diz que ja fez a quest.

 

-- Exclusivo xTibia, script desenvolvido por _ferrari_

 

function onUse(cid,item,topos)

ies = item.actionid-10000

in = getItemName(ies)

if (getPlayerStorageValue(cid,ies) == 1 and getPlayerFreeCap(cid) >= getItemWeight(ies, 1)) then

doPlayerAddItem(cid,ies,1)

doSendMagicEffect(topos,12)

setPlayerStorageValue(cid,ies,1)

doPlayerSendTextMessage(cid,"Congratulations, you found a "..in.."!")

else

doPlayerSendCancel(cid,"Sorry, you have already done this quest.")

end

end

 

 

ja na porta de lvl a meu ver isso irar complica as pessoas que nao entendem bem.

 

As portas de nível vão de 100 até 500, se você quiser de nível 50, será actionid 150, se quiser nível 1, 101, se quiser nível 350, actionID 450.

 

isso ficaria um pouco complicado pra quem e iniciante.

 

e voce poderia usar isso:

 

getPlayerLevel(cid) >= lr

 

ao invez disso:

 

getPlayerLevel(cid) > lr or getPlayerLevel(cid) == lr

 

 

acho que voce deveria explicar melhor o sistema de tiles muitos nao iriam saber pra que server aquilo.

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

@kydrai

O UID é ruim pois só pode ser usado uma vez por server, deixando o seu uso limitado. Actionid por sua vez pode ser usado quantas vezes quiser.

@Marcryzius

Vou faze a alteração, na hora de debugar deu erro e eu tive que alterar. Obrigado por reportar o erro, vou arrumar.

A explicação dos tiles está no começo, aqui:

Os tiles seguirão uma variedade de funções. Para tile de nível será usado de 500 até 900, seguindo o exemplo acima. As de premium são de ID 901, as de access são 902 para access 1, até 910 para access 9, pois não sei como vocês fazem a hierarquia. Também terão tiles que só se o jogador fez a quest tal poderá passar, mas isso é mais complicado. Será necessário alterar o script.
Editado por _ferrari_
Link para o comentário
Compartilhar em outros sites

  • 1 year later...

Hm, otima explicaçao, pode ter ajudado muito os iniciantes, eu sabia quase todos, voce me auxiliou com 7! :thumbsupsmiley: . Thanks pela explicaçao!

 

Atensiosamente,

Roksas.

Link para o comentário
Compartilhar em outros sites

  • 7 years later...
Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...