CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 23 Jul 2018 05:20

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 32 mensajes ]  Ir a página 1, 2, 3  Siguiente
Autor Mensaje
 Asunto: Sacar
NotaPublicado: 31 May 2011 15:14 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
>saca un boleto de la bolsa
>saca de la bolsa un boleto.
>saca una bolsa del boleto
>saca del boleto una bolsa


parseCommandOnContentsTwoObjects
Lista de situaciones con dos objetos:

El obj2 o el obj1 es una localidad y lo que se quiere es sacar al otro de la misma.
El obj1 está dentro del obj2
El obj2 está dentro del obj1
Uno de los dos objetos está contenido en otro, pero el contenedor no es el otro objeto.
Uno de los dos objetos está contenido en otro, pero no es el que se quiere sacar.
El objeto que se quiere sacar no está metido en ningún otro.

Igual este asunto sería mejor resolverlo con dos parseCommands y tratar por separado al obj1 y al obj2.
¿Algún consejo?

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
 Asunto: Re: Sacar
NotaPublicado: 31 May 2011 15:21 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
Yo del caso de la localidad pasaría, porque ¿qué significa "sacar objeto de localidad"? ¿Adónde lo mandas? ¿A una localidad adyacente cualquiera? ¿Mandas al jugador también para allí? Yo no creo que nadie vaya a poner "sacar mesa de habitación", en todo caso querrá empujarla hacia algún sitio, digo yo... y si realmente alguien pone algo tan inconcreto tampoco hay una forma genérica de implementar eso porque puede significar mil cosas según el contexto de la aventura (estamos en lo de siempre).

Para los otros casos, se trataría efectivamente de mirar si cada uno de los objetos está dentro del otro, o si por el contrario ninguno de los dos está dentro del otro.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
 Asunto: Re: Sacar
NotaPublicado: 31 May 2011 15:37 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Yo del caso de la localidad pasaría, porque ¿qué significa "sacar objeto de localidad"? ¿Adónde lo mandas? ¿A una localidad adyacente cualquiera? ¿Mandas al jugador también para allí? Yo no creo que nadie vaya a poner "sacar mesa de habitación", en todo caso querrá empujarla hacia algún sitio, digo yo... y si realmente alguien pone algo tan inconcreto tampoco hay una forma genérica de implementar eso porque puede significar mil cosas según el contexto de la aventura (estamos en lo de siempre).


Precisamente ése uno de los casos que he resuelto sin problema.

Citar:
Para los otros casos, se trataría efectivamente de mirar si cada uno de los objetos está dentro del otro, o si por el contrario ninguno de los dos está dentro del otro.


No es tan simple, realmente ya lo tenía hecho y funcionaba a la perfección hasta que me planteé el caso de que el jugador meta la pata y lo escriba mal.

Si el jugador escribe:
>sacar un boleto de la bolsa
o
>sacar de la bolsa un boleto
Perfecto.
Pero si el jugador se equivoca y pone:
>sacar una bolsa del boleto
o
>saca del boleto una bolsa.
¿...?
Age sacará igualmente el contenido del contenedor
Bueno, es una especie de parser robusto aplicado a los contenedores. :lol:

No he hecho la prueba con la solución que utilicé en 15 meses, allí usé el parserCommand genérico, tal vez sería conveniente seguir en esa línea... :roll:

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
 Asunto: Re: Sacar
NotaPublicado: 31 May 2011 15:58 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
¿Te parece malo que el jugador ponga "sacar una bolsa del boleto" y el resultado sea sacar un boleto de la bolsa? A mí me parece bueno, hay un 99.9% de probabilidades de que eso fuese realmente lo que el jugador quería decir.

Por supuesto, siempre podrías mirar las preposiciones; pero yo creo que sería contraproducente (porque se podría poner "sacar boleto bolsa", "sacar boleto d bolsa" (lenguaje sms), etc.)

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
 Asunto: Re: Sacar
NotaPublicado: 31 May 2011 15:59 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
No, no me parece malo, pero bueno mejor si se hubiera podido controlar también eso.

Otra cosa, estoy un poco confundida, he intentando simplificar el código y me ha comenzado a fallar todo.
A ver...
En parseCommandOnContentsTwoObjects el obj1 siempre es el primero objeto mencionado y el obj2 siempre es el segundo ¿no?
O sea, si alguien pone:
>Sacar hoja de la cesta.
El obj1 será la hoja y el obj2 la cesta.
Y si alguien pone:
>Saca de la cesta una hoja
El obj1 será la cesta y el obj2 será la hoja
¿No?

Es que me está tirando unos nulls tremendos y ahora me doy cuenta de que si pongo...
aCreature.write("obj1 y obj2 " +obj1+" y "+obj2+"\n");
Me da como salida esto:
obj1 y obj2 [ eu.irreality.age.Item:30000006:la cesta ] y [ eu.irreality.age.Item:30000006:la cesta ]
¿No funciona como yo pensaba?

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
 Asunto: Re: Sacar
NotaPublicado: 31 May 2011 16:19 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
Supongo que te habrás confundido en algo en la pregunta porque en el parseCommandOnContentsTwoObjects no existen parámetros obj1 y obj2.

De todos modos, el motivo de que te salgan la cesta y la cesta es lo que ya hemos hablado un montón de veces, que los onContents no sólo se ejecutan con los objetos que ha tecleado el jugador sino también para los que los contienen. Si sólo quieres trabajar sobre los objetos que teclea el jugador, tienes que comprobar que obj1 sea igual a path1.get(0) y obj2 igual a path2.get(0); si te acuerdas esto es lo que hacías en "Meses".

Alternativamente, también puedes probar la funcionalidad que metí hace algunas versiones, por la cual si pones la propiedad "containedItemsInScope" del jugador a true, todos los parseCommands (sin necesidad de ser onContents) se ejecutan también sobre items contenidos (véase viewtopic.php?f=31&t=4686).

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
 Asunto: Re: Sacar
NotaPublicado: 31 May 2011 16:31 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Supongo que te habrás confundido en algo en la pregunta porque en el parseCommandOnContentsTwoObjects no existen parámetros obj1 y obj2.


void parseCommandOnContentsTwoObjects ( Mobile aCreature , String verb , String args1 , String args2 , Vector path1 , Vector path2 , Entity obj1 , Entity obj2 )

Hmmm... yo me refiero a ése en concreto.


Citar:
De todos modos, el motivo de que te salgan la cesta y la cesta es lo que ya hemos hablado un montón de veces, que los onContents no sólo se ejecutan con los objetos que ha tecleado el jugador sino también para los que los contienen. Si sólo quieres trabajar sobre los objetos que teclea el jugador, tienes que comprobar que obj1 sea igual a path1.get(0) y obj2 igual a path2.get(0); si te acuerdas esto es lo que hacías en "Meses".


Sí, eso es lo que estaba tratando de modificar porque pensaba que ya no era necesario, vamos que todo iba en el mismo pack de los famosos "nulls" y que eso solo ocurría con los generic.
En fin, volveré a hacer las comprobaciones oportunas. :)


Citar:
Alternativamente, también puedes probar la funcionalidad que metí hace algunas versiones, por la cual si pones la propiedad "containedItemsInScope" del jugador a true, todos los parseCommands (sin necesidad de ser onContents) se ejecutan también sobre items contenidos (véase viewtopic.php?f=31&t=4686).


Ah, eso suena interesenta, le echaré una ojeada. :D

Lo que quiero es simplificar el código al máximo, porque a mayor simplicidad más fácil de entender será, o eso espero. :roll:

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
 Asunto: Re: Sacar
NotaPublicado: 31 May 2011 16:41 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
jenesis escribió:
void parseCommandOnContentsTwoObjects ( Mobile aCreature , String verb , String args1 , String args2 , Vector path1 , Vector path2 , Entity obj1 , Entity obj2 )

Hmmm... yo me refiero a ése en concreto.

Ah, ya sé lo que pasa, es que me pareció que te referías a métodos que se definían en la cosa, pero te refieres al del mundo. El del mundo sí que tiene parámetros obj1 y obj2. En todo caso, la respuesta a tu problema es lo que te dije antes sobre los paths y demás.

jenesis escribió:
Sí, eso es lo que estaba tratando de modificar porque pensaba que ya no era necesario, vamos que todo iba en el mismo pack de los famosos "nulls" y que eso solo ocurría con los generic.
En fin, volveré a hacer las comprobaciones oportunas. :)

Y es cierto que el tema de los nulls sólo viene con los generics. Pero es que en tu ejemplo que yo vea ninguno de los dos objetos es null. Simplemente, ambos son la cesta, cosa que se explica por el motivo que dije antes.

Son dos problemas distintos:

Pueden venir objetos null -> sólo en los generics, solución: comprobar no nulidad.
Pueden venir objetos que contienen aquellos a los que se refirió el usuario, en lugar de venir estos últimos -> en los onContents (generic o no), solución: comprobación con el path (o usar esa otra alternativa que he dicho).

Citar:
Ah, eso suena interesenta, le echaré una ojeada. :D

Yo creo que tal como sueles hacer tú, que usas los onContents para todo o casi todo y en particular los usas con los objetos contenidos a los que se refirió el jugador, debería serte útil.

Eso sí, ten en cuenta que esa propiedad es un todo o nada, es decir, hace que todos los parseCommands actúen también sobre objetos contenidos. Así que si tienes esa propiedad puesta y quieres definir acciones que no actúen sobre objetos contenidos, tendrás que hacer comprobaciones. Digamos que quitas trabajo de un sitio y lo pones en otro. Si casi todas tus acciones se pueden ejecutar sobre objetos contenidos, el trabajo que te ahorras es más importante que el que añades; y viceversa.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
 Asunto: Re: Sacar
NotaPublicado: 31 May 2011 16:47 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Eso sí, ten en cuenta que esa propiedad es un todo o nada, es decir, hace que todos los parseCommands actúen también sobre objetos contenidos. Así que si tienes esa propiedad puesta y quieres definir acciones que no actúen sobre objetos contenidos, tendrás que hacer comprobaciones. Digamos que quitas trabajo de un sitio y lo pones en otro. Si casi todas tus acciones se pueden ejecutar sobre objetos contenidos, el trabajo que te ahorras es más importante que el que añades; y viceversa.


Sí, lo entiendo, sopesaré qué me es más práctico. :)

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
 Asunto: Re: Sacar
NotaPublicado: 02 Jun 2011 09:32 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Está claro que sigo sin enterarme. :oops:
Estoy usando el nuevo método containedItemsInScope() y he creado y añadido como alias de "sacar" a la acción "misacar".

Código:
void parseCommandTwoObjects ( Mobile aCreature , String verb , String args1 , String args2 ,  Entity obj1 , Entity obj2  )
{
aCreature.write("obj1 = " +obj1+"\n");   
aCreature.write("obj2 = " +obj2+"\n");
String args = args1+args2;

 
 if(equals(verb,"misacar"))
   { 
     
     
         
    //el obj1 está dentro del obj2
            if (obj2.getContents().contains(obj1) )
             { aCreature.forceCommand("Coger "+obj1.getTitle());
                  aCreature.write("Tendría que haber cogido el "+obj1.getTitle()+"");
                        end();}
                                   
                                   
     //el obj2 está dentro del obj1   
            if (obj1.getContents().contains(obj2) )
             { aCreature.forceCommand("Coger "+obj2.getTitle());
                  aCreature.write("Tendría que haber cogido el "+obj2.getTitle()+"");
                        end();}
                                   
                   
              else{aCreature.write("Eso no está ahí dentro...\n");
              end();}
                        }


Citar:
>m
Es la intro del juego.
Aquí hay una cesta, un caldero y un mancha.

>mira dentro de la cesta
args = dentro de la cesta
Dentro de la cesta puedes ver una hoja..

>mira dentro del caldero
Es un caldero

>saca la hoja del caldero
obj1 = [ eu.irreality.age.Item:30000007:la hoja ]
obj2 = [ eu.irreality.age.Item:30000005:el caldero ]
Spoiler: Mostrar
bsh.TargetError found at parseCommandTwoObjects() executed from world, command was misacarla hojadel caldero, entity number 30000005, first object was 30000007, error was Sourced file: inline evaluation of: ``parseCommandTwoObjects( arg0, arg1, arg2, arg3, arg4, arg5);'' : at Line: 228 : in file: inline evaluation of: ``//world include("lib/noaccents.bsh"); String preprocessCommand ( Player jugado . . . '' : .contains ( obj2 )

Target exception: java.lang.NullPointerException: Attempt to invoke method contains on null value
**
Error: java.lang.NullPointerException: Attempt to invoke method contains on null value
Location: inline evaluation of: ``//world include("lib/noaccents.bsh"); String preprocessCommand ( Player jugado . . . ''
Line: 228
Offending text: .contains ( obj2 )
Message: Sourced file: inline evaluation of: ``parseCommandTwoObjects( arg0, arg1, arg2, arg3, arg4, arg5);''
Detailed trace: Sourced file: inline evaluation of: ``parseCommandTwoObjects( arg0, arg1, arg2, arg3, arg4, arg5);'' : at Line: 228 : in file: inline evaluation of: ``//world include("lib/noaccents.bsh"); String preprocessCommand ( Player jugado . . . '' : .contains ( obj2 )

Target exception: java.lang.NullPointerException: Attempt to invoke method contains on null value


Desde parseCommand ¿De dónde quieres sacar eso?


Si el obj1 es la hoja y el obj2 es el caldero ¿de dónde ha salido ese null?

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
 Asunto: Re: Sacar
NotaPublicado: 02 Jun 2011 10:15 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
De que la hoja no es un contenedor, y por lo tanto no tiene contenido, y por lo tanto getContents() devuelve null.

Se podría hacer que devolviese un inventario vacío en lugar de null, pero es que ésa es la forma de distinguir entre objetos contenedores y no contenedores: los contenedores siempre tienen un inventario de contenidos (aunque esté vacío), y los no contenedores no lo tienen (o sea, que devuelves null).

Así que necesitarías hacer algo como: if ( obj1.getContents() != null && obj1.getContents().contains(obj2) )...

Y viceversa para obj2 y obj1.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
 Asunto: Re: Sacar
NotaPublicado: 02 Jun 2011 10:54 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
De que la hoja no es un contenedor, y por lo tanto no tiene contenido, y por lo tanto getContents() devuelve null.

Se podría hacer que devolviese un inventario vacío en lugar de null, pero es que ésa es la forma de distinguir entre objetos contenedores y no contenedores: los contenedores siempre tienen un inventario de contenidos (aunque esté vacío), y los no contenedores no lo tienen (o sea, que devuelves null).

Así que necesitarías hacer algo como: if ( obj1.getContents() != null && obj1.getContents().contains(obj2) )...

Y viceversa para obj2 y obj1.


Lo había pensado, pero me negaba a creer que ni dejando de usar el onContents los nulls me siguieran persiguiendo. xDDD

Creo que voy a hacer lo siguiente.
No me fue tan mal con el onContentsGeneric en 15 meses, así que voy a usar ese parseCommand solo para las acciones "misacar".

Ahora mismo si quito "misacar" y dejo todo tal cual viene de fábrica en AGE, ocurre lo siguiente, si la hoja está dentro de la cesta y yo intento sacarla del caldero, lo que hago es coger el caldero, da lo mismo que containedItemsInScope esté a falso o a true, es como si la hoja no existiera, si bien el parser de dos objetos la marca como obj1.

Para mí lo más simple sería tratar directamente con las acción "sacar" de age, pero esa acción no existe, es un alias de coger y por eso me he visto obligada a crear ese "misacar".

La acción "coger" de un contenedor en AGE es compleja se haga con el parseCommand que se haga, da nulls y hay que hacer comprobaciones se haga con el parserCommand que se haga, así que de ahogados al río, me vuelvo a mis generic, o eso o me lo planteo de otro modo.
Vamos, que estoy a punto de hacerlo a mano desde cero, lo bueno de esto último será que al hacerlo yo sabré como funciona realmente. :lol:

El caso es que tengo que encontrar un modo de terminar con esta historia.
En 15 meses el tema de los contenedores funcionaba "casi" perfectamente y esa es la razón de que no intente con el libro, que aquí no quiero la más mínima duda y ese "casi" se me hace grande. :lol:
Sí, soy terca... no puedo evitarlo. :oops:

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
 Asunto: Re: Sacar
NotaPublicado: 02 Jun 2011 11:05 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
jenesis escribió:
Lo había pensado, pero me negaba a creer que ni dejando de usar el onContents los nulls me siguieran persiguiendo. xDDD

A ver, es que tú les has cogido manía a los pobres nulls... :lol:

Los valores nulos en programación no son una cosa mala, ni representan errores ni nada así. Son simplemente una herramienta de programación más, para distinguir cuándo algo no existe. Por ejemplo:

- getContents() a un baúl con dos objetos -> te devuelve una lista con dos objetos, para indicar que son su contenido.
- getContents() a un baúl vacío -> te devuelve una lista vacía, para indicar que el baúl no tiene nada, pero podría tener cosas (podrías insertar objetos en esa lista).
- getContents() a una moneda de oro -> te devuelve null, para indicar que no es que sea un contenedor vacío, es que directamente no tiene sentido que ese objeto tenga nunca contenido. O sea, no es que la lista de contenidos esté vacía, es que no hay tal lista.

Cuando uno programa en java (o en cualquier otro lenguaje que tenga valores nulos, como C, C#, Pascal... bueno, casi todos) lo único que tiene que hacer es saber en qué ocasiones una expresión puede tomar valor nulo, y comprobarlo para no hacer accesos a campos o métodos de esos valores nulos (si no, aparece la excepción que aquí es NullPointerException, y en otros lenguajes saldría como Access Violation, Segmentation Fault, etc.).

jenesis escribió:
Ahora mismo si quito "misacar" y dejo todo tal cual viene de fábrica en AGE, ocurre lo siguiente, si la hoja está dentro de la cesta y yo intento sacarla del caldero, lo que hago es coger el caldero, da lo mismo que containedItemsInScope esté a falso o a true, es como si la hoja no existiera, si bien el parser de dos objetos la marca como obj1.

Lo de containedIntemsInScope sólo afecta a los parseCommands definidos por el usuario, no afecta a los comportamientos por defecto.

De todos modos, esto que dices no es el comportamiento previsto... en el comportamiento por defecto, tanto con containedItemsInScope como sin él, "sacar hoja de caldero" debería traducirse por "coger hoja de caldero", y eso debería funcionar cogiendo la hoja que está dentro del caldero, porque ese comportamiento por defecto "coger X de Y" está hecho para tener en cuenta que X debería estar dentro de un contenedor. Miraré cuando tenga tiempo a ver si es que hay un bug (¿o será que también has redefinido la acción coger y no has tenido en cuenta coger X de Y?).

jenesis escribió:
El caso es que tengo que encontrar un modo de terminar con esta historia.
En 15 meses el tema de los contenedores funcionaba "casi" perfectamente y esa es la razón de que no intente con el libro, que aquí no quiero la más mínima duda y ese "casi" se me hace grande.

¿Por qué "casi"? ¿Qué es lo que no funcionaba a tu gusto en "Meses"?

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
 Asunto: Re: Sacar
NotaPublicado: 02 Jun 2011 11:31 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 24 Dic 2010 14:37
Mensajes: 907
Al-Khwarizmi escribió:
jenesis escribió:
Ahora mismo si quito "misacar" y dejo todo tal cual viene de fábrica en AGE, ocurre lo siguiente, si la hoja está dentro de la cesta y yo intento sacarla del caldero, lo que hago es coger el caldero, da lo mismo que containedItemsInScope esté a falso o a true, es como si la hoja no existiera, si bien el parser de dos objetos la marca como obj1.


De todos modos, esto que dices no es el comportamiento previsto... en el comportamiento por defecto, tanto con containedItemsInScope como sin él, "sacar hoja de caldero" debería traducirse por "coger hoja de caldero", y eso debería funcionar cogiendo la hoja que está dentro del caldero, porque ese comportamiento por defecto "coger X de Y" está hecho para tener en cuenta que X debería estar dentro de un contenedor. Miraré cuando tenga tiempo a ver si es que hay un bug (¿o será que también has redefinido la acción coger y no has tenido en cuenta coger X de Y?).


Arriba
 Perfil  
 
 Asunto: Re: Sacar
NotaPublicado: 02 Jun 2011 11:33 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
Ahhh, vale, interpreté mal. Gracias por la puntualización.

Efectivamente la acción de AGE no contempla un mensaje específico el caso de "sacar X de Y" cuando X realmente está en Z, y no en Y. Eso hay que personalizárselo, al menos por el momento.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 32 mensajes ]  Ir a página 1, 2, 3  Siguiente

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
cron
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM