Ir para conteúdo

[Tutorial] Basico De Como Ser Um Scripter


JacksonXx

Posts Recomendados

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!

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

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!

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...