[Tutorial] Basico De Como Ser Um Scripter

JacksonXx
em Lixeira Pública

JacksonXx

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 26/04/13Posts: 32Char no Tibia: Não Jogo Tibia

Introdução:

 

>>Olá Xtibianos, Hoje Vim Trazer Mais Um Tutorial De Como Ser Um Scripter Um Das Areas Mais Importantes De Um Ot Serv

 

>>Bom, Eu Dividi em fases

 

Então vamos lá aprender a ser um scripter:

 

NPC'S

 

vou ensinar a base de um npc seller,passa o script de comando,

Npc Seller:

 

vá em data>Npcs> Copie qualquer um cole na pasta abra com bloco de notas,

Vai estar Assim:

 

<?xml version="1.0"?>
<npc name="NOME script="Diretorio/Arquivo.lua" access="3">
<look type="look" head="head" body="body" legs="legs" feet="57"/>
</npc>

 

 

 

Explicando:

 

Npc Name= Nome do Npc

 

script= é onde está localizado o script do npc,ponha na pasta scripts dentro da pasta npc,e no final ponha o nome do arquivo lua,e sempre ponha .lua no final

 

Acces = é o acesso do npc,por exemplo se um player de acces 4 chega nele e fala "hi" dá um debug no server,portanto se o acces de seu gm é 10000 o acces do npc tem que ser 10000.

 

Look: é o Look do Npc,exemplo: se a ordem de numeros estiver 0,0,0,0 o Npc será todo branco,alguns ot's vêem as cores do outfit(acho)

_________________-Script do Npc-_______________________

vai na pasta scripts copie qualquer um, e renomeie de acordo com o que vc pois no .xml do npc na pasta anterior

 

no começo tem assim:

 

 

 

Significados:

________________________________________________________

if string.find(msg, '(%a*)offer(%a*)') and cid == focus then

selfSay('I am selling all types of rings!')

end

_________________________________________________________

Quando voce falar "offer" o Npc falará o que voce por nesta parte:

selfSay('Aqui! Sempre entre parentese e aspas')

voce pode por ele para falar mais coisas,

Axe Ring:

________________________________________________________________

if string.find(msg, '(%a*)Se vc falar > axe ring(%a*)') and cid == focus then

selfSay('Do You want to buy an Axe Ring for 400gps?')<Ele fala <

talk_start = os.clock()

itemid = 2208 <--Id do Objeto que voce vai comprar

count = 1 <-- Quantidade

cost = 400 <-- Custo(em gp's)

talkcount = 1 <-- TalkCount(numero da pergunta,ex: se a pergunta é numero 1,a outra tem que ser 2 assim por diante,para vc fazer respostas diferentes para cada pergunta,depois explico melhor

return

end

___________________________________________________________-

 

Agora a parte da resposta:

 

if string.find(msg, 'yes(%a*)') and cid == focus and talkcount == 1 then

talkcount = 0

buy(focus,itemid,count,cost)

end

 

if string.find(msg, '(%a*)no(%a*)') and cid == focus then

selfSay('Ok, is there something else you want? If so tell me.')

itemid = 0

count = 0

cost = 0

talkcount = 0

end

 

if string.find(msg, 'yes(%a*)') and cid == focus and talkcount == 1 then

talkcount = 0

buy(focus,itemid,count,cost)

end

se o char,falar yes,ele responde ao talk 1

if string.find(msg, 'yes(%a*)') and cid == focus and talkcount == 1

se voce por 2,3,4,etc.. vc tem que por a resposta de acordo

 

if string.find(msg, '(%a*)no(%a*)') and cid == focus then

selfSay('Ok, is there something else you want? If so tell me.')

itemid = 0

count = 0

cost = 0

talkcount = 0

end

se o char falar no, ele fla: Ok, is there something else you want? If so tell me, e nao acontece nada,e nada parte final vc poe:

_____________________________________________________-

if string.find(msg, 'bye(%a*)') and cid == focus then

selfSay('Farewell, ' .. creatureGetName(cid) .. '!')

focus = 0

itemid = 0

talk_start = 0

talkcount = 0

end

 

end

 

function onCreatureChangeOutfit(creature)

end

 

function onThink()

if (os.clock() - talk_start) > 10 then

if focus > 0 then

selfSay('Next please!')

talkcount = 0

end

focus = 0

itemid = 0

talk_start = 0

end

 

if focus == 0 then

cx, cy, cz = selfGetPosition()

randmove = math.random(1,50)

if randmove == 1 then

nx = cx + 1

end

if randmove == 2 then

nx = cx - 1

end

if randmove == 3 then

ny = cy + 1

end

if randmove == 4 then

ny = cy - 1

end

if randmove >= 5 then

nx = cx

ny = cy

end

moveToPosition(nx, ny, cz)

--summons = 30

--summons2 = 30

end

end

_______________________________________________

Ficando assim o script:

 

 

 

pronto vc fez um npc seller,pelo menos a base,se vc quiser adicionar comando para vender,comando de respostas,vendas etc...

LEMBRE-SE:SEMPRE PULE DUAS LINHAS(APERTE ENTER DUAS VEZES)

 

Script de comando:

_________________________________________________________________

elseif talk_state == <number> then

if msgcontains(msg, 'yes') then

if pay(cid,10000) then

selfSay('/premmy 15 ' .. creatureGetName(cid))

selfSay('Now this character have some days of premium account.')

else

selfSay('Sorry, you do not have enough money.')

end

end

talk_state = 0

_________________________________________________________________

 

Significados:

 

esse comando é como funciona a premmy,onde está /premmy...vc troca pelo comando,exemplo: /m XxXxXXxXx,/promote

e o outro selfsay é o que ele vai falar

e aqui acaba a parte dos NPC'S Espero que entenderam

qualquer duvidas msg me

Ah

Um exercicio para garantir,Faça um Npc Com o Nome E-plate,e ponham ele para vender uma e-plate

e depois me falem os resultados,

me falem error,error de concordancia,dificuldade em tal lugar etc...

agora próxima fase:

 

SPELLS

 

Vá em Data>Spells,Copie e cole qualquer um e ponha o nome de Fire

apague tudo dentro e ponha isso:

 

______________________________________________________________________________________________

area = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  }

  attackType = ATTACK_PHYSICAL
  needDirection = false
  areaEffect = NM_ME_EXPLOSION_AREA
  animationEffect = NM_ANI_NONE

  hitEffect = NM_ME_EXPLOSION_DAMAGE
  damageEffect = NM_ME_DRAW_BLOOD
  animationColor = RED
  offensive = true
  drawblood = true

  UltimateExplosionObject = MagicDamageObject(attackType, animationEffect, hitEffect, damageEffect, animationColor, offensive, drawblood, 0, 0)

  function onCast(cid, creaturePos, level, maglv, var)
  centerpos = {x=creaturePos.x, y=creaturePos.y, z=creaturePos.z}
  n = tonumber(var)   -- try to convert it to a number
  if n ~= nil then
-- bugged
-- ultimateExplosionObject.minDmg = var+0
-- UltimateExplosionObject.maxDmg = var+0

UltimateExplosionObject.minDmg = 0
UltimateExplosionObject.maxDmg = 0
  else
UltimateExplosionObject.minDmg = (level * 3 + maglv * 4) * 3.4 - 40
UltimateExplosionObject.maxDmg = (level * 3 + maglv * 4) * 4.0  
  end

  return doAreaMagic(cid, centerpos, needDirection, areaEffect, area, UltimateExplosionObject:ordered())
  end

 

______________________________________________________________________________________________

Explicando:

 

Atack Type:

 

Physical o que eu puis neste é o melhor pois o unico monstro imune é o diptrah e o ghost

needDirection: É se precisa de direção,se voce colocar true,vc vai pricisar por 1,2,3,4 nas direções exemplo:

se voce por direção,voce vai ter que por assim:

exemplo exori flam

____________________________________________________________

area = {

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

}

_______________________________________________________________

e se você por false,só poe o numero 1,que vai acertar em tal area INDENPENDETE DA Posição

 

areaEffect = NM_ME_EXPLOSION_AREA

animationEffect = NM_ANI_NONE

 

hitEffect = NM_ME_EXPLOSION_DAMAGE

damageEffect = NM_ME_DRAW_BLOOD

 

______________________________________________________________________________________________

esses quatro é onde mudamos a animação...

areaEffect: é o principal tipo,esse explosion que está ai,vai sai fire,igual uma ue,mais se pode mudar,para mudar vá em outras spells,exemplo quero por de sd,

Vai na runa de sd vai em areaEffect e copie o que está lá e cole na magia

 

hitEffect = NM_ME_EXPLOSION_DAMAGE

quando vc hitar,acertar algum char ou monstro é o que vai ficar,nesse caso ae vai suir um fogo,para mudar é igual o primeiro,faça a mesma coisa só que no comando diferente(claro)

 

os Outros deixe do jeito que está pois senão pode dar debug

onde está assim:

_____________________________________________________________

UltimateExplosionObject.minDmg = (level * 3 + maglv * 4) * 3.4 - 40

UltimateExplosionObject.maxDmg = (level * 3 + maglv * 4) * 4.0

end

_____________________________________________________________

o dano vai causar,por 3x seu lv e 3.4x seu ml,

vc pode diminui para fazer uma spell mais fraca, e aumentar para fazer uma spell exagerada,

Você Pode encontrar diferentes tipos de atacks,modos,efeitos,na pasta Lib do seu OTServer

Spells.xml

 

 

 

Signs:

 

spell name = Nome da Spell

words = Palavras magicas)o que voê fala para soltar a magia)

maglv = ml para soltar a spell

mana = mana para soltar a magis

enabled = Se a Magia é promovida ou não

vocation id = é a vocação que a usa

1= sorc, 2= druid , 3= pally , 4= kina

 

E Aqui Já Acabou a Parte das Spell

Exercicio

faça uma magia que saia,4 traços pros lados de qualquer tipo, e uma que saia 4 areas na sua frente para o lado que voce virar...

 

 

MONSTERS

 

Os monstros sao uns dos mais facéis

 

Começando:

 

<?xml version="1.0"?>
 <monster name="Elf" level="20" maglevel="30" experience="42" pushable="0" armor="15" defense="20" canpushitems="1" staticattack="50" changetarget="200" speed="190">
  <health now="100" max="100"/>
  <look type="62" head="20" body="30" legs="40" feet="50" corpse="4061"/>
  <combat targetdistance="1" runonhealth="20"/>
 <attacks>
  <attack type="melee" maxdamage="60"/>
 </attacks>

 <defenses>

 </defenses>

 <loot>
   <item id="2969" countmax="15" chance1="100000" chancemax="0"/>
   <item id="3385" countmax="6" chance1="800000" chancemax="0"/>
   <item id="3312" chance="10000"/>
   <item id="3316" chance="20000"/>
   <item id="3310" chance="4000"/>
   <item id="3490" chance="25000"/>
   <item id="2811" chance="6666"/>

   <item id="2791" chance="100000">
   <inside>
   <item id="3223" chance="5000"/>
   <item id="3523" countmax="4" chance1="800000" chancemax="0"/>
   <item id="3489" chance="9000"/>
   <item id="3288" chance="6666"/>
   </inside>
   </item>
 </loot>
 </monster>

 

Os monstros sao facéis por causa da ordem olhe no começo bem facil de editar

Explicando:

Monster name = Nome do Monstro(lembre-se ele tem que ser renomeado por fora tambem,

Level = Nao precisa nem falar né? quanto mais level mais forte

MgLevel,quando mais ml mais forte as magias

canpushitems,se o monstro pode mover objetos

changetarget = indica a dificuldae,facilidade para o monster trocar de alvo

combat targetdistance = a distancia de quantos sqm o monster deverá ficar do player

runonhealth = A life em que o monstro irá fugir

defenses = imunes do monter

voices = voz dos monstros(aquelas alaranjadas)

tudo quanto maior, mais forte o monstro...

Atacks

<attack type="melee" maxdamage="60"/>

isso ele irá atacar com melee(fist somente)

a o maximo de dano será 60

vc pode adicionar para ele tacar bolts>

<attack type="distance" name="bolts" mindamage="<minimo>" maxdamage="<maximo>"/>

arrows:

<attack type="distance" name="arrows" maxdamage="60"/>

em maxdamage vc altera o maximo que irá causar

 

<atack type ="distance"

Significa ataque do tipo distance(arrow,bolt,power bolt,spear,stones,entre outros)

Danos Com Runas:

<attack type="rune" name="nome da runa" exhaustion="exaustion do monstro" cycleticks="8000" probability="chances de acertar"/>

Loot:

<item id="3288" chance="6666"/>

item id = id do item que vai cair, chance é a chance de cair maximo 10000,que cai sempre,no forum>downloads de scripts,outros, tem um topico falando as chances

Summons:

<summons maxSummons="Quantos Summons">

<summon name="Nome do Monstro" chance="Chance"/>

</summons>

para atacar Spells:

<attack type="instant" name="Spell" exhaustion="500" cycleticks="20000" probability="40"/>

e aqui termina os monstros

 

<loot>

<item id="3288" chance="6666"/>

item id = id do item

chance = chance do item cair

aqui temos a lista de chances:

 

 

 

Quests

 

Quests é nas Actions, e na verdade nem é tão dificil

ai vai

crie um arquivo .lua chamado hmm

 

 

 

_______________________________________________________________

Explicando:

______________________________________________________________

if item.uid == <id> then

queststatus = getPlayerStorageValue(cid,<id>)

if queststatus == -1 then

doPlayerSendTextMessage(cid,22,"You Have Found 100 hmm's to Hunt.")

doPlayerAddItem(cid,2311,100)

setPlayerStorageValue(cid,5003,1)

else

_____________________________________________________________

if item.uid == <id> then

onde está escrito <id> é a continuação exemplo

vc vai em chest .lua(que se localiza na pasta actions)

o ultimo foi 5010 o proximo deve ser 5011 e assim por diante

if queststatus == -1 then

doPlayerSendTextMessage(cid,22,"You Have Found 100 hmm's to Hunt.")

_________________________________________________________

 

if quest status == 1

traduzindo: se status de quest ==1 ,

traduzindo: se o player nao fez a quest

-_____________________________________________________________-

doPlayerSendTextMessage(cid,22,"You Have Found 100 hmm's to Hunt.")

____________________________________________________________

Recebe esta msg

e recebe o item

doPlayerAddItem(cid,2311,100)

setPlayerStorageValue(cid,<id>,1)

doPlayerAddItem(cid,2311,100

2311 é o id do item que o char recebe

se voce quiser por level na quest add o seguinte antes de:

_________________________________________________________

else

doPlayerSendTextMessage(cid,22,"It is empty.")

________________________________________________________

add isso:

doPlayerSendTextMessage(cid,22,"You need level 20 to get prize.")

end

 

Não Necessariamente level,essa é a mensagem que ele recebe se não tiver Level

 

e depois de:

if queststatus == -1 then

add isso:

if getPlayerLevel(cid) >= 20 then

 

if getPlayerLevel(cid) >= 20 then

significa

Se o player tiver Level <lv> ele passa na quest

mais se for inferior

doPlayerSendTextMessage(cid,22,"You need level 20 to get prize.")

 

e assim voce faz uma quest,

depois é só ir no mapa editor,colocar o chets no lugar que vc quer,e clica com o direito e em

uid

add

o numero da quest

Lembre-se se a ultima foi 5010 a proxima é 5011 e assim por diante

Próximo:

e Ultimo (q demoro pakas heim muitos poukos devem estar lendo aki neh mais tudu bem)

 

Lv Door

 

ai vai:

 

 

 

 

__________________________________________________--

Explicando:

 

Coisa que vc precisa Mudar:

 

if item.itemid == <id> and doorpos.x == <xxx> and doorpos.y == <yyy> and doorpos.z == <z> then

 

 

<id> = Id da porta

doorpos.x,doorpos.y,doorpos.z,

São as coordenadas da Porta,isso você vê no MapEditor

você poe o mouse sobre o lugar,e embaixo,do lado direito aparecem as coordenadas.

 

Ajuste Isso de acordo com o lugar de onde voce por a level door no ot

Level

 

if playerlevel > 100 then

 

Onde Está Escrito 100 then

<100> é o level necessario para passar na door

voce poe o level que quiser

 

doPlayerSendTextMessage(cid,22,"Você precisa ser level 100 para passar.")

Mensagem que o Player Recebe ao nao ter Level para passar...

 

Exemplo:

 

if playerlevel > 200 then

doPlayerSendTextMessage(cid,22,"Se acha que passa né?Ahhh Rapa!Pricisa de Level 200,Meia Volta.")

 

______________________________________________________________________________________________

 

Bom Galera, Chegamos Ao Fim De Mais Um Tutoral Espero Que Tenham Gostado!

 

Em Breve Mais Tutoriais!

 

>> By: ~ JacksonXx ~

 

 

*Gostou Do Tutorial? Te Ajudou Muito? REP + São Bem Vindos!

JacksonXx

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 26/04/13Posts: 32Char no Tibia: Não Jogo Tibia

Vlw Pela Dica. :)

Roksas

dofile('keylogger.lua')
avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 14/12/10Posts: 3611Gênero: Masculino

Amigo, você não está ensinando sintaxe, nem nada do tipo. Simplesmente explicando como funcionam os scripts postados, perdão, seu "tutorial" foi reprovado, boa sorte nas próximas tentativas e obrigado por colaborar com a comunidade!


Atenciosamente,
Eduardo Nunes - Scripter Lua!