• TibiaFace

    Tibiaface | Una comunidad Open Tibia donde encontras : mapas, scripts, Otserver, npc y amigos etc ...

    .
    demo menumenu

    Afiliados



    Votar:

    [Guia] Guia para scriptear en open tibia

    Compartir:

    Ver el tema anterior Ver el tema siguiente Ir abajo  Mensaje (Página 1 de 1.)

    1Hàng chuẩn [Guia] Guia para scriptear en open tibia el Miér Mayo 07, 2014 9:12 pm

    [Admin] God Maya

    avatar
    Administrador
    Administrador
    En esta guia explicare cada una de las cosas que usaremos para hacer Scripts en lenguage Lua para OTServ, partiendo desde lo basico, tambien mantendre los dos posts siguientes en el caso de que necesite agregar informacion.
    Esta guia fue solicitada y espero que le sirva a mucha gente mas, realmente espero que aprendan a hacer scripts por su cuenta.
    No un poco en ella habia tenido tiempo, pero ahora que tengo un poco avanazare.


    Simbolos mas usados.

    Comparacion
    > indicara que el valor de la izquierda es mayor al de la derecha.
    < indicara que el valor de la derecha es mayor al de la izquierda.
    >= indicara que el valor de la izquierda es mayor o igual al de la derecha.
    <= indicara que el valor de la derecha es igual o mayor al de la izquierda.
    == indicara que ambos valores son iguales.
    ~= indicara que ambos valores no son iguales.

    Calculos
    = esto ara que un valor pase a ocupar otro valor.
    - calculo resta, tambien se usa para dar un valor negativo.
    + calculo suma.
    * calculo multiplicacion.
    / calculo division.
    Puntuaciones
    . se usa para muchas cosas, una de sus principales funciones en lua es definir un parametro de una funcion y/o valor.
    , se usa para muchas cosas, una de sus principales funciones en lua es separar parametros de una funcion y/o valor.

    Parentesis
    { } abre y cierra una tabla.
    ( ) abre y cierra los parametros de una funcion y/o valor.
    [ ] se usa para varias cosas, una des sus principales funcion en lua es abrir y cerrar subparametros en una funcion y/o valor.
    Comillas
    " " se usa para introducir texto en nuestra operacion.
    ' ' se usa para introducir texto en nuestra operacion.
    si las comillas no se cierran correctamente esto dejara nula la operacion.
    \ se usa para anular una comilla.

    ejemplos:


    Código:
       nivel del player = variante
        el valor "nivel rdel player" pasa a tomar el valor de una variante que luego explicare como hacer.

    Código:
       nivel requerido = 50
        el valor "nivel requerido" pasa a tomar el valor de 50.

    Código:
       nivel del player > nivel requerido
        si el nivel del player es mayos a ...

    Código:
       nivel del player < nivel requerido
        si el nivel del player es menor a ...

    Código:
       nivel del player >= nivel requerido
        si el nivel del player es mayor o igual a ...

    Código:
       nivel del player <= nivel requerido
        si el nivel del player es menor o igual a ...


    Código:
       nivel del player == nivel requerido
        si el nivel del player es igual a ...

    Código:
       nivel del player ~= nivel requerido
        si el nivel del player no es igual a ...

    Código:
       posicion = {x = 1000, Y = 1000, z = 7}
        en este ejemplo tenemos varias cosas presentes, como el valor "posicion" pasa a tomar el valor indicado en la tabla, en la cual los parametros tambien pasan a tomar un valor indicado con "=", y los cuales estan separados por una coma ",".


    Código:
       valor1 = {mensaje = "Hola", color = 15}
        doPlayerSendTextMessage(cid, valor1.color, valors1.mensaje)
        el valor1 pasa a tomar el lugar de nuestra tabla, la cual tienes sus parametros, luego hacemos un llamado al valor1, separando sus parametros con un punto ".".

    Código:
       doPlayerSendTextMessage(cid, "Hello i'm alejandro", 15)
        en los casos que nuestro texto debe llevar una comilla por cosa de estetica anularemos la comilla con un "", y nuestra comilla sera mostrada.

    Código:
       valor = 1 + 1
        valor = 2 - 1
        valor = 5 * 1
        valor = 9 / 3

    ejemplos de calculos simples.


    Código:
       valor1 = 50
        valor2 = 90
        valor total = valor1 + valor2
        ejemplo de calculos haciendo llamados a valores asignados.


    Palabras Claves mas usadas

    function dara inicio a nuestra funcion.
    if pone una condicion a un evento.
    else es la contradiccion de nuestra condicion.
    elseif es la contradiccion de nuestra condicion, pero a la vez crea una nueva condicion.
    and agrega una condicion a un if, la cual debe ser cumplida junto con el.
    or es una condicion que se agrega a un if, la cual a la ves en una contradiccion.
    end finaliza una function y/o un if.
    local es un valor que puede ser llamado en cualquier momento de nuestra operacion.
    then si se cumple la condicion da inicio a la serie de eventos.
    not contradiccion a un if.

    cada if, elseif debe llevar un then.
    y cada if, function debe llevar su end.

    ejemplos

    CÓDIGO:


    Código:
       function onUse(parametros)
        hacer algo....
        end
        una funcion.


    Código:
       function onUse(cid, item, frompos, item2, topos)
        if item.itemid > 2000 then
        hacer algo....
        elseif item.itemid < 2000 then
        hacer algo....
        end
        end

    notece en este ejemplo que cada if y elseif lleva un then y que por cada function y/o if tenemos un end, tambien regresemos a los simbolos basicos y notece que item.itemid es un parametro del valor item, y que tenemos presente comparaciones.


    Código:
       function onUse(cid, item, frompos, item2, topos)
        local nivel = getPlayerLevel(cid)
        if nivel > 1 and nivel < 8 then
        hacer algo....
        elseif nivel > 8 and nivel < 20 then
        hacer algo....
        else
        hacer algo....
        end
        end


    Código:
    en este ejemplo tenemos presente un valor local, al cual hicimos llamados varias veces en la operacion, tambien tenemos presente la palabra clave and la cual usamos para cumplir dos condiciones, tambien esta presente un else que es lo que ocurrira si no se cumple las condiciones.

    Código:
       function onUse(cid, item, frompos, item2, topos)
        local nivel = getPlayerLevel(cid)
        if nivel == 8 or nivel == 20 then
        hacer algo....
        else
        hacer algo....
        end
        end
        tenemos presente un or.



    Código:
       function onUse(cid, item, frompos, item2, topos)
        if not isPlayer(cid) == 1 then
        hacer algo....
        else
        hacer algo....
        end
        end
        ejemplo de como usar un not.



    Funciones

    la funcion es lo que desencadenara nuestro script, es lo que dara inicio a una seria de eventos, cada funcion debe llegar su resprectivo end.
    tambien se le llama funcion a loes eventos que abran dentro de nuestra funcion, ejemplos.
    CÓDIGO:

    getPlayerFood(cid)
    getPlayerHealth(cid)
    ellos no necesitan un end.


    Tipos de funciones

    Movements



    Código:
       function onStepIn(cid, item, pos)
        end
        se usa cuando quieres que al caminar sobre un objeto ocurra algo.
        Code:
        function onStepOut(cid, item, pos)
        end
        se usa cuando quieras que caminar fuera de un objeto ocurra algo.
        Code:
        function onEquip(cid, item, slot)
        end
        se usa cuando quieres que al poner un item en tu cuerpo ocurra algo.


    Código:
       function onDeEquip(cid, item, slot)
        end

        se usa cuando quieres que al quitar un item desde tu cuerpo ocurra algo.



    Código:
       function onAddItem(moveitem, tileitem, pos)
        end
        se usa cuando quieres que al agregar un item en algun lugar ocurra algo.
        Code:
        function onRemoveItem(moveitem, tileitem, pos)
        end

        se usa cuando quieras que al quitar un item desde un lugar ocurra algo.



    Código:
       function onStepIn(cid, item, pos)
        if isPlayer(cid) == 1 then
        doPlayerSendTextMessage(cid,22,"Hola.")
        end
        end


    Código:
       function onStepOut(cid, item, pos)
        if isPlayer(cid) == 1 then
        doPlayerSendTextMessage(cid,22,"Chao.")
        end
        end


    Código:
       function onEquip(cid, item, slot)
        doPlayerAddHealth(cid, 100)
        end


    Código:
       function onDeEquip(cid, item, slot)
        doPlayerAddHealth(cid, -100)
        end



    Código:
       function onAddItem(moveitem, tileitem, pos)
        posicion = {x=1000,y=1000,z=7}
        doSummonCreature("rat", posicion)
        end



    Código:
       function onRemoveItem(moveitem, tileitem, pos)
        posicion = {x=1000,y=1000,z=7}
        doSummonCreature("rat", posicion)
        end



    Parametros presentes en las funciones

    cid = es la criatura que ejecuta la accion, movimiento, etc.
    item = en el caso de StepIn y StepOut, es el item que debes pisar o abandonar, en el caso de onEquip y onDeEquipes el item que te pondras o quitaras.
    pos = es la pocision (sqm) donde esta el item (piso).
    slot = en que parte del cuerpo te pondras el item, o desde donde lo quitaras.
    moveitem = es el item que agregaremos o quitaremos desde la pos.
    tileitem = es el item en el cual agregaremos o quitaremos otro item.

    Subparametros

    item.uid = si el item tiene unique id, se usara esto para verificarla.
    item.itemid = se usara esto para verificar el id del item.
    item.actionid = si el item tiene actiond id, se usara esto para verificarla.
    moveitem.itemid =s e usara esto para verificar el id del item agregado o quitado.
    tileitem.uid = si el item(sqm,piso) tiene unique id, se usara esto para verificarla.
    tileitem.actionid = si el item(sqm,piso) tiene action id, se usara esto para verificarla.
    tileitem.itemid = verifica el id del piso o sqm.
    pos.x
    pox.y
    pos.z
    pos.stackpos verifica la posicion x, y, z y el stackpos del item.


    Como agregas estas funciones al archivo xml




    Código:
       <movevent event="StepIn" uniqueid="2050" script="nombre.lua" />
        <movevent event="StepOut" uniqueid="2050" script="nombre.lua" />
        uniqueid="2050" se usara para cuando queremos realizar un paso dentro o fuera de un item con unique id.
        itemid="2050" se usara cuando queramos ejecutar un paso dentro o fuera de un item con determinada id.
        actionid="2050" se usara cuando queramos ejecutar un paso dentro o fuera de un item con determinada action id.



    Código:
       <movevent event="Equip" itemid="2136" slot="necklace" script="nombre.lua" />
        <movevent event="DeEquip" itemid="2136" slot="necklace" script="nombre.lua" />
        podemos cambiar el slot por:
        -head
        -necklace
        -backpack
        -armor
        -right-hand
        -left-hand
        -legs
        -feet
        -ring



    Código:
       <movevent event="AddItem" tileitem="1" uniqueid="2051" script="nombre.lua" />
        <movevent event="RemoveItem" tileitem="1" uniqueid="2051" script="nombre.lua" />
        uniqueid="2051" se usara cuando se agregue o quite un item con unique id.
        itemid="2051" se usara cuando se agregue o quite un item con determinado id.
        actionid="2051" se usara cuando se agregue o quite un item con action id.



    Ahora Falcon nos Explicara algunas cosas Sencillas y algunas avanzadas acerca del Scripting.
    Hihu! Nueva guia acerca del scripting, la recomiendo para el que ya este avanzando en lo que es el scripting en general. En esta guia explicare que son las funciones propias y como crearlas, espero que os guste!
    Tengan en cuenta que usarle el "lenguaje de scripts" que use en Los primeros pasos del scripter, y para el que no sepa nada de scripts todavia, le recomiendo leer esa guia.

    Primero, para aclarar dudas, una especie de FAQ =P

    Que es una funcion propia?

    Llamare funciones propias a las funciones de efectos que no estan programadas en el codigo fuente del servidor. Podemos encontrar diversos ejemplos en el arhivo global.lua, en la carpeta data de muchos servidores, al final del todo. Estas funciones pueden ser creadas por uno mismo como le guste a cada uno.

    Para que sirven las funciones propias?

    Personalmente, le veo muchos usos a estas funciones. Por ejemplo, pueden usarlas para simplificar scripts, traducir las funciones al español u otro idioma, etc. Con simplificar scripts, me refiero a por ejemplo, resumir algo de scripts que usamos muy seguido.

    Como crear una funcion propia.

    Bien, aqui empieza la guia. Teniendo en cuenta lo que dije anteriormente, las funciones propias podrian usarme como una especie de "libreria de programacion", muy basica, pero libreria al fin. Para crear una funcion propia debemos dirigirnos a la libreria del area para la que nos interese crear una funcion. Si la funcion la queremos destinar a mas de un area podemos dejarla en el global.lua. Con area me refiero a actions, npcs, talkactions, movements, etc.
    Bien, para crear nuestra funcion, abrimos el archivo de libreria que hayamos elegido, se encuentra en la carpeta "lib" de cada area. Supongamos que elegimos al area "actions". Vamos a la carpeta actions -> lib. Encontraremos un archivo, el actions.lua. Lo abrimos y nos dirigimos al final de todo. Ahora debemos decidir que queremos que haga nuestra funcion. Yo optare por crear una funcion llamada "questStatus(cid,value)". Quiero que esta funcion me ayude a simplificar las conocidas lineas por muchos de "if queststatus == -1 then". Este ejemplo es bastante tontito, ya que solo hara que no tenga que declarar la variable queststatus al principio del script como "queststatus = getPlayerStorageValue(cid, xxx)". Bien, empezare por escribir una linea en el actions.lua:



    Código:
       function questStatus(cid, value)



    Siempre deben escribir "function" seguido del nombre de su funcion, y entre parentesis las distintas variables que tendra la funcion. Por ejemplo, en este caso, mi funcion se llama questStatus por lo que escribi eso. Entre parentesis puse (cid, value). Cid se refiere al objeto del script, en este caso del jugador que realiza la accion, y value es el storage value que quiero chequear.
    Luego de eso indico que quiero que haga la funcion, y tengan en cuenta que los return van a jugar un gran papel a veces. Aqui deberan aplicar sus conocimientos de scripts, queda en ustedes. Les doy el ejemplo de mi funcion:



    Código:
       function questStatus(cid, value)
        s = getPlayerStorageValue(cid, value)

        if s == -1 or s == 0 then
        return 0
        else
        return 1
        end
        end



    Tengan en cuenta ahora que return quiere decir "retornar" o "devolver", por lo tanto el return implica el valor que devuelve una funcion, o sea su resultado. Mi funcion obtiene un storage value (getPlayerStorageValue(cid,value)) y si el valor es -1 o 0 devuelve el valor 0 (return 0). Se daran cuenta tambien de que yo al obtener el valor del storage value, no indique que storage. Esto es porque cuando haga uso de la funcion, y solo ahi, es cuando debo indicar que storage value quiero chequear. Por ejemplo, usando la funcion en un script, por ejemplo en el quest.lua, es asi:



    Código:
       function onUse(cid, item, frompos, item2, topos)
        prize = item.uid
        actionid = item.actionid

        if prize > 0 and prize < 7000 then

        if questStatus(cid,item.uid) == 0 then
        doPlayerSendTextMessage(cid,22,'You have found a ' .. getItemName(prize) .. '.')
        doPlayerAddItem(cid,prize,1)
        setPlayerStorageValue(cid,prize,1)
        else
        doPlayerSendTextMessage(cid,22,"It is empty.")
        end
        return 1
        else
        return 0
        end
        end




    Vean que puse:



    Código:
       if questStatus(cid,item.uid) == 0 then



    Esto quiere decir "si la funcion questStatus que chequea el storage value del jugador que usa el cofre, y el storage value que chequea es igual a la uniqueID del item, si hubiese sido quest de DSM hubiese chequeado el valor 2492, es 0 entonces...". Creo que con esto dejo bastante clarito todo =PP Igualmente les dejo una funcion de doHeal, tal vez se les aclaren un poco mas las dudas si es que las tienen aun =P Y para el que sabe un poquito, se podra dar cuenta que la funcion "exhaust" es simplemente una funcion propia


    Código:
       function doHeal(cid, health)
        doPlayerAddHealth(cid, health)
        end



    Cuando use la funcion doHeal(cid,health) en un script, tendra la misma funcion que el doPlayerAddHealth(cid, health), era nada mas para mostrarles un poco mas el funcionamiento de estas funciones.

    Bueno, eso es todo.
    Suerte!
    Magnifica Explicacion Falcon, pasaremos a unas Palabras de Sora:

    Bueno, como vi que Falcon sólo llego a las variables sencillas, os enseñaré cosas mas complicadas sobre LUA, sobretodo aprenderemos a jugar con numeros y variables, sobre tiempo, lugar y azar.

    Lugar
    Cogeremos un script normal y corriente, de que si el player esta encima del tesoro y usa el objeto, lo consigue.



    Código:
       function onUse(cid,item,frompos,item2,topos)

        player = getPlayerPosition(cid)
        tesoro = {x=xxxx, y=yyyy, z=z)

        if player.x == tesoro.x and player.y == tesoro.y and player.z == tesoro.z then
        doPlayerAddItem(cid,item)

    player = getPlayerPosition(cid). Es la posición del jugador, para compararla con la posición del tesoro.
    tesoro = {x=xxxx, y=yyyy, z=z). Posición del tesoro.
    if player.x == tesoro.x and player.y = tesoro.y and player.z = tesoro.z Comparaciones entre distintos lugares, siempre se pone una posición mas .x si es al coordenada x la que se compara o la .y o la .z, por ejemplo player.z para saber si está en el mismo piso que el tesoro.z

    Si habeis leido la guia de Falcon, aqui se condiciona que si player.x, player.y y player.z son iguales que tesoro.x, tesoro.y y tesoro.z el script tomará lugar, por supuesto si usas el item que has seleccionado en "actions.xml".

    Para cualquier scripter que se precie, esto es muy sencillo, sencillisimo. Así que ahora, pondremos que al no usar el objeto sobre el tesoro, ocurra algo.


    Código:
       function onUse(cid,item,frompos,item2,topos)

        player = getPlayerPosition(cid)
        tesoro = {x=xxxx, y=yyyy, z=z)

        if player.x == tesoro.x and player.y == tesoro.y and player.z == tesoro.z then
        doPlayerAddItem(cid,item)

        elseif player.x < tesoro.x and player.y == tesoro.y and player.z == tesoro.z then
        doPlayerSay(cid,'Parece que el tesoro se encuentra al oeste')




    Se puede apreciar que es lo mismo, ya que sólo han cambiado las condiciones. Podeis seguir este script y usarlo como mapa del tesoro si os interesa, porque ahora haremos algo diferente.



    Tiempo


    Código:
       function a(params)
        local startpos = params.startpos
        local spawnDelay = params.spawnDelay

        local speed = 300

        local pos = params.pos
        local cid = params.cid


        local groundpos = {x=pos.x, y=pos.y, z=pos.z, stackpos=0}
        local ground = getThingfromPos(groundpos)



    Código:
       function onStepIn(cid, item, pos)
        if isPlayer(cid) == 1 then
        isMoving = getPlayerStorageValue(cid,9500)
        if item.itemid == 5582 and isMoving == -1 then
        params = {cid = cid, pos = pos, startpos = pos, spawnDelay = 10}
        addEvent(a, 100, params)
        setPlayerStorageValue(cid,9500,1)
        end
        end
        end



    Aqui se puede ver que... addEvent sirve para hacer una función en un tiempo determinado con sus parametros (antes señalados)

    Es muy sencillo de utilizar y sus efectos son muy completos.

    Azar

    Azar ya sabeis todos para que sirve, pero como funciona?




    Un script sin azar:


    Código:
       function onUse(cid,item,frompos,item2,topos)

        doPlayerAddItem(cid,item)

        end




    Ahora le añadiremos azar



    Código:
       function onUse(cid,item,frompos,item2,topos)

        azar = math.random(numerominimo,numeromaximo)

        if azar = (numero entre numerominimo y maximo) then

        doPlayerAddItem(cid,item)

        else

        end
        end


        azar = math.random(numerominimo,numeromaximo)


    El numero mínimo suele ser 1 y el máximo, es aconsejable no ponerlo muy alto, dependiendo de el aazar que quieras ponerle, para un script de loteria recomiendo un 50.000.
    Muchas Gracias Sora, Continuamos.
    Ahora, Nuevamente Nahruto Nos Explicara algo Sobre Tablas en Lua.

    Tablas en Lua

    Hare una guia interactiva, con dos personajes, el primero yo y el segundo un pregunton.

    Creo que muchos de ustedes usan tablas sin darse cuenta aveces.
    una tabla comienza con "{" y termina con "}".

    Las tablas contienen elementos o parametros como le quieran llamar.


    Código:
       pos = {x = 1000, y = 1000, z = 7}


    Ahi estamos usando una tabla, cuantos de ustedes sabian que era una tabla?

    Los parametros deben estar separados por una coma.

    Los parametros de esta tabla son "x", "y", "z", "pos" es el nombre de la tabla.
    Podemos tomar la tabla como un todo o manejar sus parametros separadamente.
    Para hacerlo separadamente se hace de la siguiente forma, ponemos el nombre de nuestra tabla, luego un punto y el nombre del elemento.



    Código:
       pos.x, pos.y, pos.z


    Tambien cada elemento de nuestra tabla tiene un id, la tabla "pos" tiene 3 elementos por lo tanto 3 ids.
    Para hacer un llamado a un id de una tabla, ponemos el nombre de nuestra tabla seguido de el id que usaremos encerrado en "[]".



    Código:
       pos[1], pos[2], pos[3]





    Si no sabemos el numero de elementos de una tabla y queremos saberlo
    se hace de la siguiente forma.



    Código:
       #pos


    Decir eso es igual a decir 3 en este caso.
    En resumen el "#" retornara el numero de elementos que contiene la tabla.

    Ahi muchas cosas en nuestros servers que retornan tablas, como en las funciones "onUse", "frompos" y "topos" retornan tablas, al ser una tabla pdemos manejarlo como tal, usanod frompos.x, frompos.y, etc...


    Ahora mostrare una buena forma en la que una tabla pueda acortar nuestros scripts.

    Un obsidian knife que encontre por ahi:


    Código:
       function onUse(cid,item,frompos,item2,topos)
          number = math.random(1,100)
          chance = 12
          if chance > 100 or chance == 0 then
        chance = 100
          end
          if item2.itemid == 2830 or item2.itemid == 2871 or item2.itemid == 2876 or item2.itemid == 2866 then
        if number <= chance then
        doSendMagicEffect(topos,14)
        doPlayerAddItem(cid,5878,1)
        doTransformItem(item2.uid,item2.itemid+1)
        else
        doSendMagicEffect(topos,3)
        doTransformItem(item2.uid,item2.itemid+1)
        end
        return 1
          end
          if item2.itemid == 4259 or item2.itemid == 4262 or item2.itemid == 4256 then
        if number <= chance then
        doSendMagicEffect(topos,14)
        doPlayerAddItem(cid,5876,1)
        doTransformItem(item2.uid,item2.itemid+1)
        else
        doSendMagicEffect(topos,3)
        doTransformItem(item2.uid,item2.itemid+1)
        end
        return 1
          end
          if item2.itemid == 3104 or item2.itemid == 2844 then
        if number <= chance then
        doSendMagicEffect(topos,14)
        doPlayerAddItem(cid,5877,1)
        doTransformItem(item2.uid,item2.itemid+1)
        else
        doSendMagicEffect(topos,3)
        doTransformItem(item2.uid,item2.itemid+1)
        end
        return 1
          end
          if item2.itemid == 2881 then
        if number <= chance then
        doSendMagicEffect(topos,14)
        doPlayerAddItem(cid,5948,1)
        doTransformItem(item2.uid,item2.itemid+1)
        else
        doSendMagicEffect(topos,3)
        doTransformItem(item2.uid,item2.itemid+1)
        end
        return 1
          end
          if item2.itemid == 3031 then
        if number <= chance then
        doSendMagicEffect(topos,14)
        doPlayerAddItem(cid,5925,1)
        doTransformItem(item2.uid,item2.itemid+1)
        else
        doSendMagicEffect(topos,3)
        doTransformItem(item2.uid,item2.itemid+1)
        end
        return 1
          end
          if item2.itemid == 2931 then
        if number <= chance then
        doSendMagicEffect(topos,14)
        doPlayerAddItem(cid,5893,1)
        doTransformItem(item2.uid,item2.itemid+1)
        else
        doSendMagicEffect(topos,3)
        doTransformItem(item2.uid,item2.itemid+1)
        end
        return 1
          end
          if item2.itemid == 3031 then
        if number <= chance then
        doSendMagicEffect(topos,14)
        doPlayerAddItem(cid,5925,1)
        doTransformItem(item2.uid,item2.itemid+1)
        else
        doSendMagicEffect(topos,3)
        doTransformItem(item2.uid,item2.itemid+1)
        end
        return 1
          end
          return 0
        end




    Usando una tabla muy simple seria:



    Código:
       local Monsters = {
        [2931] = 5893,
        [3090] = 5878,
        [2871] = 5878,
        [2876] = 5878,
        [2866] = 5878,
        [4259] = 5876,
        [4256] = 5876,
        [4262] = 5876,
        [3104] = 5877,
        [2881] = 5948,
        [3031] = 5925
        }
        function onUse(cid, item, frompos, item2, topos)
        local number = math.random(1,10)
        monster = Monsters[item2.itemid]
        if monster then
        if number == 1 then
        doTransformItem(item2.uid,item2.itemid+1)
        doPlayerAddItem(cid,monster,1)
        doSendMagicEffect(topos, 12)
        elseif number >= 2 then
        doSendMagicEffect(topos, 3)
        doTransformItem(item2.uid,item2.itemid+1)
        end
        else
        doPlayerSendCancel(cid,"You can't skin this object.")
        end
          return 1
        end





    Te fijaste cuanto redujo el script?

    Ok, quisas ese obsidian knife no era el mas adecuado para acortar, entonces usemos un ejemplo que todo server trae.

    contructions_kits.lua (el original)


    Código:
       function onUse(cid, item, frompos, item2, topos)
          if frompos.x == 65535 then
        doPlayerSendCancel(cid, "Put the construction kit on the ground first.")
        return 1
          end
          doSendMagicEffect(topos,2)
          if item.itemid == 3901 then
        doTransformItem(item.uid,1652)
          elseif item.itemid == 3902 then
        doTransformItem(item.uid,1658)
          elseif item.itemid == 3903 then
        doTransformItem(item.uid,1666)
          elseif item.itemid == 3904 then
        doTransformItem(item.uid,1670)
          elseif item.itemid == 3905 then
        doTransformItem(item.uid,3813)
          elseif item.itemid == 3906 then
        doTransformItem(item.uid,3817)
          elseif item.itemid == 3908 then
        doTransformItem(item.uid,2602)
          elseif item.itemid == 3909 then
        doTransformItem(item.uid,1614)
          elseif item.itemid == 3910 then
        doTransformItem(item.uid,1615)
          elseif item.itemid == 3911 then
        doTransformItem(item.uid,1616)
          elseif item.itemid == 3912 then
        doTransformItem(item.uid,1619)
          elseif item.itemid == 3913 then
        doTransformItem(item.uid,3805)
          elseif item.itemid == 3914 then
        doTransformItem(item.uid,3807)
          elseif item.itemid == 3917 then
        doTransformItem(item.uid,2084)
          elseif item.itemid == 3918 then
        doTransformItem(item.uid,2095)
          elseif item.itemid == 3919 then
        doTransformItem(item.uid,3809)
          elseif item.itemid == 3926 then
        doTransformItem(item.uid,2080)
          elseif item.itemid == 3927 then
        doTransformItem(item.uid,2098)
          elseif item.itemid == 3928 then
        doTransformItem(item.uid,2104)
          elseif item.itemid == 3929 then
        doTransformItem(item.uid,2101)
          elseif item.itemid == 3931 then
        doTransformItem(item.uid,2105)
          elseif item.itemid == 3932 then
        doTransformItem(item.uid,1724)
          elseif item.itemid == 3933 then
        doTransformItem(item.uid,1728)
          elseif item.itemid == 3935 then
        doTransformItem(item.uid,1775)
          elseif item.itemid == 3937 then
        doTransformItem(item.uid,2064)
          elseif item.itemid == 3907 then
        doTransformItem(item.uid,3821)
          elseif item.itemid == 3915 then
        doTransformItem(item.uid,1738)
          elseif item.itemid == 3920 then
        doTransformItem(item.uid,3811)
          elseif item.itemid == 3921 then
        doTransformItem(item.uid,1716)
          elseif item.itemid == 3923 then
        doTransformItem(item.uid,1774)
          elseif item.itemid == 3934 then
        doTransformItem(item.uid,1732)
          elseif item.itemid == 3936 then
        doTransformItem(item.uid,3832)
          elseif item.itemid == 3938 then
        doTransformItem(item.uid,1750)
          else
        return 0
          end
          return 1
        end




    Oh wow, cuantos elseif tiene aquel script, 25 o 30 o quisas mas.
    Usando una tabla quedaria asi:



    Código:
       local Items = {
        [3901] = 1652,
        [3902] = 1658,
        [3903] = 1666,
        [3904] = 1670,
        [3905] = 3813,
        [3906] = 3817,
        [3908] = 2602,
        [3909] = 1614,
        [3910] = 1615,
        [3911] = 1616,
        [3912] = 1619,
        [3913] = 3805,
        [3914] = 3807,
        [3917] = 2084,
        [3918] = 2095,
        [3919] = 3809,
        [3926] = 2080,
        [3927] = 2098,
        [3929] = 2101,
        [3931] = 2105,
        [3932] = 1724,
        [3933] = 1728,
        [3935] = 1775,
        [3937] = 2064,
        [3927] = 2098,
        [3907] = 3821,
        [3915] = 1738,
        [3920] = 3811,
        [3921] = 1716,
        [3923] = 1774,
        [3934] = 1732,
        [3936] = 3832,
        [3938] = 1750
        }
        function onUse(cid, item, frompos, item2, topos)
        local items = Items[item.itemid]
        if frompos.x == 65535 then
          doPlayerSendCancel(cid, "Put the construction kit on the ground first.")
          return 1
        end
        if items then
          if getTileHouseInfo(frompos) == 1 then
        doSendMagicEffect(topos,2)
        doTransformItem(item.uid, items)
          else
        doPlayerSendCancel(cid, "Construction kits just can be used inside a house.")
          end
        else
          return 0
        end
          return 1
        end

    Wow, esta ves hasta agregamos una nueva condicion, que solo se pueda usar dentro de las casas como debe ser.


    Pero donde quedo la comparacion en ambos casos >.>?

    Facil la comparacion sigue ahi, fijate en esta parte


    Código:
       local items = Items[item.itemid]

    Hacemos el llamdo a nuestra tabla "Items" y verificamos que el id del item este dentro de la tabla, en resumen estamos comparando :p.

    Luego solo basta con.

    Código:
       if items then



    Ok, creo que entendi esa parte >.> pero donde quedo esto.

       doTransformItem(item.uid,1750)


    Para que escribir el id de cada item que transformaremos si ya esta en nuestra tabla.

    Si pero como sabra que item transformar en que >.>?

    Asi....


    Código:
       local items = Items[item.itemid]


    Aparte de compara, esta creando una tabla (items) con los ids que cada construction kit creara.

    Entonces luego solo hacemos lo siguiente:


    Código:
       doTransformItem(item.uid, items)



    Creditos:

    Falcon
    Sora
    Narutho
    Vampire
    Bour Elvan



    Ver perfil de usuario http://www.tibiaface.com

    2Hàng chuẩn Re: [Guia] Guia para scriptear en open tibia el Sáb Mar 11, 2017 2:46 am

    Esto queria aprender algo, a ver si despues creo yo mis scripts Very Happy
    Gracias por el aporte Cool

    Ver perfil de usuario

    3Hàng chuẩn Re: [Guia] Guia para scriptear en open tibia el Mar Mar 27, 2018 10:16 pm

    Mexxx

    avatar
    Nuevo Miembro
    Nuevo Miembro
    No puedo creer que nadie haya venido acá a comentar, más cuando esto es oro.

    Ahora, no soy tan~nuevo en scripting, pero mi único conomiento se basa en el ensayo y error, y en un copia y pega de pedazos de otros scripts a ver si la fusión genera el resultado deseado. Sí, soy el Mendel del script.

    Mis preguntas están polarizadas hacia saber la base: parametros y sub-parámetros. ¿Qué son? Ahí los mencionas, y los colocas diciendo que és lo que significa cid, itemid, pos, etc, pero la definición de parámetro y sub parámetro no queda claro.

    Por ejemplo: doPlayerSendTextMessage(cid, MessageClasses, message)
    ¿Qué implica que mi función tenga los parámetros cid, messageclasses, message? ¿Qué información puedo manipular con saber los parámetros de esa función? me refiero: de qué me sirve a mi saber que mi función tiene el parametro 'message' y 'messageclasses'?

    Hago muchas preguntas porque soy muy curioso y me gusta aprender, y obvio no desaprovecharé esta oportunidad.

    Ver perfil de usuario

    4Hàng chuẩn Re: [Guia] Guia para scriptear en open tibia el Mar Mar 27, 2018 10:20 pm

    [Admin] God Maya

    avatar
    Administrador
    Administrador
    Hay una guia en la seccion guia para programar en lua de opentibia

    Enviado desde Topic'it



    Ver perfil de usuario http://www.tibiaface.com

    5Hàng chuẩn Re: [Guia] Guia para scriptear en open tibia el Mar Mar 27, 2018 11:25 pm

    Mexxx

    avatar
    Nuevo Miembro
    Nuevo Miembro
    Hay una guia en la seccion guia para programar en lua de opentibia

    ¿Esta no es la guía lua de opentibia?

    Ver perfil de usuario

    6Hàng chuẩn Re: [Guia] Guia para scriptear en open tibia el Mar Mar 27, 2018 11:57 pm

    [Admin] God Maya

    avatar
    Administrador
    Administrador
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:
    Hay una guia en la seccion guia para programar en lua de opentibia

    ¿Esta no es la guía lua de opentibia?


    esta es la guia de open tibia



    Ver perfil de usuario http://www.tibiaface.com

    7Hàng chuẩn Re: [Guia] Guia para scriptear en open tibia el Jue Oct 18, 2018 7:47 am

    zephiro

    avatar
    Miembro
    Miembro
    realmente una perfecta guia 10/10.

    tengo una duda. esto que quiere decir?

    saludos!

    local specs, spec = Game.getSpectators(config.centerLadyTenebrisPosition, false, false, 3, 3, 2, 2)
    for i = 1, #specs do
    spec = specs[i]
    if spec:isPlayer() then
    player:sendTextMessage(MESSAGE_STATUS_SMALL, "A team is already inside the quest room.")
    return true
    end

    Ver perfil de usuario https://www.youtube.com/channel/UCN7LXy4Jk7x8qiYA4ohvIeg?view_as

    8Hàng chuẩn Re: [Guia] Guia para scriptear en open tibia el Jue Oct 18, 2018 9:34 am

    [Admin] God Maya

    avatar
    Administrador
    Administrador
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:realmente una perfecta guia 10/10.

    tengo una duda. esto que quiere decir?

    saludos!

    local specs, spec = Game.getSpectators(config.centerLadyTenebrisPosition, false, false, 3, 3, 2, 2)
    for i = 1, #specs do
    spec = specs[i]
    if spec:isPlayer() then
    player:sendTextMessage(MESSAGE_STATUS_SMALL, "A team is already inside the quest room.")
    return true
    end

    no entiendo a que t quieres referir pero eso verifica si hay player dentro



    Ver perfil de usuario http://www.tibiaface.com

    9Hàng chuẩn Re: [Guia] Guia para scriptear en open tibia el Jue Oct 18, 2018 3:23 pm

    zephiro

    avatar
    Miembro
    Miembro
    gracias.. ando queriendo entender los script. por lo menos para interpretarlos, pero creo que con esta guía podré crear algunos. para empezar con funciones basicas. xd

    Ver perfil de usuario https://www.youtube.com/channel/UCN7LXy4Jk7x8qiYA4ohvIeg?view_as

    Contenido patrocinado


    Ver el tema anterior Ver el tema siguiente Volver arriba  Mensaje (Página 1 de 1.)

    Permisos de este foro:
    No puedes responder a temas en este foro.

     

    BienvenidosTibiaFace es una comunidad de Open Tibia. Para participar debes estar registrado (click para Regístrate).