Ir para conteúdo

MaXwEllDeN

Barão
  • Total de itens

    246
  • Registro em

  • Última visita

  • Dias Ganhos

    2

Histórico de Reputação

  1. Upvote
    MaXwEllDeN recebeu reputação de premii em [Resolvido] Usar item somente em PZ   
    function onUse(cid, item, frompos, item2, topos)
     
    if not getTileInfo(getThingPos(cid)).protection then
    return doPlayerSendCancel(cid, "You can only use this item in protection zone.")
    end
     
    setPlayerStorageValue(cid, 8422, 0)
    setPlayerStorageValue(cid, 23254, 50)
    --doPlayerRemoveItem(cid, 7855, 1)
    if isCreature(item2.uid) then
    return doPlayerSendCancel(cid, "You can only use revive in pokeballs!")
    end
     
    if isPlayer(item2.uid) then
    return doPlayerSendCancel(cid, "You cant use potions on wild pokemons.")
    end
     
    local x = pokeballs[getPokeballType(item2.itemid)]
    if not x or isInArray(x.use, item2.itemid) then return doPlayerSendCancel(cid, "Sorry, is not possible.") end
    if x.on or x.off then
    doSendMagicEffect(getThingPos(cid), 14)
    doRemoveItem(item.uid, 1)
    maxh = tonumber(getItemAttribute(item2.uid, "poke"):match("/(.+)]"))
    doItemSetAttribute(item2.uid, "poke", getItemAttribute(item2.uid, "poke"):sub(1, findLetter(getItemAttribute(item2.uid, "poke"), "[")) .. maxh .. getItemAttribute(item2.uid, "poke"):sub(findLetter(getItemAttribute(item2.uid, "poke"), "/")))
    btype = getPokeballType(item2.itemid)
    ons = pokeballs[btype].on
    doTransformItem(item2.uid, ons)
    doCureAllStatus(item2.uid)
    else
    doPlayerSendCancel(cid, "Sorry, is not possible.")
    return true
    end
     
    end

     
  2. Thanks
    MaXwEllDeN recebeu reputação de Diego Rosa em [CTF] Capture The Flag 2.0(Automático)   
    #Introdução
     
    Este é um sistema de rouba bandeira, no qual tem dois times que se enfrentam e tentam se infiltrar na fortaleza do inimigo, roubar a bandeira dele e retornar para sua base com ela.
     
     
     
    #Instalação
     
    Faça o download do sistema e cole na pasta do seu servidor.
    Download Capture The Flag 2.0 Após ter instalado os arquivos nas suas respectivas pastas e instalado as tags
    nos arquivos xml, abra a pasta do seu servidor, e em seguida abra a pasta spells/scripts/support, e abra o arquivo invisible.lua com algum editor de texto, depois de
     
     
    function onCastSpell(cid, var) cole isso:
     
    if (getPlayerStorageValue(cid, 16700) ~= -1) then return doPlayerSendCancel(cid, "Você não pode usar invisible durante o CTF!") and doSendMagicEffect(getThingPos(cid), 2) end ficando assim:
     
    local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) local condition = createConditionObject(CONDITION_INVISIBLE) setConditionParam(condition, CONDITION_PARAM_TICKS, 200000) setCombatCondition(combat, condition) function onCastSpell(cid, var) if (getPlayerStorageValue(cid, 16700) ~= -1) then return doPlayerSendCancel(cid, "Você não pode usar invisible durante o CTF!") and doSendMagicEffect(getThingPos(cid), 2) end return doCombat(cid, combat, var) end #Configuração
     
    Como na maioria dos meus códigos: as configurações ficam na lib, então:
     
     
     
     
     
     
     

    waitpos = {x = 93, y = 117, z = 6}, -- Posição da sala de espera tppos = {x = 92, y = 117, z = 7}, -- Onde o TP vai aparecer days = {2, 5, 7}, -- Dias que o evento vai abrir xp_percent = 0.5, -- Porcentagem de xp que o player vai receber quando ganhar timeclose = 1, -- Tempo para iniciar o CTF winp = 10, waitpos = {x = 93, y = 117, z = 6}, -- Posição da sala de espera  
    Posição onde os players que entrarem no teleport vão ficar esperando, até o evento iniciar
     
    tppos = {x = 92, y = 117, z = 7}, -- Onde o TP vai aparecer Posição de onde o teleport vai aparecer
     
    days = {2, 5, 7}, -- Dias que o evento vai abrir  
    Dias que o evento vai iniciar.
     
    xp_percent = 0.5, -- Porcentagem de exp que o player vai ganhar  
    Quando o evento acaba, os players da equipe que venceu ganham uma quantidade de experiência baseada na experiência que eles já têm, exemplo:
     
    Meu player tem 1200000000 de exp, quando o evento acabar, ele vai ganhar 0.5% da exp que ele tem, no caso desse exemplo 6000000 de exp.
     
    timeclose = 1, -- Tempo, em minutos, para iniciar o CTF  
    Tempo para o teleport sumir e os players que estão na sala de espera serem teletransportados para o evento.
     
     
    winp = 10, -- Quantos pontos uma equipe precisa marcar para vencer  
    Quantos pontos uma equipe precisa marcar para vencer o evento.
     
     
    Para configurar o horário que o evento vai abrir, é só você modificar na tag do globalevents.xml:
     
    <globalevent name="CTFCheck" time="19:33:00" event="script" value="CTFMax.lua"/>  
    Você não precisa criar as bandeiras pelo map editor. O script irá adicioná-las automaticamente.
     
    É isso, essa versão é uma remake, vários bugs reportados pela galera na v.1 foram corrigidos, o script ficou mais simples
  3. Thanks
    MaXwEllDeN recebeu reputação de hodias5464 em [CTF] Capture The Flag 2.0(Automático)   
    #Introdução
     
    Este é um sistema de rouba bandeira, no qual tem dois times que se enfrentam e tentam se infiltrar na fortaleza do inimigo, roubar a bandeira dele e retornar para sua base com ela.
     
     
     
    #Instalação
     
    Faça o download do sistema e cole na pasta do seu servidor.
    Download Capture The Flag 2.0 Após ter instalado os arquivos nas suas respectivas pastas e instalado as tags
    nos arquivos xml, abra a pasta do seu servidor, e em seguida abra a pasta spells/scripts/support, e abra o arquivo invisible.lua com algum editor de texto, depois de
     
     
    function onCastSpell(cid, var) cole isso:
     
    if (getPlayerStorageValue(cid, 16700) ~= -1) then return doPlayerSendCancel(cid, "Você não pode usar invisible durante o CTF!") and doSendMagicEffect(getThingPos(cid), 2) end ficando assim:
     
    local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) local condition = createConditionObject(CONDITION_INVISIBLE) setConditionParam(condition, CONDITION_PARAM_TICKS, 200000) setCombatCondition(combat, condition) function onCastSpell(cid, var) if (getPlayerStorageValue(cid, 16700) ~= -1) then return doPlayerSendCancel(cid, "Você não pode usar invisible durante o CTF!") and doSendMagicEffect(getThingPos(cid), 2) end return doCombat(cid, combat, var) end #Configuração
     
    Como na maioria dos meus códigos: as configurações ficam na lib, então:
     
     
     
     
     
     
     

    waitpos = {x = 93, y = 117, z = 6}, -- Posição da sala de espera tppos = {x = 92, y = 117, z = 7}, -- Onde o TP vai aparecer days = {2, 5, 7}, -- Dias que o evento vai abrir xp_percent = 0.5, -- Porcentagem de xp que o player vai receber quando ganhar timeclose = 1, -- Tempo para iniciar o CTF winp = 10, waitpos = {x = 93, y = 117, z = 6}, -- Posição da sala de espera  
    Posição onde os players que entrarem no teleport vão ficar esperando, até o evento iniciar
     
    tppos = {x = 92, y = 117, z = 7}, -- Onde o TP vai aparecer Posição de onde o teleport vai aparecer
     
    days = {2, 5, 7}, -- Dias que o evento vai abrir  
    Dias que o evento vai iniciar.
     
    xp_percent = 0.5, -- Porcentagem de exp que o player vai ganhar  
    Quando o evento acaba, os players da equipe que venceu ganham uma quantidade de experiência baseada na experiência que eles já têm, exemplo:
     
    Meu player tem 1200000000 de exp, quando o evento acabar, ele vai ganhar 0.5% da exp que ele tem, no caso desse exemplo 6000000 de exp.
     
    timeclose = 1, -- Tempo, em minutos, para iniciar o CTF  
    Tempo para o teleport sumir e os players que estão na sala de espera serem teletransportados para o evento.
     
     
    winp = 10, -- Quantos pontos uma equipe precisa marcar para vencer  
    Quantos pontos uma equipe precisa marcar para vencer o evento.
     
     
    Para configurar o horário que o evento vai abrir, é só você modificar na tag do globalevents.xml:
     
    <globalevent name="CTFCheck" time="19:33:00" event="script" value="CTFMax.lua"/>  
    Você não precisa criar as bandeiras pelo map editor. O script irá adicioná-las automaticamente.
     
    É isso, essa versão é uma remake, vários bugs reportados pela galera na v.1 foram corrigidos, o script ficou mais simples
  4. Upvote
    MaXwEllDeN recebeu reputação de XxH4adxX em Como funcionam os scripts?   
    Como funcionam os Scripts?


    Você já deve ter se perguntado como os scripts funcionam ou não. Por exemplo: Como o servidor sabe que quando eu apertar com o botão direito em um Health Potion ele terá que healar o player alvo?

    Em primeiro lugar devemos entender o que são callbacks. Do modo mais simples callback é algo que acontece devido a uma reação, é como a Terceira Lei de Newton que diz que toda ação gera uma reação, esse callback é a nossa reção, é uma função que vai ser executada assim que algo acontecer, no caso do Health Potion assim que ele for usado.


    Quando um item é usado ele provoca a chamada de um callback dessa função:




    – Max, que parâmetros são esses? :hum:
    – É simples.



    O Script do Health Potion ficaria +/- assim:

    local config = { min_heal = 100, -- Minimo que vai healar max_heal = 200, -- Máximo que vai healar empty = 7636, -- Id do Potion vazio } function onUse(cid, item, fromPosition, itemEx, toPosition) if isCreature(itemEx.uid) then doCreatureSay(cid, "Aaaah...", 19) doSendMagicEffect(toPosition, 12) doCreatureAddHealth(itemEx.uid, math.random(config.min_heal, config.max_heal)) doTransformItem(item.uid, config.empty) else doPlayerSendCancel(cid, "You cannot use this object.") end return true end
    Funções usadas:


    Bem, esse aí é o script, agora só é você salvar, colocar na sua pasta actions/scripts e pronto!

    – Max, se existem vários scripts na pasta actions/scripts, como meu OT sabe qual usar?
    – Por causa das chamadas TAGs.
    – TAGs?
    – Sim, é uma linha que é colocada no .xml para dizer ao seu servido que o Callback para um item x será a função daquele script.

    As Tags das actions seguem esse modelo:

    <action itemid = "7618" event = "script" value = "HealthPotion.lua" /> itemid - É o id do item, que ao ser usado o callback dele vai ser o script que está em value, no caso HealthPotion.lua
    event - Indica o que vai acontecer quando usar o item, no caso vai ler o script. Não precisa se preocupar com isso por enquanto.
    value - É o nome do script que tem o callback que você quer usar no item 7618

    Exercício: Crie uma Action que quando eu usar uma Warlord Sword em alguém essa pessoa diga "Aí, isso doi". Poste a TAG também!

    Resposta SÓ ABRA DEPOIS DE RESOLVER:



    É isso aí pessoal, essa foi a primeira aula de Scriptwriting que eu escreví, espero que gostem :3
  5. Upvote
    MaXwEllDeN recebeu reputação de DesTini em Como funcionam os scripts?   
    Como funcionam os Scripts?


    Você já deve ter se perguntado como os scripts funcionam ou não. Por exemplo: Como o servidor sabe que quando eu apertar com o botão direito em um Health Potion ele terá que healar o player alvo?

    Em primeiro lugar devemos entender o que são callbacks. Do modo mais simples callback é algo que acontece devido a uma reação, é como a Terceira Lei de Newton que diz que toda ação gera uma reação, esse callback é a nossa reção, é uma função que vai ser executada assim que algo acontecer, no caso do Health Potion assim que ele for usado.


    Quando um item é usado ele provoca a chamada de um callback dessa função:




    – Max, que parâmetros são esses? :hum:
    – É simples.



    O Script do Health Potion ficaria +/- assim:

    local config = { min_heal = 100, -- Minimo que vai healar max_heal = 200, -- Máximo que vai healar empty = 7636, -- Id do Potion vazio } function onUse(cid, item, fromPosition, itemEx, toPosition) if isCreature(itemEx.uid) then doCreatureSay(cid, "Aaaah...", 19) doSendMagicEffect(toPosition, 12) doCreatureAddHealth(itemEx.uid, math.random(config.min_heal, config.max_heal)) doTransformItem(item.uid, config.empty) else doPlayerSendCancel(cid, "You cannot use this object.") end return true end
    Funções usadas:


    Bem, esse aí é o script, agora só é você salvar, colocar na sua pasta actions/scripts e pronto!

    – Max, se existem vários scripts na pasta actions/scripts, como meu OT sabe qual usar?
    – Por causa das chamadas TAGs.
    – TAGs?
    – Sim, é uma linha que é colocada no .xml para dizer ao seu servido que o Callback para um item x será a função daquele script.

    As Tags das actions seguem esse modelo:

    <action itemid = "7618" event = "script" value = "HealthPotion.lua" /> itemid - É o id do item, que ao ser usado o callback dele vai ser o script que está em value, no caso HealthPotion.lua
    event - Indica o que vai acontecer quando usar o item, no caso vai ler o script. Não precisa se preocupar com isso por enquanto.
    value - É o nome do script que tem o callback que você quer usar no item 7618

    Exercício: Crie uma Action que quando eu usar uma Warlord Sword em alguém essa pessoa diga "Aí, isso doi". Poste a TAG também!

    Resposta SÓ ABRA DEPOIS DE RESOLVER:



    É isso aí pessoal, essa foi a primeira aula de Scriptwriting que eu escreví, espero que gostem :3
  6. Upvote
    MaXwEllDeN recebeu reputação de Insaend em Como funcionam os scripts?   
    Como funcionam os Scripts?


    Você já deve ter se perguntado como os scripts funcionam ou não. Por exemplo: Como o servidor sabe que quando eu apertar com o botão direito em um Health Potion ele terá que healar o player alvo?

    Em primeiro lugar devemos entender o que são callbacks. Do modo mais simples callback é algo que acontece devido a uma reação, é como a Terceira Lei de Newton que diz que toda ação gera uma reação, esse callback é a nossa reção, é uma função que vai ser executada assim que algo acontecer, no caso do Health Potion assim que ele for usado.


    Quando um item é usado ele provoca a chamada de um callback dessa função:




    – Max, que parâmetros são esses? :hum:
    – É simples.



    O Script do Health Potion ficaria +/- assim:

    local config = { min_heal = 100, -- Minimo que vai healar max_heal = 200, -- Máximo que vai healar empty = 7636, -- Id do Potion vazio } function onUse(cid, item, fromPosition, itemEx, toPosition) if isCreature(itemEx.uid) then doCreatureSay(cid, "Aaaah...", 19) doSendMagicEffect(toPosition, 12) doCreatureAddHealth(itemEx.uid, math.random(config.min_heal, config.max_heal)) doTransformItem(item.uid, config.empty) else doPlayerSendCancel(cid, "You cannot use this object.") end return true end
    Funções usadas:


    Bem, esse aí é o script, agora só é você salvar, colocar na sua pasta actions/scripts e pronto!

    – Max, se existem vários scripts na pasta actions/scripts, como meu OT sabe qual usar?
    – Por causa das chamadas TAGs.
    – TAGs?
    – Sim, é uma linha que é colocada no .xml para dizer ao seu servido que o Callback para um item x será a função daquele script.

    As Tags das actions seguem esse modelo:

    <action itemid = "7618" event = "script" value = "HealthPotion.lua" /> itemid - É o id do item, que ao ser usado o callback dele vai ser o script que está em value, no caso HealthPotion.lua
    event - Indica o que vai acontecer quando usar o item, no caso vai ler o script. Não precisa se preocupar com isso por enquanto.
    value - É o nome do script que tem o callback que você quer usar no item 7618

    Exercício: Crie uma Action que quando eu usar uma Warlord Sword em alguém essa pessoa diga "Aí, isso doi". Poste a TAG também!

    Resposta SÓ ABRA DEPOIS DE RESOLVER:



    É isso aí pessoal, essa foi a primeira aula de Scriptwriting que eu escreví, espero que gostem :3
  7. Upvote
    MaXwEllDeN recebeu reputação de deadkiller em Como funcionam os scripts?   
    Como funcionam os Scripts?


    Você já deve ter se perguntado como os scripts funcionam ou não. Por exemplo: Como o servidor sabe que quando eu apertar com o botão direito em um Health Potion ele terá que healar o player alvo?

    Em primeiro lugar devemos entender o que são callbacks. Do modo mais simples callback é algo que acontece devido a uma reação, é como a Terceira Lei de Newton que diz que toda ação gera uma reação, esse callback é a nossa reção, é uma função que vai ser executada assim que algo acontecer, no caso do Health Potion assim que ele for usado.


    Quando um item é usado ele provoca a chamada de um callback dessa função:




    – Max, que parâmetros são esses? :hum:
    – É simples.



    O Script do Health Potion ficaria +/- assim:

    local config = { min_heal = 100, -- Minimo que vai healar max_heal = 200, -- Máximo que vai healar empty = 7636, -- Id do Potion vazio } function onUse(cid, item, fromPosition, itemEx, toPosition) if isCreature(itemEx.uid) then doCreatureSay(cid, "Aaaah...", 19) doSendMagicEffect(toPosition, 12) doCreatureAddHealth(itemEx.uid, math.random(config.min_heal, config.max_heal)) doTransformItem(item.uid, config.empty) else doPlayerSendCancel(cid, "You cannot use this object.") end return true end
    Funções usadas:


    Bem, esse aí é o script, agora só é você salvar, colocar na sua pasta actions/scripts e pronto!

    – Max, se existem vários scripts na pasta actions/scripts, como meu OT sabe qual usar?
    – Por causa das chamadas TAGs.
    – TAGs?
    – Sim, é uma linha que é colocada no .xml para dizer ao seu servido que o Callback para um item x será a função daquele script.

    As Tags das actions seguem esse modelo:

    <action itemid = "7618" event = "script" value = "HealthPotion.lua" /> itemid - É o id do item, que ao ser usado o callback dele vai ser o script que está em value, no caso HealthPotion.lua
    event - Indica o que vai acontecer quando usar o item, no caso vai ler o script. Não precisa se preocupar com isso por enquanto.
    value - É o nome do script que tem o callback que você quer usar no item 7618

    Exercício: Crie uma Action que quando eu usar uma Warlord Sword em alguém essa pessoa diga "Aí, isso doi". Poste a TAG também!

    Resposta SÓ ABRA DEPOIS DE RESOLVER:



    É isso aí pessoal, essa foi a primeira aula de Scriptwriting que eu escreví, espero que gostem :3
  8. Upvote
    MaXwEllDeN recebeu reputação de SillyBoy em Como funcionam os scripts?   
    Como funcionam os Scripts?


    Você já deve ter se perguntado como os scripts funcionam ou não. Por exemplo: Como o servidor sabe que quando eu apertar com o botão direito em um Health Potion ele terá que healar o player alvo?

    Em primeiro lugar devemos entender o que são callbacks. Do modo mais simples callback é algo que acontece devido a uma reação, é como a Terceira Lei de Newton que diz que toda ação gera uma reação, esse callback é a nossa reção, é uma função que vai ser executada assim que algo acontecer, no caso do Health Potion assim que ele for usado.


    Quando um item é usado ele provoca a chamada de um callback dessa função:




    – Max, que parâmetros são esses? :hum:
    – É simples.



    O Script do Health Potion ficaria +/- assim:

    local config = { min_heal = 100, -- Minimo que vai healar max_heal = 200, -- Máximo que vai healar empty = 7636, -- Id do Potion vazio } function onUse(cid, item, fromPosition, itemEx, toPosition) if isCreature(itemEx.uid) then doCreatureSay(cid, "Aaaah...", 19) doSendMagicEffect(toPosition, 12) doCreatureAddHealth(itemEx.uid, math.random(config.min_heal, config.max_heal)) doTransformItem(item.uid, config.empty) else doPlayerSendCancel(cid, "You cannot use this object.") end return true end
    Funções usadas:


    Bem, esse aí é o script, agora só é você salvar, colocar na sua pasta actions/scripts e pronto!

    – Max, se existem vários scripts na pasta actions/scripts, como meu OT sabe qual usar?
    – Por causa das chamadas TAGs.
    – TAGs?
    – Sim, é uma linha que é colocada no .xml para dizer ao seu servido que o Callback para um item x será a função daquele script.

    As Tags das actions seguem esse modelo:

    <action itemid = "7618" event = "script" value = "HealthPotion.lua" /> itemid - É o id do item, que ao ser usado o callback dele vai ser o script que está em value, no caso HealthPotion.lua
    event - Indica o que vai acontecer quando usar o item, no caso vai ler o script. Não precisa se preocupar com isso por enquanto.
    value - É o nome do script que tem o callback que você quer usar no item 7618

    Exercício: Crie uma Action que quando eu usar uma Warlord Sword em alguém essa pessoa diga "Aí, isso doi". Poste a TAG também!

    Resposta SÓ ABRA DEPOIS DE RESOLVER:



    É isso aí pessoal, essa foi a primeira aula de Scriptwriting que eu escreví, espero que gostem :3
  9. Upvote
    MaXwEllDeN recebeu reputação de Amantezinho em [Resolvido] Usar item somente em PZ   
    function onUse(cid, item, frompos, item2, topos)
     
    if not getTileInfo(getThingPos(cid)).protection then
    return doPlayerSendCancel(cid, "You can only use this item in protection zone.")
    end
     
    setPlayerStorageValue(cid, 8422, 0)
    setPlayerStorageValue(cid, 23254, 50)
    --doPlayerRemoveItem(cid, 7855, 1)
    if isCreature(item2.uid) then
    return doPlayerSendCancel(cid, "You can only use revive in pokeballs!")
    end
     
    if isPlayer(item2.uid) then
    return doPlayerSendCancel(cid, "You cant use potions on wild pokemons.")
    end
     
    local x = pokeballs[getPokeballType(item2.itemid)]
    if not x or isInArray(x.use, item2.itemid) then return doPlayerSendCancel(cid, "Sorry, is not possible.") end
    if x.on or x.off then
    doSendMagicEffect(getThingPos(cid), 14)
    doRemoveItem(item.uid, 1)
    maxh = tonumber(getItemAttribute(item2.uid, "poke"):match("/(.+)]"))
    doItemSetAttribute(item2.uid, "poke", getItemAttribute(item2.uid, "poke"):sub(1, findLetter(getItemAttribute(item2.uid, "poke"), "[")) .. maxh .. getItemAttribute(item2.uid, "poke"):sub(findLetter(getItemAttribute(item2.uid, "poke"), "/")))
    btype = getPokeballType(item2.itemid)
    ons = pokeballs[btype].on
    doTransformItem(item2.uid, ons)
    doCureAllStatus(item2.uid)
    else
    doPlayerSendCancel(cid, "Sorry, is not possible.")
    return true
    end
     
    end

     
  10. Upvote
    MaXwEllDeN recebeu reputação de falldudu em Como funcionam os scripts?   
    Como funcionam os Scripts?


    Você já deve ter se perguntado como os scripts funcionam ou não. Por exemplo: Como o servidor sabe que quando eu apertar com o botão direito em um Health Potion ele terá que healar o player alvo?

    Em primeiro lugar devemos entender o que são callbacks. Do modo mais simples callback é algo que acontece devido a uma reação, é como a Terceira Lei de Newton que diz que toda ação gera uma reação, esse callback é a nossa reção, é uma função que vai ser executada assim que algo acontecer, no caso do Health Potion assim que ele for usado.


    Quando um item é usado ele provoca a chamada de um callback dessa função:




    – Max, que parâmetros são esses? :hum:
    – É simples.



    O Script do Health Potion ficaria +/- assim:

    local config = { min_heal = 100, -- Minimo que vai healar max_heal = 200, -- Máximo que vai healar empty = 7636, -- Id do Potion vazio } function onUse(cid, item, fromPosition, itemEx, toPosition) if isCreature(itemEx.uid) then doCreatureSay(cid, "Aaaah...", 19) doSendMagicEffect(toPosition, 12) doCreatureAddHealth(itemEx.uid, math.random(config.min_heal, config.max_heal)) doTransformItem(item.uid, config.empty) else doPlayerSendCancel(cid, "You cannot use this object.") end return true end
    Funções usadas:


    Bem, esse aí é o script, agora só é você salvar, colocar na sua pasta actions/scripts e pronto!

    – Max, se existem vários scripts na pasta actions/scripts, como meu OT sabe qual usar?
    – Por causa das chamadas TAGs.
    – TAGs?
    – Sim, é uma linha que é colocada no .xml para dizer ao seu servido que o Callback para um item x será a função daquele script.

    As Tags das actions seguem esse modelo:

    <action itemid = "7618" event = "script" value = "HealthPotion.lua" /> itemid - É o id do item, que ao ser usado o callback dele vai ser o script que está em value, no caso HealthPotion.lua
    event - Indica o que vai acontecer quando usar o item, no caso vai ler o script. Não precisa se preocupar com isso por enquanto.
    value - É o nome do script que tem o callback que você quer usar no item 7618

    Exercício: Crie uma Action que quando eu usar uma Warlord Sword em alguém essa pessoa diga "Aí, isso doi". Poste a TAG também!

    Resposta SÓ ABRA DEPOIS DE RESOLVER:



    É isso aí pessoal, essa foi a primeira aula de Scriptwriting que eu escreví, espero que gostem :3
  11. Upvote
    MaXwEllDeN deu reputação a Gpedro em Instalando Ambiente Gráfico VPS Linux   
    TL;DR
    apenas não use VNC. Questões de Segurança.
    não use interface gráfica, você estará consumindo mais memória RAM desnecessariamente.
  12. Upvote
    MaXwEllDeN deu reputação a Oneshot em Forge System   
    ADVANCED FORGE SYSTEM



    O SISTEMA DE CRIAÇÃO DE ITENS PARA SEU SERVIDOR


     

     
    Creio que muitos já conhecem o sistema de forja criado por mim, acontece que o código já estava um pouco obsoleto, então resolvi reescrever ele do 0.
     
    Simplesmente consiste em um sistema de criação de itens avançado que ressuscita um pouco do RPG perdido nos servidores de hoje em dia. O jogador poderá criar itens através de forja, agindo como um verdadeiro ferreiro medieval. Adiciona itens em cima de uma bigorna previamente colocada no mapa e com um martelo cria um item totalmente novo.
     
    CARACTERÍSTICAS DA VERSÃO FINAL:
     
    - Configuração intuitiva e fácil de compreender;
    - Mini-tutorial auxiliando criação de novas receitas;
    - Receitas podem conter até 250 itens diferentes com suas respectivas quantidades;
    - Sistema inteligente que identifica uma receita em qualquer ordem;
    - Código totalmente orientado a objetos;
    - Possibilidade de configurar diferentes requerimentos, diferentes skills, magic level e level
     

     
    Há dois modos de instalar o Advanced Forge System, o primeiro é seguir os passos deste tópico e o segundo e baixar pasta data/ anexada no tópico com os arquivos em seus respectivos diretórios, precisando apenas o registro das chaves nos arquivos XML.
     
    Escolha o modo que mais convém a você.
     

     
     
    Crie um arquivo em data/lib chamado forgesystem.lua e cole o conteúdo abaixo:
     

    --[[ ADVANCED FORGE SYSTEM FINAL Criado por Oneshot É proibido a venda ou a cópia sem os devidos créditos desse script. ]]-- RecipeHandler = { itemtype = 0, items = {}, level = 1, maglevel = 0, skills = {[0] = 0, [1] = 0, [2] = 0, [3] = 0, [4] = 0, [5] = 0, [6] = 0} } Forge = { type = nil, position = nil, magicEffect = CONST_ME_MAGIC_GREEN, messages = { class = MESSAGE_STATUS_DEFAULT, success = "You have successfully forged a %s.", needskill = "You don't have enough %s to create a %s.", needlevel = "You need level %s to create a %s.", needmaglevel = "You need magic level %s to create a %s." } } function RecipeHandler:new(itemtype, items, level, maglevel, skills) local obj = { itemtype = (itemtype or 0), items = (items or {}), level = (level or 1), maglevel = (maglevel or 0), skills = (skills or {[0] = 0, [1] = 0, [2] = 0, [3] = 0, [4] = 0, [5] = 0, [6] = 0}) } table.insert(Recipes, obj) return setmetatable(obj, {__index = self}) end function RecipeHandler:setItem(itemtype) self.itemtype = (itemtype or 0) end function RecipeHandler:setRecipe(...) self.items = {...} end function RecipeHandler:setRecipeItem(itemid, amount) table.insert(self.items, {itemid, amount}) end function RecipeHandler:setSkill(skillid, value) self.skills[skillid] = value end function RecipeHandler:setLevel(value) self.level = value end function RecipeHandler:setMagLevel(value) self.maglevel = value end function RecipeHandler:check(position) local match = false for n, item in ipairs(self.items) do local thing = getTileItemById(position, item[1]) if thing.uid > 0 and math.max(1, thing.type) >= item[2] then if n == #self.items then match = true end else break end end return match end function RecipeHandler:get(position) if self:check(position) == true then return setmetatable({type = self, position = position}, {__index = Forge}) end return false end function Forge:create(cid) if self.type.itemid == 0 then print("[FORGE SYSTEM - ERROR] ATTEMPT TO CREATE A RECIPE ITEMID 0") return end local status = true if(cid) then if getPlayerLevel(cid) < self.type.level then doPlayerSendTextMessage(cid, self.messages.class, self.messages.needlevel:format(self.type.level, getItemNameById(self.type.itemtype))) return end if getPlayerMagLevel(cid) < self.type.maglevel then doPlayerSendTextMessage(cid, self.messages.class, self.messages.needmaglevel:format(self.type.maglevel, getItemNameById(self.type.itemtype))) return end for skillid, value in pairs(self.type.skills) do if getPlayerSkillLevel(cid, skillid) < value then status = false doPlayerSendTextMessage(cid, self.messages.class, self.messages.needskill:format(SKILL_NAMES[skillid], getItemNameById(self.type.itemtype))) break end end end if status == true then for _, item in ipairs(self.type.items) do local thing = getTileItemById(self.position, item[1]) doRemoveItem(thing.uid, item[2]) end doSendMagicEffect(self.position, self.magicEffect) doPlayerSendTextMessage(cid, self.messages.class, self.messages.success:format(getItemNameById(self.type.itemtype))) doCreateItem(self.type.itemtype, self.position) end end dofile(getDataDir() .."/lib/recipes.lua")
     
    Crie um arquivo em data/lib chamado recipes.lua e adicione o conteúdo abaixo:
     

    ---------------------------------------- -----** TUTORIAL DE CONFIGURAÇÃO **----- ---------------------------------------- --[[ O 'ADVANCED FORGE SYSTEM' é muito fácil e intuitivo de configurar, você só precisa chamar a função RecipeHandler:new(...), sendo que você já configurar os atributos da receita nela ou usar outras funções para isso. Por exemplo, quero criar uma Magic Sword que precise de 100 Gold Nuggets. RecipeHandler:new(2400, {{2157, 100}}) Ou então Magic_Sword = RecipeHandler:new() Magic_Sword:setItem(2400) Magic_Sword:setRecipe({2157, 100}) Funções do Sistema: RecipeHandler:new(itemtype, items, level, maglevel, skills) --> Cria uma nova instância de forja. RecipeHandler:setItem(itemtype) --> Atribui um certo itemid como resultado da receita. RecipeHandler:setRecipe(recipe) --> Atribui uma receita. RecipeHandler:setRecipeItem(itemid, amount) --> Adiciona um itemid e sua quantidade a receita. RecipeHandler:setSkill(skillid, value) --> Atribui um valor necessário de uma certa skill para poder criar a receita. RecipeHandler:setLevel(value) --> Atribui o level necessário para criar uma receita. RecipeHandler:setMagLevel(value) --> Atribui o magic level necessário para criar uma receita. ]]-- --[[ Este é um exemplo de receita usando algumas funções. É uma Magic Sword (ITEMID: 2400) que precisa de 100 Gold Nuggets (ITEMID: 2157), além disso, o personagem que tentar forjar, precisa ter Level 100 e Sword Fighting 50. ]]-- Recipes = {} magicsword = RecipeHandler:new() magicsword:setItem(2400) magicsword:setRecipeItem(2157, 100) magicsword:setLevel(100) magicsword:setSkill(2, 50)
     
    Agora em data/actions/scripts, crie um arquivo chamado iron_hammer.lua e adicione o conteúdo abaixo:
     

    function onUse(cid, item, fromPosition, itemEx, toPosition) local recipe = nil for _, v in ipairs(Recipes) do recipe = v:get(toPosition) if(recipe ~= false) then break end end if(recipe) then recipe:create(cid) else doPlayerSendCancel(cid, "This is not a valid recipe.") end return true end
     
    E por fim em actions.xml, adicione a seguinte linha:
     

    <action itemid="4846" event="script" value="iron_hammer.lua"/>
     
    OPCIONAL - TALKACTION
     
    A talkaction abaixo mostra ao jogadoras receitas configuradas no servidor que ele pode fazer.
     
    Em data/talkactions/scripts, crie um arquivo chamado recipes.lua e adicione o conteúdo abaixo:
     

    function onSay(cid, words, param, channel) local ret = {} local msg = " ADVANCED FORGE SYSTEM\n" for _, recipe in ipairs(Recipes) do local skills = true for skillid, value in pairs(recipe.skills) do if getPlayerSkillLevel(cid, skillid) < value then skills = false break end end if skills == true then if getPlayerLevel(cid) >= recipe.level and getPlayerMagLevel(cid) >= recipe.maglevel then table.insert(ret, {recipe, true}) else table.insert(ret, {recipe, false}) end else table.insert(ret, {recipe, false}) end end for _, recipe in ipairs(ret) do msg = msg .."\nRecipe for ".. getItemNameById(recipe[1].itemtype) ..":\n\n" if recipe[2] == true then for _, item in ipairs(recipe[1].items) do msg = msg .."* ".. getItemNameById(item[1]) .." [".. math.min(item[2], math.max(0, getPlayerItemCount(cid, item[1]))) .."/".. item[2] .."]\n" end else msg = msg .."[LOCKED]\n" end end doShowTextDialog(cid, 2555, msg) return true end
     
    Em data/talkactions/talkactions.xml, adicione a linha:
     

    <talkaction words="/recipes" event="script" value="recipes.lua"/>
     

     
    Siga as instruções para configuração de novas receitas.
     
    Em breve vídeo de funcionamento
    Advanced Forge System.rar
  13. Upvote
    MaXwEllDeN recebeu reputação de Omega em [CTF] Capture The Flag 2.0(Automático)   
    Perdão, a maioria dos erros já foram corrigidos. Acabei deletando o antigo do meu repositório e esqueci de fazer a edição aqui no tópico. Obrigado, já editei o link.
  14. Upvote
    MaXwEllDeN deu reputação a Frenvius em Fairy Tail Online [FTO]   
    Gráfico

    Olá, eu sou Frenvius, Spriter/Desginer do projeto Fairy Tail Online. Fará um mês desde que voltamos com o projeto, estamos focados, trabalhando dia e noite para um melhor desempenho do servidor. Até então, estivemos acumulando conteúdo para mostrarmos a vocês durante um certo período. Este é apenas um exemplo Gráfico do nosso game, toda parte gráfica será desenvolvida por mim.
    Estaremos trabalhando com o gráfico para que ele fique agradável aos olhos de todos, escolhemos muito bem as cores, para assim termos um gráfico bonito fugindo do padrão de outros servidores e da temática do Tibia. Sugestões são sempre bem vindas, o game é feito a gosto de quem joga.




    Guild System - Level

    O Guild System é um dos sistemas mais importantes, o jogo inteiro está ligado nele [Praticamente]. Cada usuário poderá se ingressar ou criar uma nova guilda, para executar uma das ações, ele não poderá ser membro de nenhuma. Para criar uma guilda, será necessário no mínimo alcançar o nível 30 [valor ainda não definido]; Individualmente, cada guilda possuirá seu level e experiência. A cada monstro morto por um membro, a guilda receberá 10% da experiência total da criatura morta (Não será descontado no que o player ganhará).
    Como este é um sistema muito longo, ele será dividido em três partes e a cada dois dias será lançado um novo teaser sobre ele.

    Dica: Quanto mais usuários ativos em sua guilda, mais experiência ela receberá, mais level ela terá.



    Guild System - Request Board
    Como na série Fairy Tail, os magos que pertencem as guildas fazem trabalhos pela comissão. Esses trabalhos estão expostos em um quadro, qualquer um pode pega-los. Um esquema de como funcionará no jogo:

    Qualquer jogador poderá pegar uma task no Request Board de sua guilda.
    - Ninguém poderá fazer duas tasks ao mesmo tempo.
    - Após o jogador pegar a task no quadro, ela nunca mais poderá ser feita. [Existe exceções];
    - As tasks irão aparecer no quadro de acordo com o nível da Guilda. Quanto maior for o nível dela, maior vai ser a dificuldade delas e maior a quantidade de tasks para serem realizadas.





    Guild System - Flags
    A ideia desse sistema veio de um jogo chamado Ragnarök. O que queremos propor é que as guildas com as maiores influências no jogo terá sua marca exposta para todos os jogadores em bandeiras que estarão nas cidades. Um dos fatores que contribuirá é o level da guilda.
    - Não será necessário baixar uma nova atualização a cada nova influência.
    - Os jogadores poderão fazer upload do ícone de suas guildas pelo site, para representar a guilda no site. [sem perspectiva 45º]
    - A ideia desse sistema foi para que tivesse uma valorização na força das guildas, não que seja a única.




    Paperdoll System
    Paperdoll é a representação dos equipamentos utilizados pelo personagem possibilitando a criação das mais variadas combinações, desde os cabelos, roupas, armas, acessórios e outros.


    Próximo Teaser: --/--/--

    Forum


  15. Upvote
    MaXwEllDeN deu reputação a krex em Teaser #1: Um pouco da cidade de Mainport, Ents e Easter Eggs   
    Oi
     
    Faz algum tempo desde o último post com conteúdo. Nesse período o mapa cresceu MUITO, e com isso tenho novas áreas pra mostrar. A falta de sprites ainda atrapalha, mas aos poucos vou adicionando novos gráficos e deixando o mapa mais bonito
     
    Enfim, chega de enrolação, tá aí algumas imagens:


    Cemitério de Mainport
    Será que tem algo de especial lá?


    Oakhem Forest
    E uma nova criatura: Ents


    Weapon Shop em Mainport
    Ainda vou mudar esse gráfico do NPC, mas por enquanto fica parecendo um guarda mesmo



    Easter Eggs
     
     
     

    No Khorem existem dezenas de referências a outros jogos, músicas e até seriados. Pra quem gosta de RPG e de encontrar segredos vai ser um prato cheio. Tem dois abaixo só pra exemplificar...
     

    R.I.P


    Sword of Peace
     
     
     
    Por enquanto é isso...
    Comenta aí o que achou!
  16. Upvote
    MaXwEllDeN recebeu reputação de JonPiress em Locker Protection   
    #Introdução
     
    Bem, este é um sistema no qual você pode protejer o seu locker(depot) com senha, assim evitando hackers.
     
     
    #Instalação
     

    Primeiro faça o download do sistema e cole na sua pasta data.
     
    Após ter instalado os arquivos nas suas respectivas pastas adicione as tags:
     
    @Actions
     

    <action itemid="2589; 2590; 2591; 2592" event="script" value="DPPass.lua"/> <!-- DP Pass -->
     
    @Creaturescripts
     

    <event type="login" name="LockerPass" event="script" value="DPPass.lua"/> <!-- DPPass -->
     
    @Movements
     

    <movevent type="StepOut" actionid="96475" event="script" value="DPPass.lua"/> <!-- DPPass -->
     
    @Talkactions
     

    <talkaction words="!locker" script="DPPass.lua"/> <!-- DP Pass -->
     
    Abraço.
  17. Upvote
    MaXwEllDeN recebeu reputação de oxstsv em Como funcionam os scripts?   
    Como funcionam os Scripts?


    Você já deve ter se perguntado como os scripts funcionam ou não. Por exemplo: Como o servidor sabe que quando eu apertar com o botão direito em um Health Potion ele terá que healar o player alvo?

    Em primeiro lugar devemos entender o que são callbacks. Do modo mais simples callback é algo que acontece devido a uma reação, é como a Terceira Lei de Newton que diz que toda ação gera uma reação, esse callback é a nossa reção, é uma função que vai ser executada assim que algo acontecer, no caso do Health Potion assim que ele for usado.


    Quando um item é usado ele provoca a chamada de um callback dessa função:




    – Max, que parâmetros são esses? :hum:
    – É simples.



    O Script do Health Potion ficaria +/- assim:

    local config = { min_heal = 100, -- Minimo que vai healar max_heal = 200, -- Máximo que vai healar empty = 7636, -- Id do Potion vazio } function onUse(cid, item, fromPosition, itemEx, toPosition) if isCreature(itemEx.uid) then doCreatureSay(cid, "Aaaah...", 19) doSendMagicEffect(toPosition, 12) doCreatureAddHealth(itemEx.uid, math.random(config.min_heal, config.max_heal)) doTransformItem(item.uid, config.empty) else doPlayerSendCancel(cid, "You cannot use this object.") end return true end
    Funções usadas:


    Bem, esse aí é o script, agora só é você salvar, colocar na sua pasta actions/scripts e pronto!

    – Max, se existem vários scripts na pasta actions/scripts, como meu OT sabe qual usar?
    – Por causa das chamadas TAGs.
    – TAGs?
    – Sim, é uma linha que é colocada no .xml para dizer ao seu servido que o Callback para um item x será a função daquele script.

    As Tags das actions seguem esse modelo:

    <action itemid = "7618" event = "script" value = "HealthPotion.lua" /> itemid - É o id do item, que ao ser usado o callback dele vai ser o script que está em value, no caso HealthPotion.lua
    event - Indica o que vai acontecer quando usar o item, no caso vai ler o script. Não precisa se preocupar com isso por enquanto.
    value - É o nome do script que tem o callback que você quer usar no item 7618

    Exercício: Crie uma Action que quando eu usar uma Warlord Sword em alguém essa pessoa diga "Aí, isso doi". Poste a TAG também!

    Resposta SÓ ABRA DEPOIS DE RESOLVER:



    É isso aí pessoal, essa foi a primeira aula de Scriptwriting que eu escreví, espero que gostem :3
  18. Upvote
    MaXwEllDeN deu reputação a Killua em [CTF] Capture The Flag 2.0(Automático)   
    kinglekke, o Max disponibilizou o codigo pra vc usar e editar como quiser, ele nao se dispos a dar suporte permanente para todos.
     
    Se quiser que suas duvidas sejam retiradas, acho que eh melhor postar na area de pedidos e duvidas, pq la o pessoal costuma responder mais...
     
    Pra resolver o problema de nao teleportar o vencedor, tenta fazer assim, na parte:
    for _, cid in pairs(CTF.getMembers()) do if getPlayerStorageValue(cid, 16700) == win then local xp = math.ceil(getPlayerExperience(cid) * (CTF.xp_percent / 100), 215) doPlayerSendTextMessage(cid, 22, "Parab�ns! Voc� ganhou o evento e obteve ".. CTF.xp_percent .."% de sua experi�ncia total(".. xp ..").") doSendAnimatedText(getThingPos(cid), xp, 215) doPlayerAddExperience(cid, xp) end Vc muda e deixa ela assim:
    for _, cid in pairs(CTF.getMembers()) do if getPlayerStorageValue(cid, 16700) == win then local xp = math.ceil(getPlayerExperience(cid) * (CTF.xp_percent / 100), 215) doPlayerSendTextMessage(cid, 22, "Parab�ns! Voc� ganhou o evento e obteve ".. CTF.xp_percent .."% de sua experi�ncia total(".. xp ..").") doSendAnimatedText(getThingPos(cid), xp, 215) doPlayerAddExperience(cid, xp) doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) end
  19. Upvote
    MaXwEllDeN recebeu reputação de Martelix em Locker Protection   
    #Introdução
     
    Bem, este é um sistema no qual você pode protejer o seu locker(depot) com senha, assim evitando hackers.
     
     
    #Instalação
     

    Primeiro faça o download do sistema e cole na sua pasta data.
     
    Após ter instalado os arquivos nas suas respectivas pastas adicione as tags:
     
    @Actions
     

    <action itemid="2589; 2590; 2591; 2592" event="script" value="DPPass.lua"/> <!-- DP Pass -->
     
    @Creaturescripts
     

    <event type="login" name="LockerPass" event="script" value="DPPass.lua"/> <!-- DPPass -->
     
    @Movements
     

    <movevent type="StepOut" actionid="96475" event="script" value="DPPass.lua"/> <!-- DPPass -->
     
    @Talkactions
     

    <talkaction words="!locker" script="DPPass.lua"/> <!-- DP Pass -->
     
    Abraço.
  20. Upvote
    MaXwEllDeN recebeu reputação de Omega em [CTF] Capture The Flag 2.0(Automático)   
    Novo Link UP!
  21. Upvote
    MaXwEllDeN deu reputação a Oneshot em Oneshot Spell Lib   
    Oneshot Spell Lib

    Boa tarde, meus queridos.
     
    Como eu disse no último post do tópico do Spell Forge, sim, ele estava ficando funcional o bastante, mas uma coisa não me agradava, o nível de dificuldade de configuração do sistema estava aumentando, e uma hora, não teria como OT-admins usarem meu sistema, pois não saberiam configurar.
     
    Então resolvi parar o desenvolvimento dele por enquanto, mas segue minha biblioteca que estava usando para desenvolvimento do sistema.
     
    Uma biblioteca completa para desenvolvimento de magias, orientada a objetos, torna a coisa bem mais interessante.
     
    Para utilizar minha biblioteca, basta criar arquivo com qualquer nome na pasta data/lib do seu servidor e colar o seguinte conteúdo abaixo:
    -- This library is part of Oneshot Spell System -- Copyright (C) 2013 Oneshot -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see <http://www.gnu.org/licenses/>. -- constant CONST_SPELL_AREA = 0 -- area spells, like exevo gran mas vis CONST_SPELL_DIRECTION = 1 -- wave spells, like exevo flam hur CONST_SPELL_TARGETORDIRECTION = 2 -- mix between area and wave spells WEAPON_SKILLS = { [WEAPON_SWORD] = SKILL_SWORD, [WEAPON_CLUB] = SKILL_CLUB, [WEAPON_AXE] = SKILL_AXE, } -- class for combats (spell instances) Combat = { type = 0, me = 0, ani = 0, formula = { type = 0, values = {}, }, condition = nil, delay = 0, id = 0, } function Combat:New(_type, me, ani, delay, id) local new_spellinstance = { type = _type or COMBAT_NONE, me = me or CONST_ME_NONE, ani = ani or CONST_ANI_NONE, formula = { type = COMBAT_FORMULA_UNDEFINED, values = {0, 0, 0, 0, 0, 0, 0, 0}, }, condition = nil, delay = delay or -1, id = id or 1, } return setmetatable(new_spellinstance, {__index = self}) end function Combat:SetType(_type) self.type = (tonumber(_type) and _type or COMBAT_NONE) end function Combat:SetEffect(me) self.me = (tonumber(me) and me or CONST_ME_NONE) end function Combat:SetDistanceEffect(ani) self.ani = (tonumber(ani) and ani or CONST_ANI_NONE) end function Combat:SetFormula(_type, ...) local args = select("#", ...) self.formula.type = (tonumber(_type and _type or COMBAT_FORMULA_UNDEFINED)) local minc, maxc if args > 8 then minc, maxc = select(9, ...) end local minm, maxm = getConfigValue("formulaMagic") or 1 maxm = minm local minl, maxl = getConfigValue("formulaLevel") or 5 maxl = minl if args > 6 then minm, maxm = select(7, ...) end if args > 4 then minl, maxl = select(5, ...) end local mina, minb, maxa, maxb = select(1, ...) self.formula.values = {mina, minb, maxa, maxb, minl, maxl, minm, maxm, minc, maxc} end function Combat:SetCondition(condition) -- condition needs to be a createConditionObject(), e.g -- local condition = createConditionObject(CONDITION_FIRE) -- setConditionParam(condition, CONDITION_PARAM_TICKS, 1 * 1000) self.condition = condition end function Combat:GetDelay() return self.delay end function Combat:SetDelay(delay) self.delay = (tonumber(delay) and delay or -1) end function Combat:GetId() return self.id end function Combat:SetId(id) self.id = (tonumber(id) and id or 1) end function Combat:getMinMaxValues(cid, ex) local min, max = 0, 0 local n = self.formula.values if not isCreature(cid) then return false end if not isPlayer(cid) then self.formula.type = COMBAT_FORMULA_DAMAGE end if self.formula.type == COMBAT_FORMULA_LEVELMAGIC then min = (getPlayerLevel(cid) / n[5] + getPlayerMagLevel(cid) * n[7]) * n[1] + n[2] max = (getPlayerLevel(cid) / n[6] + getPlayerMagLevel(cid) * n[8]) * n[3] + n[4] if n[9] then min = math.max(n[9], min) end if n[10] then max = math.max(n[10], max) end elseif self.formula.type == COMBAT_FORMULA_SKILL then local weapon = getPlayerWeapon(cid) if weapon.uid > 0 then max = getPlayerWeaponDamage(cid, weapon) * n[3] + n[4] else max = n[4] end if n[10] then max = math.max(n[10], max) end elseif self.formula.type == COMBAT_FORMULA_DAMAGE then min = n[2] max = n[4] end return min, max end function Combat:Callback(position, cid, ex) if not isCreature(cid) then return false end local min, max = self:getMinMaxValues(cid, ex) doCombatAreaHealth(cid, self.type, position, 0, min, max, self.me) if self.condition then doCombatAreaCondition(cid, position, 0, self.condition, CONST_ME_NONE) end return true end -- class for spells Spell = { type = 0, level = 0, maglevel = 0, mana = 0, needtarget = false, target_or_direction = false, range = 0, needweapon = false, selftarget = false, vocations = {}, combats = {}, } function Spell:New(_type, level, maglevel, mana, needtarget, range, needweapon, selftarget, ...) local new_spell = { type = _type or CONST_SPELL_AREA, level = level or 1, maglevel = maglevel or 0, mana = mana or 0, needtarget = needtarget or false, range = range or 1, needweapon = needweapon or false, selftarget = selftarget or false, vocations = {...}, combat = {}, area = {{3}}, } return setmetatable(new_spell, {__index = self}) end function Spell:SetType(_type) self.type = (tonumber(_type) and _type or CONST_SPELLarea) end function Spell:SetLevel(level) self.level = (tonumber(level) and level or 1) end function Spell:SetMagLevel(maglevel) self.maglevel = (tonumber(maglevel) and maglevel or 0) end function Spell:SetMana(mana) self.mana = (tonumber(mana) and mana or 0) end function Spell:SetNeedTarget(needtarget) self.needtarget = (type(needtarget) == "boolean" and needtarget or false) end function Spell:SetRange(range) self.range = (tonumber(range) and range or 1) end function Spell:SetNeedWeapon(needweapon) self.needweapon = (type(needweapon) == "boolean" and needweapon or false) end function Spell:SetSelfTarget(selftarget) self.selftarget = (type(selftarget) == "boolean" and selftarget or false) end function Spell:SetVocations(...) self.vocations = {...} end function Spell:Append(...) local t = {...} for i = 1, #t do self.combat[t[i]:GetId()] = t[i] end end function Spell:SetArea(area) self.area = area end function Spell:Cast(cid) if not isCreature(cid) then return false end if #self.combat == 0 then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) return false end if isPlayer(cid) then if not getPlayerFlagValue(cid, PLAYERFLAG_IGNORESPELLCHECK) then if getPlayerLevel(cid) < self.level then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTENOUGHLEVEL) return false end if getCreatureMana(cid) < self.mana then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTENOUGHMANA) return false end if getPlayerMagLevel(cid) < self.maglevel then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTENOUGHMAGICLEVEL) return false end if self.needweapon and (getPlayerWeapon(cid).uid == 0) then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUNEEDAWEAPONTOUSETHISSPELL) return false end local vocation = getPlayerVocation(cid) if #self.vocations > 0 and not (table.find(self.vocations, vocation) or table.find(self.vocations, getVocationInfo(vocation).fromVocation)) then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_YOURVOCATIONCANNOTUSETHISSPELL) return false end end end local target = getCreatureTarget(cid) if self.needtarget == true then if self.type == CONST_SPELL_DIRECTION then self.type = CONST_SPELL_TARGETORDIRECTION elseif self.type == CONST_SPELL_AREA and not isCreature(target) then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUCANONLYUSEITONCREATURES) return false end end if self.range and isCreature(target) then if getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(target)) > self.range then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_TOOFARAWAY) return false end end local area = self.area if self.type == CONST_SPELL_DIRECTION or (self.type == CONST_SPELL_TARGETORDIRECTION and not isCreature(target)) then area = getAreaByDir(area, getCreatureLookDirection(cid)) end local centre = getCreaturePosition(cid) local target = getCreatureTarget(cid) if self.type == CONST_SPELL_DIRECTION then centre = getPosByDir(getCreaturePosition(cid), getCreatureLookDirection(cid), 1) elseif self.type == CONST_SPELL_TARGETORDIRECTION then centre = (isCreature(target) and getCreaturePosition(target) or getPosByDir(getCreaturePosition(cid), getCreatureLookDirection(cid), 1)) elseif self.type == CONST_SPELL_AREA then if self.needtarget and isCreature(target) then centre = getCreaturePosition(target) end end local positions = getAreaPositions(area, centre) for i = 1, #area do for j = 1, #area[i] do local tmp = area[i][j] if tmp == 3 then for k = 1, #self.combat do local combat = self.combat[k] if combat then addEvent(function() if self.selftarget then combat:Callback(positions[i][j], 0) else combat:Callback(positions[i][j], cid) end doSendDistanceShoot(getCreaturePosition(cid), centre, combat.ani) end, combat:GetDelay()) end end elseif type(tmp) == "number" and self.combat[tmp] then local combat = self.combat[tmp] if combat then addEvent(function() if self.selftarget then combat:Callback(positions[i][j], 0) else combat:Callback(positions[i][j], cid) end doSendDistanceShoot(getCreaturePosition(cid), centre, combat.ani) end, combat:GetDelay()) end elseif type(tmp) == "table" then for k = 1, #tmp do local tile = tmp[k] local combat = self.combat[tile] if combat then addEvent(function() if self.selftarget then combat:Callback(positions[i][j], 0) else combat:Callback(positions[i][j], cid) end doSendDistanceShoot(getCreaturePosition(cid), centre, combat.ani) end, combat:GetDelay()) end end end end end if self.mana > 0 then doCreatureAddMana(cid, -self.mana, 0) end return true end function rotate(area) local ret = {} for i = 1, #area do for j = 1, #area[i] do if not ret[#area[i]-j+1] then ret[#area[i]-j+1] = {} end ret[#area[i]-j+1][i] = area[i][j] end end return ret end function getAreaByDir(area, direction) local ret = area if direction > NORTH then local n = (4 - direction) repeat ret = rotate(ret) n = n - 1 until n == 0 end return ret end function getAreaCentre(area) local x, y = 0, 0 for i = 1, #area do for j = 1, #area[i] do if area[i][j] == 3 then x = j y = i break end end end return x, y end function getAreaPositions(area, centre) local ret = {} local x, y = getAreaCentre(area) for i = 1, #area do for j = 1, #area[i] do if not ret[i] then ret[i] = {} end ret[i][j] = {x = centre.x + (j - x), y = centre.y + (i - y), z = centre.z} end end return ret end function getPlayerMeleeDamage(cid, item) local skill, attack if item.uid > 0 then local info = getItemInfo(item.itemid) skill = getPlayerSkillLevel(cid, WEAPON_SKILLS[getItemWeaponType(item.uid)]) attack = ((getItemAttribute(item.uid, "attack") or info.attack) + (getItemAttribute(item.uid, "extraAttack") or info.extraAttack) - info.abilities.elementDamage) else skill = getPlayerSkillLevel(cid, SKILL_FIST) attack = 0 end local damage = math.ceil((2 * (attack * (skill + 5.8) / 25 + (getPlayerLevel(cid) - 1) / 10.)) / getPlayerAttackFactor(cid)) return -math.random(0, damage) end function getPlayerAttackFactor(cid) local switch = { 1.0, 1.2, 2.0, } return switch[(getPlayerModes(cid).fight + 1)] end dofile(getDataDir() .."/spells/lib/spells.lua") É uma biblioteca orientada a objetos que facilita o desenvolvimento de magias. Comparando a forma dos scripts de magias, com a minha biblioteca e sem, podemos ver a diferença.
     
    Sem a biblioteca:
    local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 4.5, 9) local area = createCombatArea(AREA_SQUAREWAVE5, AREADIAGONAL_SQUAREWAVE5) setCombatArea(combat, area) function onCastSpell(cid, var) return doCombat(cid, combat, var) end Com a biblioteca:
    local combat = Combat:New(COMBAT_ENERGYDAMAGE, CONST_ME_ENERGYAREA, CONST_ANI_ENERGY) combat:SetFormula(COMBAT_FORMULA_LEVELMAGIC, -1, 0, -1, 0, 5, 5, 4.5, 9) local spell = Spell:New(CONST_SPELL_DIRECTION) spell:Append(combat) spell:SetArea(AREA_WAVE4) function onCastSpell(cid, var) return spell:Cast(cid) end Mas o melhor mesmo é notado quando você quer desenvolver as magias com mais de uma variável combat. Aquelas magias de múltiplos hits e efeitos.
     
    Vou pegar uma magia de 3 efeitos e danos diferentes.
    local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setAttackFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 4.5, 9) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA) setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ICE) setAttackFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 1, 2) local combat3 = createCombatObject() setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) setCombatParam(combat3, COMBAT_PARAM_EFFECT, CONST_ME_SMALLPLANTS) setCombatParam(combat3, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_EARTH) setAttackFormula(combat3, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 3.5, 7) local area = createCombatArea(AREA_SQUAREWAVE5, AREADIAGONAL_SQUAREWAVE5) setCombatArea(combat1, area) setCombatArea(combat2, area) setCombatArea(combat3, area) function onCastSpell1(cid, var) doCombat(cid, combat1, var) end function onCastSpell2(cid, var) doCombat(cid, combat2, var) end function onCastSpell3(cid, var) doCombat(cid, combat3, var) end function onCastSpell(cid, var) onCastSpell1(cid, var) addEvent(onCastSpell2, 300, cid, var) addEvent(onCastSpell3, 600, cid, var) return true end Com o uso da minha biblioteca, podemos notar a redução de linhas, e a limpeza do código:
    local combat1 = Combat:New(COMBAT_ENERGYDAMAGE, CONST_ME_ENERGYAREA, CONST_ANI_ENERGY) combat1:SetFormula(COMBAT_FORMULA_LEVELMAGIC, -1, 0, -1, 0, 5, 5, 4.5, 9) local combat2 = Combat:New(COMBAT_ICEDAMAGE, CONST_ME_ICEAREA, CONST_ANI_ICE) combat2:SetFormula(COMBAT_FORMULA_LEVELMAGIC, -1, 0, -1, 0, 5, 5, 1, 2) combat2:SetId(2) combat2:SetDelay(300) local combat3 = Combat:New(COMBAT_EARTHDAMAGE, CONST_ME_SMALLPLANTS, CONST_ANI_EARTH) combat3:SetFormula(COMBAT_FORMULA_LEVELMAGIC, -1, 0, -1, 0, 5, 5, 3.5, 7) combat3:SetId(4) combat3:SetDelay(600) local T = {1, 2, 4} local area = { {T, T, T}, {T, T, T}, {T, T, T}, {0, T, 0}, {0, 3, 0}, } local spell = Spell:New(CONST_SPELL_DIRECTION) spell:SetArea(area) spell:Append(combat1, combat2, combat3) function onCastSpell(cid, var) return spell:Cast(cid) end Qualquer dúvida quanto ao uso da biblioteca no desenvolvimento de magias, basta postar neste tópico que estarei esclarecendo.
     
     
    Grande Abraço,
    Oneshot.
  22. Upvote
    MaXwEllDeN recebeu reputação de Hudsin em [CTF] Capture The Flag 2.0(Automático)   
    #Introdução
     
    Este é um sistema de rouba bandeira, no qual tem dois times que se enfrentam e tentam se infiltrar na fortaleza do inimigo, roubar a bandeira dele e retornar para sua base com ela.
     
     
     
    #Instalação
     
    Faça o download do sistema e cole na pasta do seu servidor.
    Download Capture The Flag 2.0 Após ter instalado os arquivos nas suas respectivas pastas e instalado as tags
    nos arquivos xml, abra a pasta do seu servidor, e em seguida abra a pasta spells/scripts/support, e abra o arquivo invisible.lua com algum editor de texto, depois de
     
     
    function onCastSpell(cid, var) cole isso:
     
    if (getPlayerStorageValue(cid, 16700) ~= -1) then return doPlayerSendCancel(cid, "Você não pode usar invisible durante o CTF!") and doSendMagicEffect(getThingPos(cid), 2) end ficando assim:
     
    local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) local condition = createConditionObject(CONDITION_INVISIBLE) setConditionParam(condition, CONDITION_PARAM_TICKS, 200000) setCombatCondition(combat, condition) function onCastSpell(cid, var) if (getPlayerStorageValue(cid, 16700) ~= -1) then return doPlayerSendCancel(cid, "Você não pode usar invisible durante o CTF!") and doSendMagicEffect(getThingPos(cid), 2) end return doCombat(cid, combat, var) end #Configuração
     
    Como na maioria dos meus códigos: as configurações ficam na lib, então:
     
     
     
     
     
     
     

    waitpos = {x = 93, y = 117, z = 6}, -- Posição da sala de espera tppos = {x = 92, y = 117, z = 7}, -- Onde o TP vai aparecer days = {2, 5, 7}, -- Dias que o evento vai abrir xp_percent = 0.5, -- Porcentagem de xp que o player vai receber quando ganhar timeclose = 1, -- Tempo para iniciar o CTF winp = 10, waitpos = {x = 93, y = 117, z = 6}, -- Posição da sala de espera  
    Posição onde os players que entrarem no teleport vão ficar esperando, até o evento iniciar
     
    tppos = {x = 92, y = 117, z = 7}, -- Onde o TP vai aparecer Posição de onde o teleport vai aparecer
     
    days = {2, 5, 7}, -- Dias que o evento vai abrir  
    Dias que o evento vai iniciar.
     
    xp_percent = 0.5, -- Porcentagem de exp que o player vai ganhar  
    Quando o evento acaba, os players da equipe que venceu ganham uma quantidade de experiência baseada na experiência que eles já têm, exemplo:
     
    Meu player tem 1200000000 de exp, quando o evento acabar, ele vai ganhar 0.5% da exp que ele tem, no caso desse exemplo 6000000 de exp.
     
    timeclose = 1, -- Tempo, em minutos, para iniciar o CTF  
    Tempo para o teleport sumir e os players que estão na sala de espera serem teletransportados para o evento.
     
     
    winp = 10, -- Quantos pontos uma equipe precisa marcar para vencer  
    Quantos pontos uma equipe precisa marcar para vencer o evento.
     
     
    Para configurar o horário que o evento vai abrir, é só você modificar na tag do globalevents.xml:
     
    <globalevent name="CTFCheck" time="19:33:00" event="script" value="CTFMax.lua"/>  
    Você não precisa criar as bandeiras pelo map editor. O script irá adicioná-las automaticamente.
     
    É isso, essa versão é uma remake, vários bugs reportados pela galera na v.1 foram corrigidos, o script ficou mais simples
  23. Upvote
    MaXwEllDeN recebeu reputação de Killua em [CTF] Capture The Flag 2.0(Automático)   
    Bug no utana vid corrigido.
     
    Tópico atualizado - 15/08/2013
  24. Upvote
    MaXwEllDeN recebeu reputação de Killua em [CTF] Capture The Flag 2.0(Automático)   
    #Introdução
     
    Este é um sistema de rouba bandeira, no qual tem dois times que se enfrentam e tentam se infiltrar na fortaleza do inimigo, roubar a bandeira dele e retornar para sua base com ela.
     
     
     
    #Instalação
     
    Faça o download do sistema e cole na pasta do seu servidor.
    Download Capture The Flag 2.0 Após ter instalado os arquivos nas suas respectivas pastas e instalado as tags
    nos arquivos xml, abra a pasta do seu servidor, e em seguida abra a pasta spells/scripts/support, e abra o arquivo invisible.lua com algum editor de texto, depois de
     
     
    function onCastSpell(cid, var) cole isso:
     
    if (getPlayerStorageValue(cid, 16700) ~= -1) then return doPlayerSendCancel(cid, "Você não pode usar invisible durante o CTF!") and doSendMagicEffect(getThingPos(cid), 2) end ficando assim:
     
    local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) local condition = createConditionObject(CONDITION_INVISIBLE) setConditionParam(condition, CONDITION_PARAM_TICKS, 200000) setCombatCondition(combat, condition) function onCastSpell(cid, var) if (getPlayerStorageValue(cid, 16700) ~= -1) then return doPlayerSendCancel(cid, "Você não pode usar invisible durante o CTF!") and doSendMagicEffect(getThingPos(cid), 2) end return doCombat(cid, combat, var) end #Configuração
     
    Como na maioria dos meus códigos: as configurações ficam na lib, então:
     
     
     
     
     
     
     

    waitpos = {x = 93, y = 117, z = 6}, -- Posição da sala de espera tppos = {x = 92, y = 117, z = 7}, -- Onde o TP vai aparecer days = {2, 5, 7}, -- Dias que o evento vai abrir xp_percent = 0.5, -- Porcentagem de xp que o player vai receber quando ganhar timeclose = 1, -- Tempo para iniciar o CTF winp = 10, waitpos = {x = 93, y = 117, z = 6}, -- Posição da sala de espera  
    Posição onde os players que entrarem no teleport vão ficar esperando, até o evento iniciar
     
    tppos = {x = 92, y = 117, z = 7}, -- Onde o TP vai aparecer Posição de onde o teleport vai aparecer
     
    days = {2, 5, 7}, -- Dias que o evento vai abrir  
    Dias que o evento vai iniciar.
     
    xp_percent = 0.5, -- Porcentagem de exp que o player vai ganhar  
    Quando o evento acaba, os players da equipe que venceu ganham uma quantidade de experiência baseada na experiência que eles já têm, exemplo:
     
    Meu player tem 1200000000 de exp, quando o evento acabar, ele vai ganhar 0.5% da exp que ele tem, no caso desse exemplo 6000000 de exp.
     
    timeclose = 1, -- Tempo, em minutos, para iniciar o CTF  
    Tempo para o teleport sumir e os players que estão na sala de espera serem teletransportados para o evento.
     
     
    winp = 10, -- Quantos pontos uma equipe precisa marcar para vencer  
    Quantos pontos uma equipe precisa marcar para vencer o evento.
     
     
    Para configurar o horário que o evento vai abrir, é só você modificar na tag do globalevents.xml:
     
    <globalevent name="CTFCheck" time="19:33:00" event="script" value="CTFMax.lua"/>  
    Você não precisa criar as bandeiras pelo map editor. O script irá adicioná-las automaticamente.
     
    É isso, essa versão é uma remake, vários bugs reportados pela galera na v.1 foram corrigidos, o script ficou mais simples
  25. Upvote
    MaXwEllDeN recebeu reputação de TioItachi em Como funcionam os scripts?   
    Como funcionam os Scripts?


    Você já deve ter se perguntado como os scripts funcionam ou não. Por exemplo: Como o servidor sabe que quando eu apertar com o botão direito em um Health Potion ele terá que healar o player alvo?

    Em primeiro lugar devemos entender o que são callbacks. Do modo mais simples callback é algo que acontece devido a uma reação, é como a Terceira Lei de Newton que diz que toda ação gera uma reação, esse callback é a nossa reção, é uma função que vai ser executada assim que algo acontecer, no caso do Health Potion assim que ele for usado.


    Quando um item é usado ele provoca a chamada de um callback dessa função:




    – Max, que parâmetros são esses? :hum:
    – É simples.



    O Script do Health Potion ficaria +/- assim:

    local config = { min_heal = 100, -- Minimo que vai healar max_heal = 200, -- Máximo que vai healar empty = 7636, -- Id do Potion vazio } function onUse(cid, item, fromPosition, itemEx, toPosition) if isCreature(itemEx.uid) then doCreatureSay(cid, "Aaaah...", 19) doSendMagicEffect(toPosition, 12) doCreatureAddHealth(itemEx.uid, math.random(config.min_heal, config.max_heal)) doTransformItem(item.uid, config.empty) else doPlayerSendCancel(cid, "You cannot use this object.") end return true end
    Funções usadas:


    Bem, esse aí é o script, agora só é você salvar, colocar na sua pasta actions/scripts e pronto!

    – Max, se existem vários scripts na pasta actions/scripts, como meu OT sabe qual usar?
    – Por causa das chamadas TAGs.
    – TAGs?
    – Sim, é uma linha que é colocada no .xml para dizer ao seu servido que o Callback para um item x será a função daquele script.

    As Tags das actions seguem esse modelo:

    <action itemid = "7618" event = "script" value = "HealthPotion.lua" /> itemid - É o id do item, que ao ser usado o callback dele vai ser o script que está em value, no caso HealthPotion.lua
    event - Indica o que vai acontecer quando usar o item, no caso vai ler o script. Não precisa se preocupar com isso por enquanto.
    value - É o nome do script que tem o callback que você quer usar no item 7618

    Exercício: Crie uma Action que quando eu usar uma Warlord Sword em alguém essa pessoa diga "Aí, isso doi". Poste a TAG também!

    Resposta SÓ ABRA DEPOIS DE RESOLVER:



    É isso aí pessoal, essa foi a primeira aula de Scriptwriting que eu escreví, espero que gostem :3
  • Quem Está Navegando   0 membros estão online

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