CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 28 Sep 2020 20:43

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 8 mensajes ] 
Autor Mensaje
NotaPublicado: 21 Sep 2009 11:32 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Lo que sigue está en el parseCommand de la espada, pero parece que no es lo correcto.

if(verb.equalsIgnoreCase("coger") && world.getItem("barril").getContents().contains(self))

¿En qué me equivoco?


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 21 Sep 2009 11:45 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
Yo creo que esa línea está bien, efectivamente así miras si la espada está dentro del barril. Tal vez haya algún otro problema con el parseCommand que haga que no se esté ejecutando, o algo así. Igual si me pasas el código de todo el método te puedo ayudar.

_________________
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:
NotaPublicado: 21 Sep 2009 12:07 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Pues parece que ahora va bien... relativamente mira, el código completo de la espada es el que sigue:


Código:
void parseCommandOnContentsGeneric ( Mobile aPlayer , String verb , String args1 , String args2 , Vector path1 , Vector path2 , Entity obj1 , Entity obj2 ,  boolean goesFirst )

{
//aPlayer.write("\nverbo_espada " + verb + "\nargs1 " + args1 + "\nobj1 " + obj1 + "\n"   );

   //if(verb.equalsIgnoreCase("poner") && obj2.equals(world.getItem("barril")))
   //cambiamos el orden que define el obj2 para evitar que en algún caso sea null.
   if(verb.equalsIgnoreCase("poner") && (world.getItem("barril").equals(obj2)))
   {

   aPlayer.write("Has metido la espada en el barril\n Una serpiente se alza amenazante desde su fondo enseñándote su lengua bífida. Inmediatamente colocas la tapa encima. Ahora la espada está a salvo. \n ");
   world.getAbstractEntity("guion").setProperty("barril_espada", true,0);
   world.getItem("barril").setProperty("isClosed",true,0);
   end();   

   }
   if(verb.equalsIgnoreCase("coger") && world.getItem("barril").getContents().contains(self)) //world.getAbstractEntity("guion").getPropertyValueAsBoolean("espada_serpiente") == true)
   //
   { aPlayer.write("La espada está a salvo, y es mejor que se quede ahí dentro."); end();}


El problema sin embargo es que me vuelve a las andadas con el tema del barril... si meto la espada dentro, después cuando quiero sacarla me dice que no ve sentido a coger el barril. Parece que vuelve a haber un problema con un objeto null y esta vez no es obj2.

Código:
COMANDO>>  coge la espada
¿Qué pretendes coger?

COMANDO>>  saca la espada del barril
No tiene mucho sentido intentar coger el barril


Realmente el código funciona a la perfección si cambio la parte del if comentada por la que no lo está, pero me gustaría saber a qué es debido este comportamiento.

Muchas gracias


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 21 Sep 2009 12:20 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
jenesis escribió:
Realmente el código funciona a la perfección si cambio la parte del if comentada por la que no lo está, pero me gustaría saber a qué es debido este comportamiento.


Espera, ¿lo que quieres decir es que si el if es

if(verb.equalsIgnoreCase("poner") && obj2.equals(world.getItem("barril")))

el código funciona a la perfección, pero si es

if(verb.equalsIgnoreCase("poner") && (world.getItem("barril").equals(obj2)))

no funciona? ¿Seguro? Porque eso me parecería muy raro... voy a comer pero a la vuelta lo miro en más detalle.

_________________
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:
NotaPublicado: 21 Sep 2009 12:36 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Espera, ¿lo que quieres decir es que si el if es

if(verb.equalsIgnoreCase("poner") && obj2.equals(world.getItem("barril")))

el código funciona a la perfección, pero si es

if(verb.equalsIgnoreCase("poner") && (world.getItem("barril").equals(obj2)))

no funciona? ¿Seguro?


No no... esa parte del código es la que discutimos la semana pasada y funciona a la perfección tal como la ves en el código, haciendo que no compruebe el obj2, sino que lo compare con su valor.
Ahora concretamente lo que falla es el segundo if el del verbo coger.

if(verb.equalsIgnoreCase("coger") && world.getItem("barril").getContents().contains(self))

Eso da como resultado el error ya comentado, pero si en vez de utilizar el contenedor para saber si la espada está dentro del barril utilizo el valor de una propiedad que lo cambia según esté o no la espada dentro, en ese caso funciona bien.

if(verb.equalsIgnoreCase("coger") && world.getAbstractEntity("guion").getPropertyValueAsBoolean("espada_serpiente") == true)

Lo que quiero decir es que no tengo problema en ponerlo así y olvidarme de la otra alternativa, pero me gustaría saber qué es lo que falla en ese código en concreto para evitarlo en futuras ocasiones.

Muchas gracias y buen provecho. :)


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 21 Sep 2009 12:41 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
Ah, ya veo cuál es el problema... pues veo muy raro que no te funcione con lo del getContents. Yo el código lo veo perfecto. Supongo que estarás segura de que la espada está realmente en el barril, ¿no?

En cuanto salga del trabajo crearé yo una espada y un barril y probaré a programar lo mismo, no vaya a ser que sea cosa de un bug.

_________________
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:
NotaPublicado: 21 Sep 2009 13:44 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Ah, ya veo cuál es el problema... pues veo muy raro que no te funcione con lo del getContents. Yo el código lo veo perfecto. Supongo que estarás segura de que la espada está realmente en el barril, ¿no?

En cuanto salga del trabajo crearé yo una espada y un barril y probaré a programar lo mismo, no vaya a ser que sea cosa de un bug.


Sí claro, de hecho una vez metida ya no me deja cogerla porque el barril está cerrado.


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 21 Sep 2009 20:48 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
Pues acabo de reproducir el código aquí, y a mí me funciona. Eso sí, me he dado cuenta de que te faltaba cerrar una llave al final, ¿no sería ese el problema? (tal como lo tienes tú, aparece un mensaje de error al analizar las entidades).

También otro detalle, la propiedad para algo cerrado es "closed", no "isClosed" (isClosed()) es el método que se usa para mirar si está cerrado, pero la propiedad se llama "closed". Pero vamos, eso no puede ser lo que daba este fallo.

Mira a ver si era lo de la llave.

_________________
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  [ 8 mensajes ] 

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados


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