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!