¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.



 
ÍndicePortalBuscarÚltimas imágenesRegistrarseConectarse

 

 Como scriptear, en 3 niveles

Ir abajo 
2 participantes
AutorMensaje
Luisko
Admin
Admin
Luisko


Masculino
Cantidad de envíos : 1907
Edad : 30
Localización : Donde haya rock, sexo y minas
Fecha de inscripción : 16/12/2007

Como scriptear, en 3 niveles Empty
MensajeTema: Como scriptear, en 3 niveles   Como scriptear, en 3 niveles Icon_minitimeLun Mar 03, 2008 1:45 pm

Nivel 1
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 debem 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 =P

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.

Créditos: Falcon


Última edición por Luisko el Lun Mar 03, 2008 2:02 pm, editado 1 vez
Volver arriba Ir abajo
https://www.youtube.com/profile?user=Luiskorock
Luisko
Admin
Admin
Luisko


Masculino
Cantidad de envíos : 1907
Edad : 30
Localización : Donde haya rock, sexo y minas
Fecha de inscripción : 16/12/2007

Como scriptear, en 3 niveles Empty
MensajeTema: Re: Como scriptear, en 3 niveles   Como scriptear, en 3 niveles Icon_minitimeLun Mar 03, 2008 1:51 pm

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

Guia escribió:


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.

Guia escribió:

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.

Script de Tiempo->

Guia escribió:


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)

-- Continua Script --

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.
Script de Azar

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

Un script sin azar

Guia escribió:

function onUse(cid,item,frompos,item2,topos)

doPlayerAddItem(cid,item)

end


Ahora le añadiremos azar

Guia escribió:

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.[/quote]
Volver arriba Ir abajo
https://www.youtube.com/profile?user=Luiskorock
Luisko
Admin
Admin
Luisko


Masculino
Cantidad de envíos : 1907
Edad : 30
Localización : Donde haya rock, sexo y minas
Fecha de inscripción : 16/12/2007

Como scriptear, en 3 niveles Empty
MensajeTema: Re: Como scriptear, en 3 niveles   Como scriptear, en 3 niveles Icon_minitimeLun Mar 03, 2008 1:58 pm

Nivel 3
Con esta guia aprenderemos a hacer pocas cosas, pero muy útiles.

Empiezo ya con mi guia.

Las Funciones propias


Me refiero a crear funciones, que realmente no existen en LUA, por ejemplo esta función.

Código:
function popUp(params)

Y me direis, para que sirve esto?

Pues fácil, para poder usar AddEvent de una manera sencilla que nos hará el trabajo de los scripters, diez veces mas fácil y mas ordenado!

¿Como hacer una función propia?

Pues sencillamente le ponemos el nombre que queramos

Código:
function popUp(params)

Y despues le ponemos los párametros (params)

Código:
function popUp(params)


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

----- continua el script -------

params = {cid = cid, pos = pos,}
addEvent(popUp, 200, params)
end


Es fácil al principio, pero cuando son ya mas de seis parámetros, se complica la cosa, ya que te tienes que acordar de todos, por eso recomiendo apuntar todas las funciones propias y sus parámetros en un folio sucio.


Las Variables de Lugar II

En la guia de nivel dos, yo ya expliqué básicamente como usar una función de lugar, pero no expliqué todo, porque hasta a mi, que controlo mas o menos LUA me cuesta usar estas cosas.

local pos = params.pos

Direis, OH QUE TIENE DIFERENTE A UN getPlayerPosition?

Que local, funciona cada vez que el jugador se mueve, y eso? Me explico, si un jugador esta en la posición 1000x 1000y 7z, y se mueve a la izquierda, params.pos será este, 999x 1000y 7z, para que sirve esto? Pues para el script de la alfombra básicamente, sólo sirve para eso :).

Lo usamos como local pos = params.pos y cada vez que nos movamos, la alfombra se podrá mover con nosotros, y la razón, es porque gracias al local pos, sabemos en que posición está el player siempre. Todo depende de la imaginación del player, a ver si tenemos algun futuro scripter de LUA que haga algun script nuevo ;).
Volver arriba Ir abajo
https://www.youtube.com/profile?user=Luiskorock
Kbzaaa
Admin
Admin
Kbzaaa


Femenino
Cantidad de envíos : 2653
Edad : 32
Localización : en camboya
Fecha de inscripción : 26/12/2007

Como scriptear, en 3 niveles Empty
MensajeTema: Re: Como scriptear, en 3 niveles   Como scriptear, en 3 niveles Icon_minitimeLun Mar 03, 2008 2:20 pm

esa wea me sirve =D Shocked
Volver arriba Ir abajo
http://www.petardas.com
Luisko
Admin
Admin
Luisko


Masculino
Cantidad de envíos : 1907
Edad : 30
Localización : Donde haya rock, sexo y minas
Fecha de inscripción : 16/12/2007

Como scriptear, en 3 niveles Empty
MensajeTema: Re: Como scriptear, en 3 niveles   Como scriptear, en 3 niveles Icon_minitimeLun Mar 03, 2008 2:24 pm

:D
Volver arriba Ir abajo
https://www.youtube.com/profile?user=Luiskorock
Contenido patrocinado





Como scriptear, en 3 niveles Empty
MensajeTema: Re: Como scriptear, en 3 niveles   Como scriptear, en 3 niveles Icon_minitime

Volver arriba Ir abajo
 
Como scriptear, en 3 niveles
Volver arriba 
Página 1 de 1.

Permisos de este foro:No puedes responder a temas en este foro.
 :: Tibia :: Guias Ot-
Cambiar a: