Ir para conteúdo

Sir Picaralhos

Artesão
  • Total de itens

    114
  • Registro em

  • Última visita

Histórico de Reputação

  1. Upvote
    Sir Picaralhos recebeu reputação de 00007 em Quer Aprender A Ser Scripter?   
    Dividi em fases
    Entaum vamos lah ensinalo 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endExplicando :Nesta Parte se vc fala hi para ele,ele fala: Hello ( e seu nome)[color=blue]' .. creatureGetName(cid) .. ' Esse comando Faz o Npc falar o nome do char(cid) que falou hi[/color]Sempre Use essa parte no começo,se um char,fala hi e depois fala hi denovo o npc fala: I'm Already Talking to You,Pode Ser Alterado nesta Parte:if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')<---else if focus > 0 then      selfSay('Wait.')<--neste é quando o npc está atendendo outra pessoas      endend     Continuando(vamos usar como exemplo um npc que vende um axe ring 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endif string.find(msg, '(%a*)offer(%a*)') and cid == focus thenselfSay('I am selling all types of rings!')endif string.find(msg, '(%a*)rings(%a*)') and cid == focus thenselfSay('I Sell Axe Ring,Club Ring,Crystal Ring,Dwarven Ring,Esmerald Bagle,Energy Ring,Gold Ring,Life Ring.Might Ring,Power Ring,Ring of Healing,Ring of the Skies,Stealth Ring,Sword Ring,Time Ring and Weding Ring.')talk_start = os.clock()returnendif string.find(msg, '(%a*)axe ring(%a*)') and cid == focus thenselfSay('Do You want to buy an Axe Ring for 400gps?')talk_start = os.clock()itemid = 2208count = 1cost = 400talkcount = 1returnendif string.find(msg, 'yes(%a*)') and cid == focus and talkcount == 1 then       talkcount = 0buy(focus,itemid,count,cost)endif string.find(msg, '(%a*)no(%a*)') and cid == focus thenselfSay('Ok, is there something else you want? If so tell me.')itemid = 0count = 0cost = 0talkcount = 0end if string.find(msg, 'bye(%a*)') and cid == focus thenselfSay('Farewell, ' .. creatureGetName(cid) .. '!')focus = 0itemid = 0talk_start = 0talkcount = 0end endfunction onCreatureChangeOutfit(creature)endfunction onThink() if (os.clock() - talk_start) > 10 then if focus > 0 then selfSay('Next please!') talkcount = 0end focus = 0 itemid = 0talk_start = 0 end if focus == 0 thencx, cy, cz = selfGetPosition()randmove = math.random(1,50)if randmove == 1 thennx = cx + 1endif randmove == 2 thennx = cx - 1endif randmove == 3 thenny = cy + 1endif randmove == 4 thenny = cy - 1endif randmove >= 5 thennx = cxny = cyendmoveToPosition(nx, ny, cz)--summons = 30--summons2 = 30endend  
    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:
    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 voce por false,só poe o numero 1,que vai acertar em tal area INDENPENDETE DA Posição
    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
     
    <spell name="Nome" words="palavras magicas" maglv="ml" mana="<mana>" enabled="1"><vocation id="2" /><vocation id="1" /></spell>  
    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:
    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:
     
    --100000= all time----50000= each 2 time----33333= each 3 time----20000= each 5 time----10000= each 10 time----6666= each 15 time----5000 = each 20 time----4000 = each 25 time----3333 = each 30 time----2857 = each 35 time----2500 = each 40 time----2222 = each 45 time----2000 = each 50 time----1818 = each 55 time----1666 = each 60 time----1538 = each 65 time----1428 = each 70 time----1333 = each 75 time----1000 = each 100 time----909 = each 110 time----833 = each 120 time----800 = each 125 time--666 = each 150 time----588 = each 170 time----555 = each 180 time----500 = each 200 time----400 = each 250 time----333 = each 300 time--  
    Quests
    Quests é nas Actions, e na verdade nem é tão dificil
    ai vai
    crie um arquivo .lua chamado hmm
     
    - Hmm Questfunction onUse(cid, item, frompos, item2, topos)   if item.uid == 5003 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You Have Found 100 hmm's to Hunt.")  doPlayerAddItem(cid,2311,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    end   elseif item.uid == 5004 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have Found 100 uh to Hunt.")  doPlayerAddItem(cid,2265,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    endelseif item.uid == 5017 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have found 100 explosion to hunt.")  doPlayerAddItem(cid,2305,1)  setPlayerStorageValue(cid,5003,1)    endelse return 0   end   return 1end  
    _______________________________________________________________
    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:
    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
    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:
     
    --Hmm function onUse(cid, item, frompos, item2, topos)doorpos = {x=frompos.x, y=frompos.y, z=frompos.z}playerpos = getPlayerPosition(cid)playerlevel = getPlayerLevel(cid)if item.itemid == 1234 and doorpos.x == 1 and doorpos.y == 1 and doorpos.z == 1 thenif playerlevel > 100 thendoTeleportThing(cid,doorpos)elseif playerlevel < 100 thendoPlayerSendTextMessage(cid,22,"Você precisa ser level 100 para passar.")endendreturn 1end  
    __________________________________________________--
    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.")
    ufa acabo ateh q enfim heim
    quase ngm deve ter vindo ateh aki
    se vc veio nossa como vc aguenta?
    hehe
    espero q tenhaum gostado
    Créditos: Dum amigo rl q axo na net na casa do primo dele dai ele sabia q eu ia volta aki e me deu pra eu posta e kramba demorei quase 2h pra escreve tudu issu hehe, e infelizmente os créditos não sao meus dinovu, mais eu to voltando agora e logo logo farei um como o meu ultimo q felizmente ao chegar aki fikei sabendo q ele foi fixado ainda num descobri onde neh hehe mais ele fo fixado!
    vlw ae comentem plz!
    Atenciosamente,
    Sir Picaralhos.
    :laughing:
  2. Upvote
    Sir Picaralhos recebeu reputação de leinadlol em Quer Aprender A Ser Scripter?   
    Dividi em fases
    Entaum vamos lah ensinalo 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endExplicando :Nesta Parte se vc fala hi para ele,ele fala: Hello ( e seu nome)[color=blue]' .. creatureGetName(cid) .. ' Esse comando Faz o Npc falar o nome do char(cid) que falou hi[/color]Sempre Use essa parte no começo,se um char,fala hi e depois fala hi denovo o npc fala: I'm Already Talking to You,Pode Ser Alterado nesta Parte:if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')<---else if focus > 0 then      selfSay('Wait.')<--neste é quando o npc está atendendo outra pessoas      endend     Continuando(vamos usar como exemplo um npc que vende um axe ring 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endif string.find(msg, '(%a*)offer(%a*)') and cid == focus thenselfSay('I am selling all types of rings!')endif string.find(msg, '(%a*)rings(%a*)') and cid == focus thenselfSay('I Sell Axe Ring,Club Ring,Crystal Ring,Dwarven Ring,Esmerald Bagle,Energy Ring,Gold Ring,Life Ring.Might Ring,Power Ring,Ring of Healing,Ring of the Skies,Stealth Ring,Sword Ring,Time Ring and Weding Ring.')talk_start = os.clock()returnendif string.find(msg, '(%a*)axe ring(%a*)') and cid == focus thenselfSay('Do You want to buy an Axe Ring for 400gps?')talk_start = os.clock()itemid = 2208count = 1cost = 400talkcount = 1returnendif string.find(msg, 'yes(%a*)') and cid == focus and talkcount == 1 then       talkcount = 0buy(focus,itemid,count,cost)endif string.find(msg, '(%a*)no(%a*)') and cid == focus thenselfSay('Ok, is there something else you want? If so tell me.')itemid = 0count = 0cost = 0talkcount = 0end if string.find(msg, 'bye(%a*)') and cid == focus thenselfSay('Farewell, ' .. creatureGetName(cid) .. '!')focus = 0itemid = 0talk_start = 0talkcount = 0end endfunction onCreatureChangeOutfit(creature)endfunction onThink() if (os.clock() - talk_start) > 10 then if focus > 0 then selfSay('Next please!') talkcount = 0end focus = 0 itemid = 0talk_start = 0 end if focus == 0 thencx, cy, cz = selfGetPosition()randmove = math.random(1,50)if randmove == 1 thennx = cx + 1endif randmove == 2 thennx = cx - 1endif randmove == 3 thenny = cy + 1endif randmove == 4 thenny = cy - 1endif randmove >= 5 thennx = cxny = cyendmoveToPosition(nx, ny, cz)--summons = 30--summons2 = 30endend  
    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:
    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 voce por false,só poe o numero 1,que vai acertar em tal area INDENPENDETE DA Posição
    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
     
    <spell name="Nome" words="palavras magicas" maglv="ml" mana="<mana>" enabled="1"><vocation id="2" /><vocation id="1" /></spell>  
    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:
    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:
     
    --100000= all time----50000= each 2 time----33333= each 3 time----20000= each 5 time----10000= each 10 time----6666= each 15 time----5000 = each 20 time----4000 = each 25 time----3333 = each 30 time----2857 = each 35 time----2500 = each 40 time----2222 = each 45 time----2000 = each 50 time----1818 = each 55 time----1666 = each 60 time----1538 = each 65 time----1428 = each 70 time----1333 = each 75 time----1000 = each 100 time----909 = each 110 time----833 = each 120 time----800 = each 125 time--666 = each 150 time----588 = each 170 time----555 = each 180 time----500 = each 200 time----400 = each 250 time----333 = each 300 time--  
    Quests
    Quests é nas Actions, e na verdade nem é tão dificil
    ai vai
    crie um arquivo .lua chamado hmm
     
    - Hmm Questfunction onUse(cid, item, frompos, item2, topos)   if item.uid == 5003 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You Have Found 100 hmm's to Hunt.")  doPlayerAddItem(cid,2311,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    end   elseif item.uid == 5004 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have Found 100 uh to Hunt.")  doPlayerAddItem(cid,2265,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    endelseif item.uid == 5017 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have found 100 explosion to hunt.")  doPlayerAddItem(cid,2305,1)  setPlayerStorageValue(cid,5003,1)    endelse return 0   end   return 1end  
    _______________________________________________________________
    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:
    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
    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:
     
    --Hmm function onUse(cid, item, frompos, item2, topos)doorpos = {x=frompos.x, y=frompos.y, z=frompos.z}playerpos = getPlayerPosition(cid)playerlevel = getPlayerLevel(cid)if item.itemid == 1234 and doorpos.x == 1 and doorpos.y == 1 and doorpos.z == 1 thenif playerlevel > 100 thendoTeleportThing(cid,doorpos)elseif playerlevel < 100 thendoPlayerSendTextMessage(cid,22,"Você precisa ser level 100 para passar.")endendreturn 1end  
    __________________________________________________--
    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.")
    ufa acabo ateh q enfim heim
    quase ngm deve ter vindo ateh aki
    se vc veio nossa como vc aguenta?
    hehe
    espero q tenhaum gostado
    Créditos: Dum amigo rl q axo na net na casa do primo dele dai ele sabia q eu ia volta aki e me deu pra eu posta e kramba demorei quase 2h pra escreve tudu issu hehe, e infelizmente os créditos não sao meus dinovu, mais eu to voltando agora e logo logo farei um como o meu ultimo q felizmente ao chegar aki fikei sabendo q ele foi fixado ainda num descobri onde neh hehe mais ele fo fixado!
    vlw ae comentem plz!
    Atenciosamente,
    Sir Picaralhos.
    :laughing:
  3. Upvote
    Sir Picaralhos recebeu reputação de Arroiszezenia em Quer Aprender A Ser Scripter?   
    Dividi em fases
    Entaum vamos lah ensinalo 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endExplicando :Nesta Parte se vc fala hi para ele,ele fala: Hello ( e seu nome)[color=blue]' .. creatureGetName(cid) .. ' Esse comando Faz o Npc falar o nome do char(cid) que falou hi[/color]Sempre Use essa parte no começo,se um char,fala hi e depois fala hi denovo o npc fala: I'm Already Talking to You,Pode Ser Alterado nesta Parte:if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')<---else if focus > 0 then      selfSay('Wait.')<--neste é quando o npc está atendendo outra pessoas      endend     Continuando(vamos usar como exemplo um npc que vende um axe ring 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endif string.find(msg, '(%a*)offer(%a*)') and cid == focus thenselfSay('I am selling all types of rings!')endif string.find(msg, '(%a*)rings(%a*)') and cid == focus thenselfSay('I Sell Axe Ring,Club Ring,Crystal Ring,Dwarven Ring,Esmerald Bagle,Energy Ring,Gold Ring,Life Ring.Might Ring,Power Ring,Ring of Healing,Ring of the Skies,Stealth Ring,Sword Ring,Time Ring and Weding Ring.')talk_start = os.clock()returnendif string.find(msg, '(%a*)axe ring(%a*)') and cid == focus thenselfSay('Do You want to buy an Axe Ring for 400gps?')talk_start = os.clock()itemid = 2208count = 1cost = 400talkcount = 1returnendif string.find(msg, 'yes(%a*)') and cid == focus and talkcount == 1 then       talkcount = 0buy(focus,itemid,count,cost)endif string.find(msg, '(%a*)no(%a*)') and cid == focus thenselfSay('Ok, is there something else you want? If so tell me.')itemid = 0count = 0cost = 0talkcount = 0end if string.find(msg, 'bye(%a*)') and cid == focus thenselfSay('Farewell, ' .. creatureGetName(cid) .. '!')focus = 0itemid = 0talk_start = 0talkcount = 0end endfunction onCreatureChangeOutfit(creature)endfunction onThink() if (os.clock() - talk_start) > 10 then if focus > 0 then selfSay('Next please!') talkcount = 0end focus = 0 itemid = 0talk_start = 0 end if focus == 0 thencx, cy, cz = selfGetPosition()randmove = math.random(1,50)if randmove == 1 thennx = cx + 1endif randmove == 2 thennx = cx - 1endif randmove == 3 thenny = cy + 1endif randmove == 4 thenny = cy - 1endif randmove >= 5 thennx = cxny = cyendmoveToPosition(nx, ny, cz)--summons = 30--summons2 = 30endend  
    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:
    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 voce por false,só poe o numero 1,que vai acertar em tal area INDENPENDETE DA Posição
    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
     
    <spell name="Nome" words="palavras magicas" maglv="ml" mana="<mana>" enabled="1"><vocation id="2" /><vocation id="1" /></spell>  
    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:
    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:
     
    --100000= all time----50000= each 2 time----33333= each 3 time----20000= each 5 time----10000= each 10 time----6666= each 15 time----5000 = each 20 time----4000 = each 25 time----3333 = each 30 time----2857 = each 35 time----2500 = each 40 time----2222 = each 45 time----2000 = each 50 time----1818 = each 55 time----1666 = each 60 time----1538 = each 65 time----1428 = each 70 time----1333 = each 75 time----1000 = each 100 time----909 = each 110 time----833 = each 120 time----800 = each 125 time--666 = each 150 time----588 = each 170 time----555 = each 180 time----500 = each 200 time----400 = each 250 time----333 = each 300 time--  
    Quests
    Quests é nas Actions, e na verdade nem é tão dificil
    ai vai
    crie um arquivo .lua chamado hmm
     
    - Hmm Questfunction onUse(cid, item, frompos, item2, topos)   if item.uid == 5003 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You Have Found 100 hmm's to Hunt.")  doPlayerAddItem(cid,2311,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    end   elseif item.uid == 5004 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have Found 100 uh to Hunt.")  doPlayerAddItem(cid,2265,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    endelseif item.uid == 5017 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have found 100 explosion to hunt.")  doPlayerAddItem(cid,2305,1)  setPlayerStorageValue(cid,5003,1)    endelse return 0   end   return 1end  
    _______________________________________________________________
    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:
    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
    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:
     
    --Hmm function onUse(cid, item, frompos, item2, topos)doorpos = {x=frompos.x, y=frompos.y, z=frompos.z}playerpos = getPlayerPosition(cid)playerlevel = getPlayerLevel(cid)if item.itemid == 1234 and doorpos.x == 1 and doorpos.y == 1 and doorpos.z == 1 thenif playerlevel > 100 thendoTeleportThing(cid,doorpos)elseif playerlevel < 100 thendoPlayerSendTextMessage(cid,22,"Você precisa ser level 100 para passar.")endendreturn 1end  
    __________________________________________________--
    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.")
    ufa acabo ateh q enfim heim
    quase ngm deve ter vindo ateh aki
    se vc veio nossa como vc aguenta?
    hehe
    espero q tenhaum gostado
    Créditos: Dum amigo rl q axo na net na casa do primo dele dai ele sabia q eu ia volta aki e me deu pra eu posta e kramba demorei quase 2h pra escreve tudu issu hehe, e infelizmente os créditos não sao meus dinovu, mais eu to voltando agora e logo logo farei um como o meu ultimo q felizmente ao chegar aki fikei sabendo q ele foi fixado ainda num descobri onde neh hehe mais ele fo fixado!
    vlw ae comentem plz!
    Atenciosamente,
    Sir Picaralhos.
    :laughing:
  4. Upvote
    Sir Picaralhos recebeu reputação de Marcowhy em Quer Aprender A Ser Scripter?   
    Dividi em fases
    Entaum vamos lah ensinalo 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endExplicando :Nesta Parte se vc fala hi para ele,ele fala: Hello ( e seu nome)[color=blue]' .. creatureGetName(cid) .. ' Esse comando Faz o Npc falar o nome do char(cid) que falou hi[/color]Sempre Use essa parte no começo,se um char,fala hi e depois fala hi denovo o npc fala: I'm Already Talking to You,Pode Ser Alterado nesta Parte:if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')<---else if focus > 0 then      selfSay('Wait.')<--neste é quando o npc está atendendo outra pessoas      endend     Continuando(vamos usar como exemplo um npc que vende um axe ring 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endif string.find(msg, '(%a*)offer(%a*)') and cid == focus thenselfSay('I am selling all types of rings!')endif string.find(msg, '(%a*)rings(%a*)') and cid == focus thenselfSay('I Sell Axe Ring,Club Ring,Crystal Ring,Dwarven Ring,Esmerald Bagle,Energy Ring,Gold Ring,Life Ring.Might Ring,Power Ring,Ring of Healing,Ring of the Skies,Stealth Ring,Sword Ring,Time Ring and Weding Ring.')talk_start = os.clock()returnendif string.find(msg, '(%a*)axe ring(%a*)') and cid == focus thenselfSay('Do You want to buy an Axe Ring for 400gps?')talk_start = os.clock()itemid = 2208count = 1cost = 400talkcount = 1returnendif string.find(msg, 'yes(%a*)') and cid == focus and talkcount == 1 then       talkcount = 0buy(focus,itemid,count,cost)endif string.find(msg, '(%a*)no(%a*)') and cid == focus thenselfSay('Ok, is there something else you want? If so tell me.')itemid = 0count = 0cost = 0talkcount = 0end if string.find(msg, 'bye(%a*)') and cid == focus thenselfSay('Farewell, ' .. creatureGetName(cid) .. '!')focus = 0itemid = 0talk_start = 0talkcount = 0end endfunction onCreatureChangeOutfit(creature)endfunction onThink() if (os.clock() - talk_start) > 10 then if focus > 0 then selfSay('Next please!') talkcount = 0end focus = 0 itemid = 0talk_start = 0 end if focus == 0 thencx, cy, cz = selfGetPosition()randmove = math.random(1,50)if randmove == 1 thennx = cx + 1endif randmove == 2 thennx = cx - 1endif randmove == 3 thenny = cy + 1endif randmove == 4 thenny = cy - 1endif randmove >= 5 thennx = cxny = cyendmoveToPosition(nx, ny, cz)--summons = 30--summons2 = 30endend  
    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:
    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 voce por false,só poe o numero 1,que vai acertar em tal area INDENPENDETE DA Posição
    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
     
    <spell name="Nome" words="palavras magicas" maglv="ml" mana="<mana>" enabled="1"><vocation id="2" /><vocation id="1" /></spell>  
    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:
    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:
     
    --100000= all time----50000= each 2 time----33333= each 3 time----20000= each 5 time----10000= each 10 time----6666= each 15 time----5000 = each 20 time----4000 = each 25 time----3333 = each 30 time----2857 = each 35 time----2500 = each 40 time----2222 = each 45 time----2000 = each 50 time----1818 = each 55 time----1666 = each 60 time----1538 = each 65 time----1428 = each 70 time----1333 = each 75 time----1000 = each 100 time----909 = each 110 time----833 = each 120 time----800 = each 125 time--666 = each 150 time----588 = each 170 time----555 = each 180 time----500 = each 200 time----400 = each 250 time----333 = each 300 time--  
    Quests
    Quests é nas Actions, e na verdade nem é tão dificil
    ai vai
    crie um arquivo .lua chamado hmm
     
    - Hmm Questfunction onUse(cid, item, frompos, item2, topos)   if item.uid == 5003 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You Have Found 100 hmm's to Hunt.")  doPlayerAddItem(cid,2311,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    end   elseif item.uid == 5004 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have Found 100 uh to Hunt.")  doPlayerAddItem(cid,2265,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    endelseif item.uid == 5017 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have found 100 explosion to hunt.")  doPlayerAddItem(cid,2305,1)  setPlayerStorageValue(cid,5003,1)    endelse return 0   end   return 1end  
    _______________________________________________________________
    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:
    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
    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:
     
    --Hmm function onUse(cid, item, frompos, item2, topos)doorpos = {x=frompos.x, y=frompos.y, z=frompos.z}playerpos = getPlayerPosition(cid)playerlevel = getPlayerLevel(cid)if item.itemid == 1234 and doorpos.x == 1 and doorpos.y == 1 and doorpos.z == 1 thenif playerlevel > 100 thendoTeleportThing(cid,doorpos)elseif playerlevel < 100 thendoPlayerSendTextMessage(cid,22,"Você precisa ser level 100 para passar.")endendreturn 1end  
    __________________________________________________--
    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.")
    ufa acabo ateh q enfim heim
    quase ngm deve ter vindo ateh aki
    se vc veio nossa como vc aguenta?
    hehe
    espero q tenhaum gostado
    Créditos: Dum amigo rl q axo na net na casa do primo dele dai ele sabia q eu ia volta aki e me deu pra eu posta e kramba demorei quase 2h pra escreve tudu issu hehe, e infelizmente os créditos não sao meus dinovu, mais eu to voltando agora e logo logo farei um como o meu ultimo q felizmente ao chegar aki fikei sabendo q ele foi fixado ainda num descobri onde neh hehe mais ele fo fixado!
    vlw ae comentem plz!
    Atenciosamente,
    Sir Picaralhos.
    :laughing:
  5. Upvote
    Sir Picaralhos recebeu reputação de dragonk147 em Quer Aprender A Ser Scripter?   
    Dividi em fases
    Entaum vamos lah ensinalo 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endExplicando :Nesta Parte se vc fala hi para ele,ele fala: Hello ( e seu nome)[color=blue]' .. creatureGetName(cid) .. ' Esse comando Faz o Npc falar o nome do char(cid) que falou hi[/color]Sempre Use essa parte no começo,se um char,fala hi e depois fala hi denovo o npc fala: I'm Already Talking to You,Pode Ser Alterado nesta Parte:if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')<---else if focus > 0 then      selfSay('Wait.')<--neste é quando o npc está atendendo outra pessoas      endend     Continuando(vamos usar como exemplo um npc que vende um axe ring 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endif string.find(msg, '(%a*)offer(%a*)') and cid == focus thenselfSay('I am selling all types of rings!')endif string.find(msg, '(%a*)rings(%a*)') and cid == focus thenselfSay('I Sell Axe Ring,Club Ring,Crystal Ring,Dwarven Ring,Esmerald Bagle,Energy Ring,Gold Ring,Life Ring.Might Ring,Power Ring,Ring of Healing,Ring of the Skies,Stealth Ring,Sword Ring,Time Ring and Weding Ring.')talk_start = os.clock()returnendif string.find(msg, '(%a*)axe ring(%a*)') and cid == focus thenselfSay('Do You want to buy an Axe Ring for 400gps?')talk_start = os.clock()itemid = 2208count = 1cost = 400talkcount = 1returnendif string.find(msg, 'yes(%a*)') and cid == focus and talkcount == 1 then       talkcount = 0buy(focus,itemid,count,cost)endif string.find(msg, '(%a*)no(%a*)') and cid == focus thenselfSay('Ok, is there something else you want? If so tell me.')itemid = 0count = 0cost = 0talkcount = 0end if string.find(msg, 'bye(%a*)') and cid == focus thenselfSay('Farewell, ' .. creatureGetName(cid) .. '!')focus = 0itemid = 0talk_start = 0talkcount = 0end endfunction onCreatureChangeOutfit(creature)endfunction onThink() if (os.clock() - talk_start) > 10 then if focus > 0 then selfSay('Next please!') talkcount = 0end focus = 0 itemid = 0talk_start = 0 end if focus == 0 thencx, cy, cz = selfGetPosition()randmove = math.random(1,50)if randmove == 1 thennx = cx + 1endif randmove == 2 thennx = cx - 1endif randmove == 3 thenny = cy + 1endif randmove == 4 thenny = cy - 1endif randmove >= 5 thennx = cxny = cyendmoveToPosition(nx, ny, cz)--summons = 30--summons2 = 30endend  
    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:
    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 voce por false,só poe o numero 1,que vai acertar em tal area INDENPENDETE DA Posição
    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
     
    <spell name="Nome" words="palavras magicas" maglv="ml" mana="<mana>" enabled="1"><vocation id="2" /><vocation id="1" /></spell>  
    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:
    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:
     
    --100000= all time----50000= each 2 time----33333= each 3 time----20000= each 5 time----10000= each 10 time----6666= each 15 time----5000 = each 20 time----4000 = each 25 time----3333 = each 30 time----2857 = each 35 time----2500 = each 40 time----2222 = each 45 time----2000 = each 50 time----1818 = each 55 time----1666 = each 60 time----1538 = each 65 time----1428 = each 70 time----1333 = each 75 time----1000 = each 100 time----909 = each 110 time----833 = each 120 time----800 = each 125 time--666 = each 150 time----588 = each 170 time----555 = each 180 time----500 = each 200 time----400 = each 250 time----333 = each 300 time--  
    Quests
    Quests é nas Actions, e na verdade nem é tão dificil
    ai vai
    crie um arquivo .lua chamado hmm
     
    - Hmm Questfunction onUse(cid, item, frompos, item2, topos)   if item.uid == 5003 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You Have Found 100 hmm's to Hunt.")  doPlayerAddItem(cid,2311,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    end   elseif item.uid == 5004 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have Found 100 uh to Hunt.")  doPlayerAddItem(cid,2265,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    endelseif item.uid == 5017 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have found 100 explosion to hunt.")  doPlayerAddItem(cid,2305,1)  setPlayerStorageValue(cid,5003,1)    endelse return 0   end   return 1end  
    _______________________________________________________________
    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:
    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
    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:
     
    --Hmm function onUse(cid, item, frompos, item2, topos)doorpos = {x=frompos.x, y=frompos.y, z=frompos.z}playerpos = getPlayerPosition(cid)playerlevel = getPlayerLevel(cid)if item.itemid == 1234 and doorpos.x == 1 and doorpos.y == 1 and doorpos.z == 1 thenif playerlevel > 100 thendoTeleportThing(cid,doorpos)elseif playerlevel < 100 thendoPlayerSendTextMessage(cid,22,"Você precisa ser level 100 para passar.")endendreturn 1end  
    __________________________________________________--
    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.")
    ufa acabo ateh q enfim heim
    quase ngm deve ter vindo ateh aki
    se vc veio nossa como vc aguenta?
    hehe
    espero q tenhaum gostado
    Créditos: Dum amigo rl q axo na net na casa do primo dele dai ele sabia q eu ia volta aki e me deu pra eu posta e kramba demorei quase 2h pra escreve tudu issu hehe, e infelizmente os créditos não sao meus dinovu, mais eu to voltando agora e logo logo farei um como o meu ultimo q felizmente ao chegar aki fikei sabendo q ele foi fixado ainda num descobri onde neh hehe mais ele fo fixado!
    vlw ae comentem plz!
    Atenciosamente,
    Sir Picaralhos.
    :laughing:
  6. Upvote
    Sir Picaralhos recebeu reputação de Lordfire em Cipsoft Lança Novo Sistema De Detecção De Bots   
    Uma grande *** são os jogadores que precisam de programa para poder jogar.
    Uma grande *** são os jogadores que se acham por um programa fazer tudo por eles.
    Sem mais.
     
     
    Concordo, acredito que não seja tão simples assim essa detecção do bot. Cip é uma empresa que vale alguns milhões de dólares, talvez eu ainda esteja jogando baixo. Há de uma equipe excelente e muito bem paga para formar modos de combater. Porém o modo mais certo seria updates em cada ServerSave. E vocês acreditam que se o interesse da Cip fosse realmente acabar com os bots ela não teria capacidade e capital para isso? Penso eu que ela tanto quer agradar os jogadores que repudiam pessoas que utilizam de forma injusta programas para serem melhores por não tem habilidade suficiente, assim como tenta agradar os jogadores que utilizam desses programas não fazendo updates constantes e sim de vez em quando. Se eu fosse empresário de uma empresa do porte da Cip, estaria orientado a faturar o maior ganho possível, e limitar um jogo ao invés de expandir a vários tipos de jogadores não seria uma jogada de mestre.
     
     
    O tibia não acabaria. Fato. Porque? Simplesmente pelo longo dos updates que venho acompanhando velhos bots utilizados no passado, como de mira presa por exemplo, foram incorporados no jogo pelas famosas hotkeys. O ataque pelo battle também foi incorporado para facilitar o jogo, se for pensar o Tibia em suas diversas atualizações incorporou certos comandos parecidos com antigos bots. Ou seja a incorporação futuramente de novos sistemas que facilitem a vida dos jogadores não me surpreenderiam.
     
    Sem mais.
    Abraço
     
    Att. Rafa
  7. Upvote
    Sir Picaralhos deu reputação a nastrowo em Diferenças Entre; Vps, Dedicado E Cloud Computing, Seus Custos E Outros!   
    Olá,
     
    Vi que muitas pessoas tem essas dúvidas, e o pessoal não sabe o custo disso, nem a diferença...
     
    Vamos começar...
     
    Dedicado
    Um dedicado é o que há de mais grande digamos assim, tem alta perfomance e normalmente alta disponibilidade.
    Um dedicado é um computador especialmente para servidores, é só você e mais ninguém em um dedicado. Toda memória pode ser usada, assim como link, e espaço. Óbvio que o custo é maior, mas é excelente! Em um dedicado você pode criar VPS, e vender também. O dedicado é próprio para grandes aplicações e/ou projetos. No dedicado você decide qual instalar, Linux ou Windows!
     
    Custo de R$250 a R$600
     
     
    VPS
     
     
    Um servidor VPS não é semi-dedicado, VPS é Virtual Private Server, é um servidor no qual é virtualizado. Existe um dedicado e esse dedicado utiliza um sistema para virtualizar váaaarios servidores dentro do mesmo dedicado, normalmente se usa o SolusVM ou HyperVM, existem outros, mas estes 2 são os mais populares. Como funciona? O sistema executa uma imagem (Linux ou Windows) que já está dentro do servidor, e virtualiza, ou seja, cria outra máquina (servidor), e assim se torna um VPS, um servidor virtualizado.
     
    Disponibilidade
    Não podemos dizer que ele vá ficar 24hs online com toda certeza, ou que ele será ótimo, alta perfomance, ou ainda dizer que em um VPS ou dedicado terá sempre uma conexão remota, um servidor VPS pode ser virtualizado em Windows (que é um computador normal, só que em um VPS) em windows, claro, existe conexão remota, diferente do linux que não tem, existem ceeeentenas de diferenças entre os dois. Um servidor VPS também pode cair, pode dar erro em vários fatores que deixam ele online, dar problema de link, ataques DDoS, DoS, eXploit, etc. Além de quedas do dedicado, se o dedicado cair, ou der algum problema, todos os servidores virtuais também terão. Normalmente um dedicado fica 99.0~99.9% de uptime. Ao virtualizar, a pessoa que está virtualizando, provavelmente proprietária do dedicado, pode limitar vários fatores, tais como, nucleos de processamento, memória, espaço em disco, memória burst, etc. Em um VPS tudo pode ser alterado muuuuito facilmente, diferente de um dedicado, um dedicado dentro do sistema (solus vm, etc.) pode ir lá, editar o VPS e trocar, se pode ter mais ou menos recursos, sem afetar NADA. Já o dedicado não, ele é fisíco, diferente do VPS que é virtual (virtualizado), o dedicado por ser fisíco, tem que ter alguém pra mecher (fisicamente), e isso não é num piscar de olhos! Tudo conta em um servidor dedicado & vps, segurança por exemplo, tem que ter RAID, o que é? É um sistema que faz com que se o HD queimar no dedicado, tem outro com as mesmas informações, não é backup, simplesmente se um queimar o outro entra em ativa funcionando. Tem também a questão de velocidade, se for nacional dependendo do link terá um bom ping e talvez sem muito lag, se for EUA tem que ter um link ótimo e ainda sim terá um ping alto e possíveis (muito) lag.
     
    Custo de R$40 a R$250
     
    Cloud Computing
    O Cloud Computing é praticamente um VPS, só que ele é semi-dedicado, por que?
    Porque ele ao invés de utilizar a virtualização OpenVZ, KVM ou outras, utiliza Citrix! E que merda é essa? Em OpenVZ por exemplo, é um tipo de virtualização, a mesma permite oversell, ou seja, você pode criar dentro de um dedicado 100 servidores VPS, com 8GB, sendo que seu dedicado só ele tem 8GB. Já em Citrix, não. O que você dá ao servidor, é descontado do dedicado!
     
    E porque é obrigatório Citrix para fazer um cloudcomputing? Por que simplesmente os desenvolvedores não conseguiram tornar o mesmo compatível com o Kernel do OpenVZ, ou KVM. Isso é mais ligado normalmente á hospedagens e/ou servidores Linux.
     
    E como Funciona? O Cloud Computing, ele está interligado entre vários dedicado (normalmente 3 a 4). Isso mesmo, os arquivos ficam em diversos servidores em diversos locais, se um dedicado cair, o outro ainda está online! Então a probabilidade de um Cloud cair, é de 1 em 1 milhão, mas não é impossível!!!
     
    Custo de R$100 a R$400
     
     
    Enfim, só gostaria de tirar essa dúvida da galera mesmo!
    Espero ter tirado a dúvida do pessoal, qualquer coisa é só perguntar!
    Respondendo a algo fácil.. Por que sei disso tudo? Sou proprietário de uma empresa de hospedagens de sites, temos 9 dedicados na Limestone (datacenter) e 2 no Brasil na ALOG (datacenter). É no caso, a uGupa Networks; www.ugupa.com.br (espero não ser um problema por o link (: )
     
    Abraço a todos!
     

  8. Upvote
    Sir Picaralhos recebeu reputação de xXdarkanoXx em Quer Aprender A Ser Scripter?   
    Dividi em fases
    Entaum vamos lah ensinalo 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endExplicando :Nesta Parte se vc fala hi para ele,ele fala: Hello ( e seu nome)[color=blue]' .. creatureGetName(cid) .. ' Esse comando Faz o Npc falar o nome do char(cid) que falou hi[/color]Sempre Use essa parte no começo,se um char,fala hi e depois fala hi denovo o npc fala: I'm Already Talking to You,Pode Ser Alterado nesta Parte:if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')<---else if focus > 0 then      selfSay('Wait.')<--neste é quando o npc está atendendo outra pessoas      endend     Continuando(vamos usar como exemplo um npc que vende um axe ring 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endif string.find(msg, '(%a*)offer(%a*)') and cid == focus thenselfSay('I am selling all types of rings!')endif string.find(msg, '(%a*)rings(%a*)') and cid == focus thenselfSay('I Sell Axe Ring,Club Ring,Crystal Ring,Dwarven Ring,Esmerald Bagle,Energy Ring,Gold Ring,Life Ring.Might Ring,Power Ring,Ring of Healing,Ring of the Skies,Stealth Ring,Sword Ring,Time Ring and Weding Ring.')talk_start = os.clock()returnendif string.find(msg, '(%a*)axe ring(%a*)') and cid == focus thenselfSay('Do You want to buy an Axe Ring for 400gps?')talk_start = os.clock()itemid = 2208count = 1cost = 400talkcount = 1returnendif string.find(msg, 'yes(%a*)') and cid == focus and talkcount == 1 then       talkcount = 0buy(focus,itemid,count,cost)endif string.find(msg, '(%a*)no(%a*)') and cid == focus thenselfSay('Ok, is there something else you want? If so tell me.')itemid = 0count = 0cost = 0talkcount = 0end if string.find(msg, 'bye(%a*)') and cid == focus thenselfSay('Farewell, ' .. creatureGetName(cid) .. '!')focus = 0itemid = 0talk_start = 0talkcount = 0end endfunction onCreatureChangeOutfit(creature)endfunction onThink() if (os.clock() - talk_start) > 10 then if focus > 0 then selfSay('Next please!') talkcount = 0end focus = 0 itemid = 0talk_start = 0 end if focus == 0 thencx, cy, cz = selfGetPosition()randmove = math.random(1,50)if randmove == 1 thennx = cx + 1endif randmove == 2 thennx = cx - 1endif randmove == 3 thenny = cy + 1endif randmove == 4 thenny = cy - 1endif randmove >= 5 thennx = cxny = cyendmoveToPosition(nx, ny, cz)--summons = 30--summons2 = 30endend  
    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:
    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 voce por false,só poe o numero 1,que vai acertar em tal area INDENPENDETE DA Posição
    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
     
    <spell name="Nome" words="palavras magicas" maglv="ml" mana="<mana>" enabled="1"><vocation id="2" /><vocation id="1" /></spell>  
    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:
    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:
     
    --100000= all time----50000= each 2 time----33333= each 3 time----20000= each 5 time----10000= each 10 time----6666= each 15 time----5000 = each 20 time----4000 = each 25 time----3333 = each 30 time----2857 = each 35 time----2500 = each 40 time----2222 = each 45 time----2000 = each 50 time----1818 = each 55 time----1666 = each 60 time----1538 = each 65 time----1428 = each 70 time----1333 = each 75 time----1000 = each 100 time----909 = each 110 time----833 = each 120 time----800 = each 125 time--666 = each 150 time----588 = each 170 time----555 = each 180 time----500 = each 200 time----400 = each 250 time----333 = each 300 time--  
    Quests
    Quests é nas Actions, e na verdade nem é tão dificil
    ai vai
    crie um arquivo .lua chamado hmm
     
    - Hmm Questfunction onUse(cid, item, frompos, item2, topos)   if item.uid == 5003 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You Have Found 100 hmm's to Hunt.")  doPlayerAddItem(cid,2311,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    end   elseif item.uid == 5004 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have Found 100 uh to Hunt.")  doPlayerAddItem(cid,2265,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    endelseif item.uid == 5017 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have found 100 explosion to hunt.")  doPlayerAddItem(cid,2305,1)  setPlayerStorageValue(cid,5003,1)    endelse return 0   end   return 1end  
    _______________________________________________________________
    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:
    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
    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:
     
    --Hmm function onUse(cid, item, frompos, item2, topos)doorpos = {x=frompos.x, y=frompos.y, z=frompos.z}playerpos = getPlayerPosition(cid)playerlevel = getPlayerLevel(cid)if item.itemid == 1234 and doorpos.x == 1 and doorpos.y == 1 and doorpos.z == 1 thenif playerlevel > 100 thendoTeleportThing(cid,doorpos)elseif playerlevel < 100 thendoPlayerSendTextMessage(cid,22,"Você precisa ser level 100 para passar.")endendreturn 1end  
    __________________________________________________--
    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.")
    ufa acabo ateh q enfim heim
    quase ngm deve ter vindo ateh aki
    se vc veio nossa como vc aguenta?
    hehe
    espero q tenhaum gostado
    Créditos: Dum amigo rl q axo na net na casa do primo dele dai ele sabia q eu ia volta aki e me deu pra eu posta e kramba demorei quase 2h pra escreve tudu issu hehe, e infelizmente os créditos não sao meus dinovu, mais eu to voltando agora e logo logo farei um como o meu ultimo q felizmente ao chegar aki fikei sabendo q ele foi fixado ainda num descobri onde neh hehe mais ele fo fixado!
    vlw ae comentem plz!
    Atenciosamente,
    Sir Picaralhos.
    :laughing:
  9. Upvote
    Sir Picaralhos recebeu reputação de LeaK em Quer Aprender A Ser Scripter?   
    Dividi em fases
    Entaum vamos lah ensinalo 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endExplicando :Nesta Parte se vc fala hi para ele,ele fala: Hello ( e seu nome)[color=blue]' .. creatureGetName(cid) .. ' Esse comando Faz o Npc falar o nome do char(cid) que falou hi[/color]Sempre Use essa parte no começo,se um char,fala hi e depois fala hi denovo o npc fala: I'm Already Talking to You,Pode Ser Alterado nesta Parte:if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')<---else if focus > 0 then      selfSay('Wait.')<--neste é quando o npc está atendendo outra pessoas      endend     Continuando(vamos usar como exemplo um npc que vende um axe ring 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endif string.find(msg, '(%a*)offer(%a*)') and cid == focus thenselfSay('I am selling all types of rings!')endif string.find(msg, '(%a*)rings(%a*)') and cid == focus thenselfSay('I Sell Axe Ring,Club Ring,Crystal Ring,Dwarven Ring,Esmerald Bagle,Energy Ring,Gold Ring,Life Ring.Might Ring,Power Ring,Ring of Healing,Ring of the Skies,Stealth Ring,Sword Ring,Time Ring and Weding Ring.')talk_start = os.clock()returnendif string.find(msg, '(%a*)axe ring(%a*)') and cid == focus thenselfSay('Do You want to buy an Axe Ring for 400gps?')talk_start = os.clock()itemid = 2208count = 1cost = 400talkcount = 1returnendif string.find(msg, 'yes(%a*)') and cid == focus and talkcount == 1 then       talkcount = 0buy(focus,itemid,count,cost)endif string.find(msg, '(%a*)no(%a*)') and cid == focus thenselfSay('Ok, is there something else you want? If so tell me.')itemid = 0count = 0cost = 0talkcount = 0end if string.find(msg, 'bye(%a*)') and cid == focus thenselfSay('Farewell, ' .. creatureGetName(cid) .. '!')focus = 0itemid = 0talk_start = 0talkcount = 0end endfunction onCreatureChangeOutfit(creature)endfunction onThink() if (os.clock() - talk_start) > 10 then if focus > 0 then selfSay('Next please!') talkcount = 0end focus = 0 itemid = 0talk_start = 0 end if focus == 0 thencx, cy, cz = selfGetPosition()randmove = math.random(1,50)if randmove == 1 thennx = cx + 1endif randmove == 2 thennx = cx - 1endif randmove == 3 thenny = cy + 1endif randmove == 4 thenny = cy - 1endif randmove >= 5 thennx = cxny = cyendmoveToPosition(nx, ny, cz)--summons = 30--summons2 = 30endend  
    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:
    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 voce por false,só poe o numero 1,que vai acertar em tal area INDENPENDETE DA Posição
    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
     
    <spell name="Nome" words="palavras magicas" maglv="ml" mana="<mana>" enabled="1"><vocation id="2" /><vocation id="1" /></spell>  
    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:
    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:
     
    --100000= all time----50000= each 2 time----33333= each 3 time----20000= each 5 time----10000= each 10 time----6666= each 15 time----5000 = each 20 time----4000 = each 25 time----3333 = each 30 time----2857 = each 35 time----2500 = each 40 time----2222 = each 45 time----2000 = each 50 time----1818 = each 55 time----1666 = each 60 time----1538 = each 65 time----1428 = each 70 time----1333 = each 75 time----1000 = each 100 time----909 = each 110 time----833 = each 120 time----800 = each 125 time--666 = each 150 time----588 = each 170 time----555 = each 180 time----500 = each 200 time----400 = each 250 time----333 = each 300 time--  
    Quests
    Quests é nas Actions, e na verdade nem é tão dificil
    ai vai
    crie um arquivo .lua chamado hmm
     
    - Hmm Questfunction onUse(cid, item, frompos, item2, topos)   if item.uid == 5003 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You Have Found 100 hmm's to Hunt.")  doPlayerAddItem(cid,2311,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    end   elseif item.uid == 5004 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have Found 100 uh to Hunt.")  doPlayerAddItem(cid,2265,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    endelseif item.uid == 5017 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have found 100 explosion to hunt.")  doPlayerAddItem(cid,2305,1)  setPlayerStorageValue(cid,5003,1)    endelse return 0   end   return 1end  
    _______________________________________________________________
    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:
    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
    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:
     
    --Hmm function onUse(cid, item, frompos, item2, topos)doorpos = {x=frompos.x, y=frompos.y, z=frompos.z}playerpos = getPlayerPosition(cid)playerlevel = getPlayerLevel(cid)if item.itemid == 1234 and doorpos.x == 1 and doorpos.y == 1 and doorpos.z == 1 thenif playerlevel > 100 thendoTeleportThing(cid,doorpos)elseif playerlevel < 100 thendoPlayerSendTextMessage(cid,22,"Você precisa ser level 100 para passar.")endendreturn 1end  
    __________________________________________________--
    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.")
    ufa acabo ateh q enfim heim
    quase ngm deve ter vindo ateh aki
    se vc veio nossa como vc aguenta?
    hehe
    espero q tenhaum gostado
    Créditos: Dum amigo rl q axo na net na casa do primo dele dai ele sabia q eu ia volta aki e me deu pra eu posta e kramba demorei quase 2h pra escreve tudu issu hehe, e infelizmente os créditos não sao meus dinovu, mais eu to voltando agora e logo logo farei um como o meu ultimo q felizmente ao chegar aki fikei sabendo q ele foi fixado ainda num descobri onde neh hehe mais ele fo fixado!
    vlw ae comentem plz!
    Atenciosamente,
    Sir Picaralhos.
    :laughing:
  10. Upvote
    Sir Picaralhos recebeu reputação de vitorszvitim em Quer Aprender A Ser Scripter?   
    Dividi em fases
    Entaum vamos lah ensinalo 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endExplicando :Nesta Parte se vc fala hi para ele,ele fala: Hello ( e seu nome)[color=blue]' .. creatureGetName(cid) .. ' Esse comando Faz o Npc falar o nome do char(cid) que falou hi[/color]Sempre Use essa parte no começo,se um char,fala hi e depois fala hi denovo o npc fala: I'm Already Talking to You,Pode Ser Alterado nesta Parte:if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')<---else if focus > 0 then      selfSay('Wait.')<--neste é quando o npc está atendendo outra pessoas      endend     Continuando(vamos usar como exemplo um npc que vende um axe ring 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endif string.find(msg, '(%a*)offer(%a*)') and cid == focus thenselfSay('I am selling all types of rings!')endif string.find(msg, '(%a*)rings(%a*)') and cid == focus thenselfSay('I Sell Axe Ring,Club Ring,Crystal Ring,Dwarven Ring,Esmerald Bagle,Energy Ring,Gold Ring,Life Ring.Might Ring,Power Ring,Ring of Healing,Ring of the Skies,Stealth Ring,Sword Ring,Time Ring and Weding Ring.')talk_start = os.clock()returnendif string.find(msg, '(%a*)axe ring(%a*)') and cid == focus thenselfSay('Do You want to buy an Axe Ring for 400gps?')talk_start = os.clock()itemid = 2208count = 1cost = 400talkcount = 1returnendif string.find(msg, 'yes(%a*)') and cid == focus and talkcount == 1 then       talkcount = 0buy(focus,itemid,count,cost)endif string.find(msg, '(%a*)no(%a*)') and cid == focus thenselfSay('Ok, is there something else you want? If so tell me.')itemid = 0count = 0cost = 0talkcount = 0end if string.find(msg, 'bye(%a*)') and cid == focus thenselfSay('Farewell, ' .. creatureGetName(cid) .. '!')focus = 0itemid = 0talk_start = 0talkcount = 0end endfunction onCreatureChangeOutfit(creature)endfunction onThink() if (os.clock() - talk_start) > 10 then if focus > 0 then selfSay('Next please!') talkcount = 0end focus = 0 itemid = 0talk_start = 0 end if focus == 0 thencx, cy, cz = selfGetPosition()randmove = math.random(1,50)if randmove == 1 thennx = cx + 1endif randmove == 2 thennx = cx - 1endif randmove == 3 thenny = cy + 1endif randmove == 4 thenny = cy - 1endif randmove >= 5 thennx = cxny = cyendmoveToPosition(nx, ny, cz)--summons = 30--summons2 = 30endend  
    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:
    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 voce por false,só poe o numero 1,que vai acertar em tal area INDENPENDETE DA Posição
    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
     
    <spell name="Nome" words="palavras magicas" maglv="ml" mana="<mana>" enabled="1"><vocation id="2" /><vocation id="1" /></spell>  
    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:
    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:
     
    --100000= all time----50000= each 2 time----33333= each 3 time----20000= each 5 time----10000= each 10 time----6666= each 15 time----5000 = each 20 time----4000 = each 25 time----3333 = each 30 time----2857 = each 35 time----2500 = each 40 time----2222 = each 45 time----2000 = each 50 time----1818 = each 55 time----1666 = each 60 time----1538 = each 65 time----1428 = each 70 time----1333 = each 75 time----1000 = each 100 time----909 = each 110 time----833 = each 120 time----800 = each 125 time--666 = each 150 time----588 = each 170 time----555 = each 180 time----500 = each 200 time----400 = each 250 time----333 = each 300 time--  
    Quests
    Quests é nas Actions, e na verdade nem é tão dificil
    ai vai
    crie um arquivo .lua chamado hmm
     
    - Hmm Questfunction onUse(cid, item, frompos, item2, topos)   if item.uid == 5003 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You Have Found 100 hmm's to Hunt.")  doPlayerAddItem(cid,2311,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    end   elseif item.uid == 5004 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have Found 100 uh to Hunt.")  doPlayerAddItem(cid,2265,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    endelseif item.uid == 5017 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have found 100 explosion to hunt.")  doPlayerAddItem(cid,2305,1)  setPlayerStorageValue(cid,5003,1)    endelse return 0   end   return 1end  
    _______________________________________________________________
    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:
    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
    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:
     
    --Hmm function onUse(cid, item, frompos, item2, topos)doorpos = {x=frompos.x, y=frompos.y, z=frompos.z}playerpos = getPlayerPosition(cid)playerlevel = getPlayerLevel(cid)if item.itemid == 1234 and doorpos.x == 1 and doorpos.y == 1 and doorpos.z == 1 thenif playerlevel > 100 thendoTeleportThing(cid,doorpos)elseif playerlevel < 100 thendoPlayerSendTextMessage(cid,22,"Você precisa ser level 100 para passar.")endendreturn 1end  
    __________________________________________________--
    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.")
    ufa acabo ateh q enfim heim
    quase ngm deve ter vindo ateh aki
    se vc veio nossa como vc aguenta?
    hehe
    espero q tenhaum gostado
    Créditos: Dum amigo rl q axo na net na casa do primo dele dai ele sabia q eu ia volta aki e me deu pra eu posta e kramba demorei quase 2h pra escreve tudu issu hehe, e infelizmente os créditos não sao meus dinovu, mais eu to voltando agora e logo logo farei um como o meu ultimo q felizmente ao chegar aki fikei sabendo q ele foi fixado ainda num descobri onde neh hehe mais ele fo fixado!
    vlw ae comentem plz!
    Atenciosamente,
    Sir Picaralhos.
    :laughing:
  11. Upvote
    Sir Picaralhos recebeu reputação de churupetinha em Quer Aprender A Ser Scripter?   
    Dividi em fases
    Entaum vamos lah ensinalo 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endExplicando :Nesta Parte se vc fala hi para ele,ele fala: Hello ( e seu nome)[color=blue]' .. creatureGetName(cid) .. ' Esse comando Faz o Npc falar o nome do char(cid) que falou hi[/color]Sempre Use essa parte no começo,se um char,fala hi e depois fala hi denovo o npc fala: I'm Already Talking to You,Pode Ser Alterado nesta Parte:if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')<---else if focus > 0 then      selfSay('Wait.')<--neste é quando o npc está atendendo outra pessoas      endend     Continuando(vamos usar como exemplo um npc que vende um axe ring 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endif string.find(msg, '(%a*)offer(%a*)') and cid == focus thenselfSay('I am selling all types of rings!')endif string.find(msg, '(%a*)rings(%a*)') and cid == focus thenselfSay('I Sell Axe Ring,Club Ring,Crystal Ring,Dwarven Ring,Esmerald Bagle,Energy Ring,Gold Ring,Life Ring.Might Ring,Power Ring,Ring of Healing,Ring of the Skies,Stealth Ring,Sword Ring,Time Ring and Weding Ring.')talk_start = os.clock()returnendif string.find(msg, '(%a*)axe ring(%a*)') and cid == focus thenselfSay('Do You want to buy an Axe Ring for 400gps?')talk_start = os.clock()itemid = 2208count = 1cost = 400talkcount = 1returnendif string.find(msg, 'yes(%a*)') and cid == focus and talkcount == 1 then       talkcount = 0buy(focus,itemid,count,cost)endif string.find(msg, '(%a*)no(%a*)') and cid == focus thenselfSay('Ok, is there something else you want? If so tell me.')itemid = 0count = 0cost = 0talkcount = 0end if string.find(msg, 'bye(%a*)') and cid == focus thenselfSay('Farewell, ' .. creatureGetName(cid) .. '!')focus = 0itemid = 0talk_start = 0talkcount = 0end endfunction onCreatureChangeOutfit(creature)endfunction onThink() if (os.clock() - talk_start) > 10 then if focus > 0 then selfSay('Next please!') talkcount = 0end focus = 0 itemid = 0talk_start = 0 end if focus == 0 thencx, cy, cz = selfGetPosition()randmove = math.random(1,50)if randmove == 1 thennx = cx + 1endif randmove == 2 thennx = cx - 1endif randmove == 3 thenny = cy + 1endif randmove == 4 thenny = cy - 1endif randmove >= 5 thennx = cxny = cyendmoveToPosition(nx, ny, cz)--summons = 30--summons2 = 30endend  
    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:
    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 voce por false,só poe o numero 1,que vai acertar em tal area INDENPENDETE DA Posição
    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
     
    <spell name="Nome" words="palavras magicas" maglv="ml" mana="<mana>" enabled="1"><vocation id="2" /><vocation id="1" /></spell>  
    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:
    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:
     
    --100000= all time----50000= each 2 time----33333= each 3 time----20000= each 5 time----10000= each 10 time----6666= each 15 time----5000 = each 20 time----4000 = each 25 time----3333 = each 30 time----2857 = each 35 time----2500 = each 40 time----2222 = each 45 time----2000 = each 50 time----1818 = each 55 time----1666 = each 60 time----1538 = each 65 time----1428 = each 70 time----1333 = each 75 time----1000 = each 100 time----909 = each 110 time----833 = each 120 time----800 = each 125 time--666 = each 150 time----588 = each 170 time----555 = each 180 time----500 = each 200 time----400 = each 250 time----333 = each 300 time--  
    Quests
    Quests é nas Actions, e na verdade nem é tão dificil
    ai vai
    crie um arquivo .lua chamado hmm
     
    - Hmm Questfunction onUse(cid, item, frompos, item2, topos)   if item.uid == 5003 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You Have Found 100 hmm's to Hunt.")  doPlayerAddItem(cid,2311,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    end   elseif item.uid == 5004 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have Found 100 uh to Hunt.")  doPlayerAddItem(cid,2265,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    endelseif item.uid == 5017 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have found 100 explosion to hunt.")  doPlayerAddItem(cid,2305,1)  setPlayerStorageValue(cid,5003,1)    endelse return 0   end   return 1end  
    _______________________________________________________________
    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:
    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
    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:
     
    --Hmm function onUse(cid, item, frompos, item2, topos)doorpos = {x=frompos.x, y=frompos.y, z=frompos.z}playerpos = getPlayerPosition(cid)playerlevel = getPlayerLevel(cid)if item.itemid == 1234 and doorpos.x == 1 and doorpos.y == 1 and doorpos.z == 1 thenif playerlevel > 100 thendoTeleportThing(cid,doorpos)elseif playerlevel < 100 thendoPlayerSendTextMessage(cid,22,"Você precisa ser level 100 para passar.")endendreturn 1end  
    __________________________________________________--
    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.")
    ufa acabo ateh q enfim heim
    quase ngm deve ter vindo ateh aki
    se vc veio nossa como vc aguenta?
    hehe
    espero q tenhaum gostado
    Créditos: Dum amigo rl q axo na net na casa do primo dele dai ele sabia q eu ia volta aki e me deu pra eu posta e kramba demorei quase 2h pra escreve tudu issu hehe, e infelizmente os créditos não sao meus dinovu, mais eu to voltando agora e logo logo farei um como o meu ultimo q felizmente ao chegar aki fikei sabendo q ele foi fixado ainda num descobri onde neh hehe mais ele fo fixado!
    vlw ae comentem plz!
    Atenciosamente,
    Sir Picaralhos.
    :laughing:
  12. Upvote
    Sir Picaralhos recebeu reputação de jcarlos.teixeira em The Mysteries Of Rookgaard   
    Olá, poucos devem me conhecer, pois poucos devem ser da minha época.


    Estou voltando a ativa no mundo Tibiano, após 5 anos de ausência, a pouco mais de 1 semana voltei a jogar, e tópicos sobre Rookgaard ou a conhecida Rook, de seus mistérios e a mais cobiçada quest da Sword of Fury, dita como a espada da fúria por boatos de pertencerem a Kylindra Ennorath que falaremos mais a frente.

     

    Ao Final do Tópico estarei postando informações de mundo/Character de onde estou atuando em Rook para futuramente alguém quiser se juntar a mim.

     

    Bom o objetivo principal deste tópico é desvendar todas as lendas de Rook e descobrir TODOS os seus mistérios.

    Com foco principal na Sword of Fury.

     

    Vamos começar com as principais quests ja muito bem conhecidas por jogadores experientes.

    Mas ainda assim continuam a ajudar novos tibianos que todos os dias se juntam a nós.

    Assim como novos ROOKERS que também se juntam a nós curiosos de plantão =D

     

    Obs: Observei novos membros da equipe xTibia desvalorizando a lenda da SoF, até mesmo desmotivando como algo do tipo:

     

    -"não vale a pena reviver esse assunto que, já está mais que esclarecido".

    *Caros curiosos e desbravadores de mistérios tibianos, quando algo se torna esclarecido é porque foi desvendado, se o mito foi desvendado porque ainda não a provas da execução da quest?

     

    ou como:

     

    -"Antigamente isso poderia ser considerado uma lenda dentro do Tibia.

    Hoje já é algo normal. "

    *Lendas só acabam depois que são desvendadas.

     

     

    Acredito que não só eu como diversos jogadores antigos, que jogaram em versões como 7.3 nunca se esqueceram da Sword of Fury e do desejo de possui-la.

    E que é algo que vale mais do que a pena tentar desvendar.

    Alguns membros da equipe xTibia que são mais velhos no fórum sabem sobre mim e o quanto postei sobre rook, não conclui a missão de desvendar a lenda da SoF mas consegui muitas outras, e agora pretendo voltar as tentativas de desvendar não só a quest como toda sua História por trás dela.

     
    ¨Como o tópico ficou bem longo fiz uma maneira mais fácil de se encontrar no tópico sem precisar ler todo ele e prcurar simplesmente pela abordagem específica de seu interesse.
     



    - Índice -

     

     

    ( 01 )Rapier Quest

     

    ( 02 )Knife Quest

     

    ( 03 ) Doublet Quest

     

    ( 04 ) Golbin Temple Quest

     

    ( 05 ) Torch Quest

     

    ( 06 ) Short Sword Quest

     

    ( 07 ) Bear Room Quest

     

    ( 08 ) Minotaur Hell Quest

     

    ( 09 ) Katana Room Quest

     

    ( Legends ) Tudo sobre a cobiçada Sword Of Fury

     

     

    (Aperte ctrl+F e digite o número do assunto que procura no tópico)

     
     
     
    ~*~
     
     
    -= Rook e suas principais quests =-
    por Iaguera (Tópico oficial)
    Créditos: Portal Tibia
     
     
    Level 0(Sem requerimento)
     
    ( 01 ) Rapier Quest
    Recompensa: Rapier
     
    1- Entre no esgoto principal de Rookgaard (dos rats).
    2- Depois de entrar, vá para o oeste e desça o buraco.

     
     
    3- Você irá encontrar alguns ratos, que você pode matar ou simplesmente ignorar.
    4- A caixa está na parte nordeste da sala, ao abri-la você receberá sua Rapier.
     

     
     
    Itens Necessários: Se preferir leve um shield.
     
     
     
    ( 02 ) Knife Quest
    Recompensa: Doublet
     
    1- Entre no esgoto principal de Rookgaard (dos rats).
    2- Siga o caminho para leste e sul. Você encontrará alguns ratos. Haverá 3-4 guardando o baú da quest.

    3- O baú estará quase escondido atrás de alguns escombros. De "Use" o baú para receber a Combat Knife.
     
    Itens Necessários: Se preferir leve um shield.
     
     
    ( 03 ) Doublet Quest
    Recompensa: Doublet
     
    1- Vá ao estábulo ao norte da loja de Tom e desça a escada.
    2- Acenda sua tocha e mate o rato que estará lá.
    3- Dê "Use" no chão, ao lado da entrada do bueiro, para pegar o Doublet.
     
    Itens Necessários: --------------------------------
     
     
    ( 04 ) Golbin Temple Quest
    Recompensa: 50 Gp's, 4 Snowballs, 5 Small Stones, Sandals, Pan, Vial de Milk
    Aconselho level 6+
     
    1- Vá para a Premium Troll Cave de Rookgaard.
    2- Após descer, vá um pouco para o norte, deça a rampa, desça a próxima rampa, então suba o buraco.

    3- Então, vá para o norte até você ver um buraco, desça, depois desça novamente.

    4- Lá, vá reto para o sul, você irá encontrar Trolls e Orcs antes da ponte. Na ponte, se apresse em atravessar, os Goblins irão atirar pedras em você. Após passar você verá uma escadaria.

    5- Embaixo existem Goblins (note que eles tanto podem atacar melee como atirar pedras), mate ele(ou eles) ou apenas corra, vá para o sul, então para oeste, e lá terá uma rampa descendo. Desça.

    6- Vá para o norte. Tome cuidado com os Goblins trancados, tanto quanto com os que virão até você.

    7- Você verá uma escadaria de subida, lá tem 1 Minotaur, 1 Wasp, 3 Goblins e 1 Orc Spearman, mate todos e procure nos baús a sua recompensa.

     
    A pan pode ser trocada com o Billy por uma Antidote Rune e o Small Axe pode ser trocado com o Al Dee por uma pick.
     
    Itens Necessários: Bons equips para conseguir matar os golbins e minotaurs.
     
     
    ( 05 ) Torch Quest
    Recompensa: Torch (tocha)
     
    Quando você entrar no porão da academia, siga para o norte. Abra todas as portas que estiverem no caminho, e quando você chegar no topo, existe uma torch dentro de uma box. Essa pode ser a primeira quest que você faça.

     
    Level 2+
     
    ( 06 ) Short Sword Quest
    Recompensa: Short Sword
    Aconselho level 3+
     
    1- Vá para as docas no leste da cidade de Rookgaard (aqui). Tenha cuidado com os Bugs, Spiders, e especificamente Poison Spiders perto da balsa.

    2- De "Use" no baú para receber o livro
    3- Vá até a Rookgaard Academy, e fale com Amber.
    Diga: Hi, Book, Yes
     
    Itens Necessários: Equips para proteção.
     
     
    ( 07 ) Bear Room Quest
    Recompensa: Chain Armor, Brass Helmet, 12 Arrows e 40 Gp's
    Aconselho level 4+ ou em grupo
     
    1- Vá para o prédio abandonado ao norte de Rookgaard.

    2- Vá para leste e desça a escada. (Existem alguns Trolls e possíveis spiders aqui)

    3- Desça outra vez como mostrado no mapa. Existem alguns Orcs no caminho.

    4- Desça outra vez. Há 2~4 Orcs aqui. Se preferir corra deles.

    5- Andar final. Há 1~2 Minotaurs e Orcs nesta sala.
    6- Pegue a Key 4601. Para pegá-la, use pick no chão, ao sul da gran mesa. Haverá um buraco para você descer. Na sala do buraco há um baú com a Key 4601. Volte subindo a escada.

    7- Ao norte da grande mesa há uma alavanca. A alavanca pode bloquear a passagem para a sala do baú ao norte. Se a pedra estiver à frente da porta da sala, use a alavanca. Destraque a porta usando a chave e mata o Bear. Se alguem bloquear o caminho pela porta, você pode descer pelo bueiro. Haverá 4 Spiders, pode matá-las ou simplesmente subir a escada e ir embora.

     
    Itens Necessários: Equips para poder matar os orcs e minotaurs.
     
     
    ( 08 ) Minotaur Hell Quest
    Recompensa: Carlin Sword, 4 Poison Arrows, 10 Arrows e uma Fishing Rod
    Aconselho level 4+ ou em um grupo de 4-6 pessoas
     

     
     
    1- Siga até a escada, e desça. Haverá 1~2 Trolls e talvez algumas spiders.
    2- Siga o caminho até a escada, e desça novamente. Havéra 1 Orc.
    3- Siga o caminho, o mais rápido possível, até se aproximar dá escada, mas não desça.
    4- Haverá 2 Minotaurs, 8 Orcs e alguns Wolves nesse respawn. Puxe-os, um de cada vez, para o piso superior, e mate-os em segurança. Após matar todos, desça a escada.
    5- Haverá vários Minotaurs nesse respawn, onde se encontra a quest, então, use uma das táticas:
    > Use os móveis que estiverem na caverna para trapar os Minotaurs em um local onde eles não consigam atacar-lo. *aconselho para times com leveis baixos, ou quando estiver sozinho*

    > Desça a escada e comece a correr, fazendo as três quest, e volte para a escada. *aconselho quando estiver sozinho*
    > Desça e mate todos os minotaurs, para depois fazer as quests tranquilas. *para uma melhor performance faça essa somente em grupo*
     
    Itens necessários:~~Leve life fluids para menos chance de morte.
    ~~Equips para uma melhor performance e menos chance de morte.
     
     
    ( 09 ) Katana Room Quest
    Recompensa: Katana, Viking Helmet, Key 4603
     
    1- Vá para os túmulos à nordeste da ilha, e abra o túmulo do meio com sua Shovel.

    2- Desça nele. Haverá algumas Spiders e uma Poison Spiders nessa área. Siga para a parte oeste até o buraco e pule dentro dele.

    3- Nessa área existe o spawn de alguns Skeletons. É recomendado que você mate todos eles antes de continuar, pois eles te seguirão e poderão bloquiar seu caminho de volta. Um bom modo para matá-los é ir para o sul da sala e matá-los um por um enquanto você estiver na passagem estreita.

    4- Vá para leste e encontre o ropespot (lugar para usar rope). Esteja preparado, pois a próxima sala pode tomar um pouco de tempo e skills.

    5- Use sua Rope para subir pelo buraco e entre na sala dos Rotworms. Nesta sala, existem muitos rotworms, então pode ser perigoso, até mesmo para os players com os skills mais altos. A melhor coisa a fazer é chegar até o outro buraco e descer nele o mais rápido possível, para evitar de ser trapado.

    6- Passe pelos poison fields. Se você comprou Antidote Runes, use-os depois de passa por todos os poison fields.
    7- Para pegar a Key 4603 siga para o norte. É recomendado que você use o modo de Defesensive Fighting enquanto corre pelos rotworms. A Key 4603 estará escondida em um dos corpos mortos. Quando você encontrá-la, volte para o sul.
    8- Vá para leste dos poison fields, e entre no buraco. Neste lugar existe um único Skeleton. Mate-o se quiser, abra a porta com a Key 4603, e desça as escadas. Mas tome cuidado, se a porta da sala do piso inferior estiver aberta, haverá 2 skeletons e um rotworm.

     

    9- Existe uma alavanca escondida atrás do pilar que está ao norte da sala. Use essa alavanca para abrir a porta (se ela estiver fechada).
    > A melhor maneira é esperar todas as criaturas sairem da sala e depois correr para dentro da sala e fechar a porta. Entretando, você também poderá matar as criaturas uma por uma na porta se você tiver amigos para te ajudar.

    10- O tesouro está escondido nos corpos humanos "frescos". Pegue seu Viking Helmet e Katana. Siga todo o caminho para sair da caverna.
    Obs.: Se alguem fechar a porta, use o teleporte para sair.

     
     
    Itens necessários: ~~Rope
    ~~Shovel
    ~~Small Health Potions para se curar de ataques de rotworms
    ~~2 Antidote Potions
     
    -Estas foram as principais quests de Rook
    -Tópico oficial postado :button_ok:
    -Créditos reais postado :button_ok:
     
     
    ~*~
     



     

     

    Legends of The Sword Of Fury

     

    ¨Trataremos de todos os boatos feitos por jogadores de diversos mundos tibianos, desmascaremos fakes e aprovaremos divulgações que forem confirmadas por nossa equipe.

     

    ¨Qualquer divulgação de uma descoberta sua pode vir parar neste tópico, após avaliação nossa, se confirmada e julgada verdadeira ou possivelmente veridica será adicionada aos demais fatos.

     
    Começando pela lenda da jovem Kylindra Ennorath, um tópico onde autor quis simplesmente falar sobre a humildade dos jogadores, sem intuito nenhum de divulgar uma possível hipótese de realização da quest ou parte dela.
    Aqui está o tópico e após ele nossa interpretação (novas interpretações são bem vindas).
     
     
    A Humildade E A Spike Sword
    por Rafaseu
    Créditos: Rafaseu e Vento
     



    Only the humble can touch the Sword of Fury...

     

    -Primeiramente, essa matéria não tem nada a ver com a quest da Sword of Fury. É simplesmente uma reflexão sobre a humildade. Sobre uma placa ao lado da espada mais lendária de Rookgaard. Placa essa que diz mais do que parece. E sobre as pelavras de um NPC que sempre diz que não somos suficientemente humildes.Segue uma pequena fábula contada desde muito tempo para as crianças da ilha.

     

    -Era uma vez, em Rookgaard, uma pequena garotinha. Ninguém sabia de onde ela veio ou para onde ela ia. A primeira coisa que ela viu foi o grande e mal Cipfried, e ela não gostou dele desde a primeira vez que o observou. Mesmo assim Cipfried foi bom com ela, mas ela atacou e arranhou a cara do Cipfried do pior jeito que podia fazer. Antes que os habitantes da cidade viessem ajudar Cipfried, com as suas feridas rapidamente curadas, ele chamou esta garota de "Kylindra Ennorath".

     

    -Kylindra, que era uma pequena menina elfo e estava muito ansiosa para aprender as artes de combate. Geralmente carregava um pequeno arco pra atirar nas pequenas criaturas, ou usava suas próprias unhas, ou uma espada. Quanto mais ela permanecia em Rookgaard, mais violenta ela se tornava. Até que um dia, ela começou a atacar as pessoas com quem morava. O Rei Tibianus ficou com raiva quando escutou que uma pequena garotinha estava trazendo medo para a cidade, e então ele mandou os seus melhores homens para expulsá-la. Entretanto, ninguém nunca mais ouviu-se falar sobre estes homens. Alguns dizem que eles se assustaram tanto ao ver Kylindra que acabaram procurando refúgio em Carlin. Outros dizem que todos eles morreram afogados. De qualquer maneira, após viver um ano de terror, os habitantes da cidade arrastaram Kylindra para o lugar mais distante que encontraram na Ilha, para que ela vivesse com os Orcs.

     

    -Todos pensaram quer a cidade estava salva, mas estavam enganados. Os Minotauros vieram para Rookgaard por um segundo portal, que era instável. Eles expulsaram os Orcs com apenas alguns truques de fogo e energia. Mas Kylindra nao estava impressionada com aquelas seres que pareciam vacas mas que andavam sobre duas pernas. Com seu arco, espada e flechas envenenadas, enfrentou fileiras de minotauros até ficar frente a frente com o temido Minotauro Mago. Kylindra sabia quer não duraria muito tempo lutando contra o Minotauro Mago, e correu na direção do portal. Entretanto, antes dela poder pular dentro do portal instável, que significava a sua própria morte, ela viu uma luz brilhante.

     

    -O Minotauro Mago parou de correr atrás da pequena Kylindra e trancou a porta, vedando-a com sua magia negra. Kylindra, como era má, atirou algumas flechas contra a luz. Entretanto, as flechas não caíram mais do que a alguns metros de distância, e não atingiram nada, a não ser o vazio. Então ela pegou sua espada e correu contra a luz, que não parecia chegar mais perto a cada passo que ela andava. Ela correu por horas, até mesmo dias. Quando finalmente caiu no chão, exausta de tentar atacar o que não podia ver, ela gritou para a luz "Que tipo de trabalho demoníaco você é?", sem receber resposta. Após ela ter falecido por causa da exaustão, e por causa do choro, a luz brilhante se esfumaçou, e uma pessoa se formou. Não era homem nem mulher, e esta pessoa andou em direção à Kylindra. Olhou para ela, pegou a sua espada e falou: "Pequena garota, você pode correr tão rapido como o mais rápido cavalo no reino, pode ser tão forte quanto demônios, mas não tem humildade para entender o que acontece ao seu redor. Sua espada está ensanguentada do sangue dos homens, crianças, Trolls, Orcs e muitas outras criaturas que você tirou a vida sem razão e ela permanecerá em uma Ilha, para lembrar a todos os males que você causou. Sua espada será conhecida como a 'Espada da Fúria', e ela queimará sobre as rochas, sendo somente tocada pelos humildes".

     

    -Daquele dia em diante, essa espada tem sido vista em uma pedra, no meio do fogo, esperando que alguém humilde o suficiente toque a espada, que está mais amaldiçoada do que abençoada.

     

    -Todo o mito em torno da espada foi criado por causa da crendice popular que diz que ninguém a tem. Por causa da lenda envolvendo uma sala com um morto-vivo que ninguém sabe como entrar, uma alavanca escondida embaixo de um balde num quarto trancado e é claro, um Minotauro Mago que se trancou junto com um portal e que não quer ser perturbado. È fascinante como esses mistérios de Rookgaard repercutem tanto pela comunidade Tibiana. É óbvio que ter uma espada com tanto poder seria muito bom. Mas quem possuir essa espada não vai se tornar melhor por causa disso, não vai se tornar rei da ilha. O Dallhein tem uma Spike Sword e mesmo assim ele é apenas o guardião da ponte de entrada da vila. Se ter uma Spike Sword for tão importante pra você, vá para Mainland e compre uma por mais ou menos 1k.

     

    -Coloquei a história da Kylindra para mostar que nem todas as fábulas têm um final feliz, mas todas elas nos ensinam alguma coisa. Essa nos ensina a importância de sermos humildes. Ter humildade não significa ser servil, não é sinal de fraqueza. A humildade não é depreciação de si mesmo, não é ignorância com relação ao que somos, mas ao contrário, é o conhecimento exato daquilo que não somos. É quando o homem tem consciência e possui uma convicção do que ele é, da sua capacidade, da sua força ou da sua fraqueza, compreende a sua inferioridade. Reconhecendo seus próprios limites, ele não sofre por isso, se esforça e trabalha para ser melhor e procura constantemente seu aperfeiçoamento físico, moral e espiritual. A força da virtude está na alma e não precisamos ser santos para ter humildade, só precisamos afastar o orgulho, a vaidade, a prepotência e o egoísmo.

     

    -Mas na vida e, por conseqüência, no jogo, é fácil encontrar falsas humildades: Aqueles que se rebaixam perante os outros querendo parecer humildes, porém estão cheios de ressentimentos, inveja ou ambição. Ser humilde é saber ir até o ponto de não interferir nos outros, ser humilde é não intrometer-se na vida dos outros com comparações ou julgamentos.

     

    -Para finalizar, destaco uma frase que eu acho muito importante: você pode correr tão rápido como o mais rápido cavalo no reino, pode ser tão forte quanto demônios, mas não tem humildade para entender o que acontece ao seu redor. Ou seja, de nada adianta todo o poder que supostamente temos no jogo sem humildade para usar esse poder da melhor forma possível.

     

    "Se você conseguir aprender a ser humilde,

    vai ganhar um tesouro muito mais valioso do que a Spike Sword de Rookgaard..."

     
     
    Interpretações:
     
    A lenda diz: "...Olhou para ela, pegou a sua espada e falou: "Pequena garota, você pode correr tão rapido como o mais rápido cavalo no reino, pode ser tão forte quanto demônios, mas não tem humildade para entender o que acontece ao seu redor. Sua espada está ensanguentada do sangue dos homens, crianças, Trolls, Orcs e muitas outras criaturas que você tirou a vida sem razão ..."
     
    Conclui-se que somente um guerreiro humilde cuja espada não esteja com sangue de outras criaturas pode chegar até a Espada da Fúria.
    Somente que és humilde pode tela.
     
    Levandonos a pensar um lvl 1 sem nunca ter sangrado suas mãos com sangue alheio.
    Questionamento: Como um lvl 1 poderá chegar até a suposta "Entrada da Quest"?
    Resposta: A um caminho escondido onde pode atravessar ao outro lado da ponte sem passar por ela, acreditamos que seja um outro elemento que nos leve a acreditar que um player sem nunca ter atacado uma criatura possa ser o escolhido.
     
    Questionamento: Mesmo se atravessar como conseguirá passar pelo Mino mage?
    Respota: Não sabemos, necessitara mtos life fluids, por outro lado não sabemos se ah a necessidade de matar o Mino Mage para concluir a quest se aquela sala realmente for a entrada da quest.
     
     
     



     

     

    Blind Orc History

     
    Alguns afirman que orcs foram expulsos das cavernas mais profundas, por Minotaurs, hoje conhecida como Minotaur Hell, e dentre os que lutaram muitos ficaram feridos gravemente, a maioria habitou outros locais e continuaram a lutar contra os humanos, mas um por questão de sobrevivência se isolou em uma montanha por não tem como se defender, e virou um "orc passivo", apesar de seu palavriado informal e grosseiro, exatamente tibianos vocês conhecem, ele é conhecido como Blind Orc, o orc cego da montanha.
    Em uma analogia feita pelo usuário Lopoi2, chegou a conclusão de como os orcs habitavam aquelas cavernas deviam ter acesso a sala do Mino Mage e possuir também uma chave da mesma.
    A linguagem orc ainda é pouco conhecida, sabe-se somente o básico desse idioma.
     
     
     
    Interpretação:
     
    Blind Orc era um dos guerreiros cotra os minotauros, e ao lugar contra eles foi gravemente ferido perdendo a visão.
    O Blind Orc pode possuir uma chave para a tão desejada sala do Minotaur Mage, e cobrar dinheiro, uma missão ou dicas de como conseguir chegar a essa chave.
     
     



     

    As 5 Criaturas Sagradas

     
    Essas criaturas são monstro aos quais morreram e seus corpos ficarem permanentemente expostos na ilha, tais monstros são:
     
    Pile of bones Wolf
    Minotaur
    Troll
    Orc
    Skeleton
     
    E devem ser dispotas em túmulos em uma determinada cave.
    Para se obter a golden Key quesupostamente abre a porta da sala do Mino Mage.
     
     
    Questionamentos: São 7 túmulos para 5 criaturas.
    Resposta: Interpretamos como o 6 corpo sendo o de um deer, por ser um animal inofensivo e puro, o que poderia significar sagrado, e o 7 uma skull onde representaria os humanos.
     
    Questionamentos: Porque o deer e não um rabbit como o 5 corpo sagrado? Ambos são inofensivos.
    Resposta:Acredita-se que supostamente coellho lembra a uma criatura do mal que existe em mainland ao qual o NPC Hugo considerado um homem HUMILDE teme desesperadamente, por assemelhança a um demônio consideramosque tal criatura não seria considerada sagrada, e ovelhas são domesticadas pelos humanos resumindo em uma resposta.
     
     
    Para os Iniciantes, aqui algumas perguntas e respostas postadas por Lopoi2, uma ajuda para saber por onde começar e que caminhos pode traçar durante sua aventura em Rookgaard.
     
     
     
     
    Bom pessoal são Hipóteses e mais Hipóteses, a mais uma sobre um guerreiro ter defendido Rook das criaturas sombrias com uma espada e esta após o guerreiro ir embora retornou ao local onde foi criada que seria a sua ilha com fire fields, porque antigamente pessoas que patiam de rook para main iam "peladas" seus equips ficavam em rook.
     
    Ah ainda um NPC de main que diz ter deixado sua espada em rook, referindo-se a spikesword.
     
     
    Bom hoje estou um pouco sem tempo esses são alguns fatos e lendas que foram ditas entre fãs e livros tibianos.
     
    Em breve retornarei com mais tempo e calma dizendo sobre outras lendas e hipóteses sobre a história da SoF.
     
     
     
     
    Para finalizar ACABEI de criar um rook em unitera.
    Quem quiser estarei disponibilizando meu msn, para entrar em contato caso queira participar desta aventura.
    Sei que ja existe milhares de tópicos como este, e ah um fixo também na seção, mas me desculpe nem mesmo o fixo tem material suficiente para ajudar jogadores a desvendar este mistério, e o meu objetivo é juntar tudo em um lugar só para não só ajudar os outros jogadores como a mim também como um lugar de referência para "estudos" e análizes sobre todos os fatos tentando levar a um só caminho que nos entrega a Sword of Fury.
     
    Msn: rafael.arneiro@hotmail.com
     
     
    abraço
     
     
     
    -= EDITE =-
     
     
    Editando aqui brevemente, para "esclarecer" para alguns membros que postam dizendo coisas como a "inutilidade do tópico", assim evitando floods futuramente de membros que sejam como eles.
     
    Primeiramente, não poste coisas sem relação ao tópico se não o entendeu, ao não ser que esteja interessado a entender caso não tenha consigo.
     
     
    Segundo, o tópico não é feito totalmente como "tutorial" de quests para inciantes, somente aproveitei como estaria falando de um assunto envolvendo Rook por inteira de implementar as quests ja postadas na seção para ajudar quem ainda não conhece todas e desejar se juntar a nós para ser um rooker.
     
     
    Terceiro, não vim a procura de agradecimentos, muito menos por créditos, exatamente por isso cada parte, palavra ou teoria posta no tópico estão com seus devidos e merecidos verdadeiros créditos.
  13. Upvote
    Sir Picaralhos deu reputação a thiagodbn em Rme 8.6   
    O Cliente que baixa no site do tibia não ta com os arquivos para o mapa editor, o arquivo era atualizado no primeiro login ai voce conseguiria usar normalmente o RME.
    ja como voce não vai conseguir atualizar sem mudar a verção a equipe do RME feis um Cliente que voce baixa no site e não tem problemas com atualização e tals, pois o Cliente deles baixa o tibia.dat e tibia.spr
    então voce não tera problemas com o RME.
     
    Site da Remere's Map Editor seção para baixar clientes.
    http://remeresmapeditor.com/marklar.php?clients
  14. Upvote
    Sir Picaralhos recebeu reputação de Hellraiser69 em Quer Aprender A Ser Scripter?   
    Dividi em fases
    Entaum vamos lah ensinalo 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endExplicando :Nesta Parte se vc fala hi para ele,ele fala: Hello ( e seu nome)[color=blue]' .. creatureGetName(cid) .. ' Esse comando Faz o Npc falar o nome do char(cid) que falou hi[/color]Sempre Use essa parte no começo,se um char,fala hi e depois fala hi denovo o npc fala: I'm Already Talking to You,Pode Ser Alterado nesta Parte:if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')<---else if focus > 0 then      selfSay('Wait.')<--neste é quando o npc está atendendo outra pessoas      endend     Continuando(vamos usar como exemplo um npc que vende um axe ring 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:
     
    target = 0 following = false attacking = false focus = 0itemid = 0 count = 0payback = 0talkcount = 0talk_start = 0function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(id) if id == target then target = 0 attacking = false selfAttackCreature(0) following = false endfocus = 0itemid = 0 end function onCreatureTurn(creature) end function onCreatureSay(cid, type, msg)msg = string.lower(msg) dist = getDistanceToCreature(cid)if dist >= 8 thenreturnendtalk_start = os.clock() if string.find(msg, 'hi') and string.len(msg) == 2 thenif focus == cid thenselfSay('I am talking to you.')else if focus > 0 then      selfSay('Wait.')      endendif(focus == 0) thenselfSay('Hello ' .. creatureGetName(cid) .. '! .')focus = cidendtalk_start = os.clock()endif string.find(msg, '(%a*)offer(%a*)') and cid == focus thenselfSay('I am selling all types of rings!')endif string.find(msg, '(%a*)rings(%a*)') and cid == focus thenselfSay('I Sell Axe Ring,Club Ring,Crystal Ring,Dwarven Ring,Esmerald Bagle,Energy Ring,Gold Ring,Life Ring.Might Ring,Power Ring,Ring of Healing,Ring of the Skies,Stealth Ring,Sword Ring,Time Ring and Weding Ring.')talk_start = os.clock()returnendif string.find(msg, '(%a*)axe ring(%a*)') and cid == focus thenselfSay('Do You want to buy an Axe Ring for 400gps?')talk_start = os.clock()itemid = 2208count = 1cost = 400talkcount = 1returnendif string.find(msg, 'yes(%a*)') and cid == focus and talkcount == 1 then       talkcount = 0buy(focus,itemid,count,cost)endif string.find(msg, '(%a*)no(%a*)') and cid == focus thenselfSay('Ok, is there something else you want? If so tell me.')itemid = 0count = 0cost = 0talkcount = 0end if string.find(msg, 'bye(%a*)') and cid == focus thenselfSay('Farewell, ' .. creatureGetName(cid) .. '!')focus = 0itemid = 0talk_start = 0talkcount = 0end endfunction onCreatureChangeOutfit(creature)endfunction onThink() if (os.clock() - talk_start) > 10 then if focus > 0 then selfSay('Next please!') talkcount = 0end focus = 0 itemid = 0talk_start = 0 end if focus == 0 thencx, cy, cz = selfGetPosition()randmove = math.random(1,50)if randmove == 1 thennx = cx + 1endif randmove == 2 thennx = cx - 1endif randmove == 3 thenny = cy + 1endif randmove == 4 thenny = cy - 1endif randmove >= 5 thennx = cxny = cyendmoveToPosition(nx, ny, cz)--summons = 30--summons2 = 30endend  
    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:
    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 voce por false,só poe o numero 1,que vai acertar em tal area INDENPENDETE DA Posição
    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
     
    <spell name="Nome" words="palavras magicas" maglv="ml" mana="<mana>" enabled="1"><vocation id="2" /><vocation id="1" /></spell>  
    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:
    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:
     
    --100000= all time----50000= each 2 time----33333= each 3 time----20000= each 5 time----10000= each 10 time----6666= each 15 time----5000 = each 20 time----4000 = each 25 time----3333 = each 30 time----2857 = each 35 time----2500 = each 40 time----2222 = each 45 time----2000 = each 50 time----1818 = each 55 time----1666 = each 60 time----1538 = each 65 time----1428 = each 70 time----1333 = each 75 time----1000 = each 100 time----909 = each 110 time----833 = each 120 time----800 = each 125 time--666 = each 150 time----588 = each 170 time----555 = each 180 time----500 = each 200 time----400 = each 250 time----333 = each 300 time--  
    Quests
    Quests é nas Actions, e na verdade nem é tão dificil
    ai vai
    crie um arquivo .lua chamado hmm
     
    - Hmm Questfunction onUse(cid, item, frompos, item2, topos)   if item.uid == 5003 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You Have Found 100 hmm's to Hunt.")  doPlayerAddItem(cid,2311,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    end   elseif item.uid == 5004 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have Found 100 uh to Hunt.")  doPlayerAddItem(cid,2265,100)  setPlayerStorageValue(cid,5003,1)    else     doPlayerSendTextMessage(cid,22,"It is empty.")    endelseif item.uid == 5017 then    queststatus = getPlayerStorageValue(cid,5003)    if queststatus == -1 then  doPlayerSendTextMessage(cid,22,"You have found 100 explosion to hunt.")  doPlayerAddItem(cid,2305,1)  setPlayerStorageValue(cid,5003,1)    endelse return 0   end   return 1end  
    _______________________________________________________________
    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:
    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
    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:
     
    --Hmm function onUse(cid, item, frompos, item2, topos)doorpos = {x=frompos.x, y=frompos.y, z=frompos.z}playerpos = getPlayerPosition(cid)playerlevel = getPlayerLevel(cid)if item.itemid == 1234 and doorpos.x == 1 and doorpos.y == 1 and doorpos.z == 1 thenif playerlevel > 100 thendoTeleportThing(cid,doorpos)elseif playerlevel < 100 thendoPlayerSendTextMessage(cid,22,"Você precisa ser level 100 para passar.")endendreturn 1end  
    __________________________________________________--
    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.")
    ufa acabo ateh q enfim heim
    quase ngm deve ter vindo ateh aki
    se vc veio nossa como vc aguenta?
    hehe
    espero q tenhaum gostado
    Créditos: Dum amigo rl q axo na net na casa do primo dele dai ele sabia q eu ia volta aki e me deu pra eu posta e kramba demorei quase 2h pra escreve tudu issu hehe, e infelizmente os créditos não sao meus dinovu, mais eu to voltando agora e logo logo farei um como o meu ultimo q felizmente ao chegar aki fikei sabendo q ele foi fixado ainda num descobri onde neh hehe mais ele fo fixado!
    vlw ae comentem plz!
    Atenciosamente,
    Sir Picaralhos.
    :laughing:
  15. Upvote
    Sir Picaralhos deu reputação a Bruno1177 em [Encerrado] [Resolvido] Mapeditor 7.1   
    Procurei demais também ' maaaaas acheeeeeei!
    Dê uma olhada nesse aqui, se der certo me avise..
    Download: Clique aqui
     
    Abraços.
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...