Ayuda en este script
| Holas Tengo un problemilla con el siguiente script, toy seguro al 99% de que siempre se me cumple la condicion if(nDado==1 && (bla,bla,bla… y no me da paso a la opcion e sentarse.Haber si sabeis por que. [code:1:0105afd6be] if(GetSpawnInCondition(NW_FLAG_IR_TABERNA)) { object oPNJ = OBJECT_SELF; string sTAG = GetTag(oPNJ); object oTaberna = GetWaypointByTag(“WP_TAB_” + sTAG); if (GetIsNight() | GetIsDawn()) { int nDado = d2(); if (nDado == 1 && ((!GetLocalInt(oPNJ,”chkcharla”) | GetLocalInt(oPNJ,”chkcharla”) == FALSE)) && (GetLocalInt(oPNJ,”chksentado”) == FALSE) | !GetLocalInt(oPNJ,”chksentado”)) { ActionMoveToObject(oTaberna,FALSE,1.0f); ActionDoCommand(SetFacingPoint(GetPosition(GetNearestObjectByTag(“punto”)))); ActionPlayAnimation(ANIMATION_LOOPING_TALK_NORMAL); ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK); ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT); SetLocalInt(oPNJ,”chkcharla”,TRUE); SetLocalInt(oPNJ,”chkpnj”,TRUE); } if (nDado == 2 && ((!GetLocalInt(oPNJ,”chksentado”) | GetLocalInt(oPNJ,”chksentado”) == FALSE)) && (GetLocalInt(oPNJ,”chkcharla”) == FALSE) | !GetLocalInt(oPNJ,”chkcharla”)) { if (!GetLocalInt(oPNJ,”chksentado”) | GetLocalInt(oPNJ,”chksentado”) == FALSE) { ActionMoveToObject(oTaberna,FALSE,1.0f); } if (GetDistanceToObject(oTaberna) <= 1.5f) { object oSilla = GetNearestObjectByTag(“Chair”, OBJECT_SELF); object oSofa = GetNearestObjectByTag(“Couch”, OBJECT_SELF); object oTaburete=GetNearestObjectByTag(“Stool”, OBJECT_SELF); object oBanco = GetNearestObjectByTag(“BancoSentable”, OBJECT_SELF); float fDistanciaSilla = GetDistanceToObject(oSilla); float fDistanciaSillon = GetDistanceToObject(oSofa); float fDistanciaTaburete = GetDistanceToObject(oTaburete); float fDistanciaBanco = GetDistanceToObject(oBanco); object oAsiento; if (fDistanciaSilla<fDistanciaSillon && fDistanciaSilla<fDistanciaTaburete && fDistanciaSilla<fDistanciaBanco) { oAsiento=oSilla; if (GetIsObjectValid(GetSittingCreature(oAsiento)) == FALSE) { ActionDoCommand(ActionMoveToObject(oAsiento,FALSE,1.0f)); ActionSit(oAsiento); SetLocalInt(oPNJ,”chksentado”,TRUE); SetLocalObject(oPNJ,”asiento”,oAsiento); } } if (fDistanciaSillon<fDistanciaSilla && fDistanciaSillon<fDistanciaTaburete && fDistanciaSillon<fDistanciaBanco) { oAsiento=oSofa; if (GetIsObjectValid(GetSittingCreature(oAsiento)) == FALSE) { ActionDoCommand(ActionMoveToObject(oAsiento,FALSE,1.0f)); ActionSit(oAsiento); SetLocalInt(oPNJ,”chksentado”,TRUE); SetLocalObject(oPNJ,”asiento”,oAsiento); } } if (fDistanciaTaburete<fDistanciaSilla && fDistanciaTaburete<fDistanciaSillon && fDistanciaTaburete<fDistanciaBanco) { oAsiento=oTaburete; if (GetIsObjectValid(GetSittingCreature(oAsiento)) == FALSE) { ActionDoCommand(ActionMoveToObject(oAsiento,FALSE,1.0f)); ActionSit(oAsiento); SetLocalInt(oPNJ,”chksentado”,TRUE); SetLocalObject(oPNJ,”asiento”,oAsiento); } } if (fDistanciaBanco<fDistanciaSilla && fDistanciaBanco<fDistanciaSillon && fDistanciaBanco<fDistanciaTaburete) { oAsiento=oBanco; if (GetIsObjectValid(GetSittingCreature(oAsiento)) == FALSE) { ActionDoCommand(ActionMoveToObject(oAsiento,FALSE,1.0f)); ActionSit(oAsiento); SetLocalInt(oPNJ,”chksentado”,TRUE); SetLocalObject(oPNJ,”asiento”,oAsiento); } } } if (GetLocalInt(oPNJ,”chksentado”) == TRUE) { object oAsiento = GetLocalObject(oPNJ,”asiento”); ActionSit(oAsiento); } SetLocalInt(oPNJ,”chkpnj”,TRUE); } } if ((GetIsDay() | GetIsDusk()) && GetLocalInt(oPNJ,”chkpnj”) == TRUE) { ClearAllActions(); object oInicio = GetWaypointByTag(“WP_INI_” + sTAG); ActionMoveToObject(oInicio); SetLocalInt(oPNJ,”chkpnj”,FALSE); SetLocalInt(oPNJ,”chksentado”,FALSE); SetLocalInt(oPNJ,”chkcharla”,FALSE); } } [/code:1:0105afd6be] Un saludo y gracias. |
Activos en NWN
Los más activos en Scripting
Subforos
Neverwinter Nights
esteeeee…. podrias decir al menos para que sirve el script? que no me conozco los tags!
Picudemus no estoy seguro, pero creo ke es bien simple. Siempre que ordenes acciones a un pnj (Actionblablabla) debes hacerlo asi por ejemplo :
[code:1:58d9ab3cd3]
AssignCommand(ObjetoKeRecibeOrden, ActionLoKeSea);
[/code:1:58d9ab3cd3]
Es decir te falta assign las acciones.
ejemplo simple sentarse en silla.
[code:1:58d9ab3cd3]
object oNpc = GetObjectByTag("aldeano1");
object oSilla = GetNearestObjectByTag("chair");
AssignCommand(oNpc, ActionSit(oSilla));
[/code:1:58d9ab3cd3]
Esto sin profundizar en el script
PD : Aragorn solo con ver el flag se sabe pa ke es
sin profundizar en detalles claro, fijate NW_FLAG_IR_TABERNA, no creo que sea para hacer un crucero por las islas fichi 
ah vale, esque asi en frio y viendo 300 lineas de codigo masusto, me recuerda a las practicas de c en la uni,
¿Qué son los NW_FLAG_no_sé_qué y pa qué se usan? Que alguien me losplique anda…
po un waypoint no?
esta parte de condiciones me parece un poco heavy… no creo que pueda chupar tanta condicion… yo aviso (que me vai a contar a mi del programilla de condiciones buaaf)
Esa condicion es correcta el ordenador resolvera las condiciones en orden de lo que ponga en los parentesis.
[code:1:a1946fb5b3]
( 3 + ((6) or (6)) + (2 or 2)
…
(3 + (6) + (2))
…
(3 + 6 + 2)
…
(9 + 2) tambien podria ser (3 + 8) no se cual hara primero pero da igual
…
11
[/code:1:a1946fb5b3]
digamos y pa que entiendas mejor, el ordenata si le pusieramos numero en vez de condicionales haria algo asi, cambiando los && y por +.
Lo que yo no entiendo picudemus son expresiones como esta :
[quote:a1946fb5b3]
(GetLocalInt(oPNJ,”chksentado”) == FALSE)|| !GetLocalInt(oPNJ,”chksentado”))
[/quote:a1946fb5b3]
Es una duda que me planteo, es decir si tu preguntas (lokesea) == FALSE ¿ no es lo mismo que ? !(lokesea).
Me explico mejor, la primera forma hace que si el valor es igual a FALSE devuelve TRUE y se cumple la condicion, la segunda devuelve TRUE si la condicion es negada osea contraria a lo que pongas, y tal cual esta indica NEGACION de un TRUE osea false.
Creo que es tonteria (es mi opinon, que yo ando verdecillo en esto tambien), repetir la misma condicion de dos maneras distintas, vendria a ser algo asi como (“Si no estas sientado” o “Si sentado no estas”), dicese o si se cumplen, se cumplen las dos, pero si no se cumplen no se cumplen ninguna por que la pregunta es la misma solo que cambiando el orden de la expresion a modo basico.
Espero que esto te sirva pa depurarlo si yo tengo razon, pero si no es asi, dime porfa por que usas las expresiones asi
que todos los dias se pue aprender algo y la verdad mas dejao mu intrigao.
Saludos.
Voy a grano:
1 Lo del AssignCommand en este caso no hace falta, ya que se usaria en el caso de querer asignar una accion a un objeto diferente, osea otro pnj,criatura,item,placeable,etc… ,de todas maneras los 2 acciones que puede realizar el pnj, osea la de sentarse o la animacion de charla, las tenia probadas por separado.
En cuanto a como me expreso en las condicionales tienes razon, como me indica Dawid en el foro de daggerdale ,con comprobar la negacion de la variable(!GetLocalInt(bla,bla), osea a mi entender que no exista, cumpla la condicion, ya posteriormente cuando en la condicion de GetIsDay se cumpla , haria un DeleteLocalInt(bla,bla) .
Bueno a mi entender la primera comprobacion mira si la variable local chksentado es igual al valor 0 (FALSE), la segunda comprueba que la variable chksentado no existe, esto ultimo lo he puesto ya que la creacion de la variables locales estan dentro de las condicionales, si no el pnj no emprenderia ninguna de las condiciones cuando se diera por 1 vez alguna de los casos.
Atary, NW_FLAG es una variable de tipo integer.
¿para que sirve? Si miras script del evento OnSpawn de cada criatura
veras :
[code:1:a8b589f9a7]
// OPTIONAL BEHAVIORS (Comment In or Out to Activate ) ******************** /> //SetSpawnInCondition(NW_FLAG_SPECIAL_CONVERSATION);
//SetSpawnInCondition(NW_FLAG_SPECIAL_COMBAT_CONVERSATION);
// etc…
[/code:1:a8b589f9a7]
NW_FLAG es una variable que tendra el valor FALSE o TRUE, este ultimo (TRUE)lo asignamos a traves de la funcion SetSpawnCondition, en el script del OnSpawn veras que por defecto todas viene descomentadas, como no hay ningun SetSpawnCondition la variable NW_FLAG_X no existe y como dice Gonar su valor es igual a FALSE.La variables NW_FLAG estan alojadas en el script NW_I0_GENERIC, veras que en el script OnSpawn se le llama con un #include.
Yo añadi:
[code:1:a8b589f9a7]
SetSpawnInCondition(NW_FLAG_IR_TABERNA);//comentada claro.
Hechamos un vistazo al NW_I0_GENERIC, y buscamos las variables.
[/code:1:a8b589f9a7]
[code:1:a8b589f9a7]
//Master Constants
int NW_FLAG_SPECIAL_CONVERSATION = 0x00000001;
int NW_FLAG_SHOUT_ATTACK_MY_TARGET = 0x00000002;
int NW_FLAG_STEALTH = 0x00000004;
int NW_FLAG_SEARCH = 0x00000008;
int NW_FLAG_SET_WARNINGS = 0x00000010;
etc…
[/code:1:a8b589f9a7]
El ¿por que? de los valores no se explicarlos, lo unico que te puedo decir es que van subiendo en potencia de 2
= 0x00000020;
= 0x00000040;
= 0x00000080;
etc.
Yo introduje aqui mi variable NW_FLAG_IR_TABERNA, lo que no se si puedes crearla en otra libreria o con otro valor,lo que tiene que respetar es NW_FLAG_lo que sea.
Bien ahora hechale un vistazo a los diferentes script de la AI del pnj, osea los de los eventos, veras que en la mayoria hay alguna condiciones que compruebam el valor de la variable NW_FLAG, en mi caso añadi NW_FLAG_IR_TABERNA al evento OnHeartbeat de mis pnjs, para que cuando sea de noche se mueva a un WP especifico y elija entre dos opciones o realizar una animacionde charla mirando a un WP o buscar el asiento mas cercano y sentarse, de dia volveria donde estubiese.
Hay algun que otro detalle mas del evnto OnSpawn pero seguro que lo iras sacandolo tu solito.
De todas maneras pongo este link, que para los que no sabemos ingles nos viene bien.
<a title=”https://neverwinter.sourceforge.net/modules.php?name=Sections&op=viewarticle&
[quote:1a0b2fe82d=”Picudemus”]
Bueno a mi entender la primera comprobacion mira si la variable local chksentado es igual al valor 0 (FALSE), la segunda comprueba que la variable chksentado no existe, esto ultimo lo he puesto ya que la creacion de la variables locales estan dentro de las condicionales, si no el pnj no emprenderia ninguna de las condiciones cuando se diera por 1 vez alguna de los casos.
[/quote:1a0b2fe82d]
Aragorn, no hagas caso a mi puntualizacion, es erronea
por eso al final deje caer el que me lo explicara. Es esto que dice picudemus, un detalle que no sabia y no se me habia ocurrido. 
Gracias picudemus por la aclaracion
como dije tos los dias se aprende algo nuevo.