Novedades

Minitutorial introductorio al scripting

Wallack

Pornorroleador en sequía
Registrado
13/12/08
Mensajes
569
Edad
40
Buenas!

Hace tiempo me propuse algo parecido y siempre por falta de tiempo, lo voy dejando. Ahora como tengo que escribir una historia para mi nuevo personaje, y no se me ocurre, pues digo, voy a escribir esto otro, que también es una historia XD Además, como me apetece contribuir bien con más cosas y quedar bien, que me quieran y todo eso.

Alguien que haya programado puede aprender por su cuenta, si ha programado algo de más de 10 líneas XD pero para quién ni si quiera haya programado nada, vamos a intentar hacer entender, un poco por encima, como funciona todo, desde lo básico hasta lo más avanzado (siempre dentro de lo básico eh xD).

Empezaremos con pseudocódigo, muy útil para los que no han programado nunca. El pseudocódigo es código en lenguaje puramente humano, para que nos entendamos, un programa en pseudocódigo que sume dos números y luego nos imprima por pantalla el resultado sería:

imprime por pantalla suma de numero1 + numero2

Como véis es muy sencillo, eso, traducido a un lenguage como podría ser php sería:

echo $numero1 + $numero2;
o también
print $numero1 + $numero2;

($numero1 y $numero2 son variable que pueden contener cualquier valor).

Esto es solo para que os hagáis una idea. Vamos a hacer ahora en pseoducódigo un script de NWN que de 1000 de experiencia a quién haga clic en un ubicado cualquiera.

Aprovecho para introduciros los "niveles" en cuanto a lenguajes de programación. Un lenguaje de alto nivel, sería un lenguaje más humano, más legible, con menos líneas a la hora de programar una funcionalidad y que hace o presupone cosas por nosotros para ahorrarnos trabajo.

En muy alto nivel, el script que queremos sería:

Da 1000 experiencia

Si bajamos un poco de nivel sería algo así:

Da 1000 experiencia a jugador

Un poquito más abajo:

Da 1000 experiencia al jugador que clico en el ubicado

Bien, ya hemos hecho nuestro primer script en pseudocódigo! Vamos a ir un poco más allá, vamos a hacer el pseudocódigo más código con la introducción de variables.

Las variables, son "palabras" que pueden contener información que puede variar con el tiempo. En pseudocódigo vamos a utilizar corchetes para rodearlas e identificarlas (no hay sintaxis oficial del pseudocódigo). Para ello vamos al ejemplo:

guarda en [jugador] jugador que clico el ubicado
da 1000 experiencia a [jugador]

¿Se ve un poco mejor? ¿Qué tal si añadimos un condicional? ¡Venga, vamos a ello!

guarda en [jugador] jugador que clico el ubicado
es [jugador] un jugador?
si se cumple -> da 1000 de experiencia a [jugador]
si no se cumple -> no hagas nada
fin condicional

¡Hey, parece más currado ahora! Pero el no hagas nada no me gusta. ¡Vamos a quitarlo!

guarda en [jugador] jugador que clico el ubicado
es [jugador] un jugador?
si se cumple -> da 1000 de experiencia a [jugador]
fin condicional

Así de fácil, basta con no añadir el si no se cumple para hacerlo.
Ahora ¿qué os parece si usamos algo más de lenguaje de programación para ir adaptándonos? ¿os parece bien? ¡pues os jodéis! vamos a ver algo antes, muy importante en el scripting de nwn.

Os podría decir, sin más, que en el lenguaje de programación de NWN para usar variables hay que declararlas primero, pero intentaré ir más allá.

Imaginaros la memoria del ordenador como una enorme ciudad. Cada variable es una casa, una vivienda, con su contenido. Una variable tiene dos cosas (el scripting solo usa una) el nombre, que podría ser "casa de wallack" y la dirección de memoria que podría ser "calle falsa 123". Pues bien, en el scripting del NWN que podríamos considerar como lenguaje de medio-alto nivel, requiere que se declaren las variables antes para poder utilizarlas, es decir, reservamos la dirección "calle falsa 123" para que se conozca como "casa de wallack" y de ese modo, esa dirección esté reservada para nosotros.

¿Qué pasa si no lo hacemos? que podríamos estar pisando datos de otros programas, del sistema operativo ... esto sería un mundo del que hablar pero prefiero que tengáis la idea de porqué hacemos las cosas un poquitín antes de empezar.

Vamos a ello:

declara [jugador] como variable
guarda en [jugador] jugador que clico el ubicado
es [jugador] un jugador?
si se cumple -> da 1000 de experiencia a [jugador]
fin condicional

Ya tenemos declarada nuestra variable y la podemos usar. ¿Ya está? ¡Venga, casi, vamos un poco más!

Ahora hablaremos del tipado de datos ¿que cosa tan rara? nada más lejos, el tipado de datos o de variables es para eso, para tipar o clasificar las variables, esto es, que cada variable es de un tipo y no se puede cambiar ese tipo (en realidad sí pero no en nwn scripting y no vamos a hablar de ello).

Vamos a tipar nuestra variable:

declara [jugador] como variable de jugador
guarda en [jugador] jugador que clico el ubicado
es [jugador] un jugador?
si se cumple -> da 1000 de experiencia a [jugador]
fin condicional

Joder ¡qué fácil! ¿y para que sirve esto? realmente, no se trata de servir sino de la sintaxis del lenguaje. Un lenguaje cont ipado de datos te obliga a decir para qué serán cada variables. En nuestro caso, [jugador] almacenará jugadores. ¿qué más podría almacenar? pues números, textos, numeros decimales, matrices, imágenes, ficheros ... pero ¿en neverwinter? pues podría numeros, localizaciones, objetos (hablaremos de ello), efectos ...

¿Y jugadores? no has dicho jugadores ¿como guardo jugadores? los jugadores en el NWN son ... OBJETOS ... ¡SI SEÑOR! ¡SOMOS OBJETOS EN MANOS DE LOS DMS! en realidad, la palabra correcta sería entidades, pero los ubicados también y las áreas también, pero ya hablaremos.

declara [jugador] como variable de objeto
guarda en [jugador] jugador que clico el ubicado
es [jugador] un jugador?
si se cumple -> da 1000 de experiencia a [jugador]
fin condicional

Mmh, ya casi lo tenemos ¿como hacemos esto en el NWN? doy por sentado que sabéis hacer un área con ubicados, si no, os mato!

En pseudocódigo, en el ubicado, escribiríamos este script en el evento "onUsed" o "al ser usado" en español.

¡Eventos! ¿Qué es eso? ¡SATAN!

Tranquilidad, el nwnscripting es un lenguaje orientado a eventos. Todos los scripts están desencadenados o disparados (triggered) por algo, en este caso, eventos. Antes de pasar al evento, vamos a traducir un poco más nuestro código, adaptándolo al NWN:

objeto [jugador];
[jugador] = damejugadorqueclico;
if (esjugadorhumano([jugador]) == TRUE)
{
daexperiencia(1000, [jugador]);
}

Ostias, como ha cambiado, vamos por partes.

En NWN cada línea tiene que acabar en un ; para que el compilador (quien traduce el código) lo entienda. Vamos por líneas:

objeto [jugador];

Técnicamente los corchetes no los usaríamos más, pero es igual, vamos a ello. En nwnscript se añade en primer lugar el tipo de variable (objeto, numero, efecto) y después el nombre. Realmente lo correcto y traducido a nwn sería:

object jugador;

¿A que parece fácil? si queremos más, o una por línea o sino, esta magia también es posible:

object jugador1, jugador2, jugador3;
object jugador4;

Joder, como mola, ya sabemos declarar objetos de verdad. Ahora, vamos a hacer las cosas bien, notación húngara! O así me lo enseñaron a mi ¿qué es? es sencillamente, esto:

object oJugador1, oJugador2;

¿Habéis visto esa o delante? sirve, para que rápidamente de un vistazo, sepamos que es una variable de tipo object. Imaginemos números (int en el nwnscript) usaríamos una i, por ejemplo:

int iExperiencia;

A que mola, ahora, vamos a hacerlo mejor:

int iExperiencia = 1000;

Tenemos declarada Y ASIGNADA al mismo tiempo una variable, en la cual, guardaremos la experiencia que después queremos dar (esta no está en el pseudocódigo). Vamos a seguir.

[jugador] = damejugadorqueclico;

Aquí llamamos a una función interna del NWN que se llama damejugadorqueclico; Esta me la he inventado pero estamos en pseudocódigo. ¿Cómo funciona esta función por dentro para identificar al jugador? ¡NO LO SÉ Y LO MEJOR ES QUE NO ME IMPORTA! Porque nosotros tenemos un listado de las funciones que queremos y sabemos que necesitan y que nos devuelven.

¡Espera, vas demasiado rápido! ¿Qué es una función?

¿Se os ocurre alguna función? ¿y algún parámetro?

No entraré en muchos detalles de diferenciar procedimientos, funciones y métodos pero diré que una función, es una orden u acción que a veces requiere argumentos y otras no. A veces devuelve valores y a veces no. Ejemplos en pseudocódigo:

fecha(); esta función nos devolvería la fecha actual
fecha(+1); esta función por ejemplo, nos devolvería la fecha con un día sumado.
fecha(+1, MONTH); nos devolvería la fecha con un mes sumado.

¿Véis? parece fácil, pues eso es una función, vamos con nuestro ejemplo:

[jugador] = damejugadorqueclico;

Como antes lo habíamos llamado oJugador en plan correcto y programador pro, pues vamos a ello:

oJugador = damejugadorqueclico;

Vaya, ¿como sería esta función en el nwn? si entramos en el aurora toolset, en el editor de guiones (scripts) tendremos uno en blanco con un listado a la derecha de Funciones, Variables, Constantes y Plantillas. ¿Qué es cada cosa? ... en otro momento, nos interesan las funciones.

Vamos a filtrar por click ... ostias solo salen 2:

GetClickingObject
GetPlaceableLastClickedBy

Así a bote pronto parece que pega mejor la primera ... ¿como lo sabré? fácil, te pones encima y debajo, aparece una descripción:

// Use this in a trigger's OnClick event script to get the object that last
// clicked on it.
// This is identical to GetEnteringObject.
// GetClickingObject() should not be called from a placeable's OnClick event,
// instead use GetPlaceableLastClickedBy();
object GetClickingObject()

¿No sabéis inglés? pues toca aprenderlo porque sino, será difícil programar. Esta función dice que se ejecuta en el evento onclick de un trigger ... ¿qué son triggers? vaya dice que es identica a get entering object ... espera, dice que no debe ser llamada desde el evento onclick de un ubicado, que en su lugar uses la otra. Vamos a ver que dice la otra:

// Get the last object that default clicked (left clicked) on the placeable object
// that is calling this function.
// Should only be called from a placeables OnClick event.
// * Returns OBJECT_INVALID if it is called by something other than a placeable.
object GetPlaceableLastClickedBy()

Parece la elegida. Dice que devuelve el último objeto que clicó en el ubicado. Vamos a usarla, identifiquemos sus partes en la definición de la función:

object GetPlaceableLastClickedBy()

object significa que devuelve un objeto.
El paréntesis vacío indica que no requiere ningún dato para funcionar. Vamos a ello:

oJugador = GetPlaceableLastClickedBy();

Joder como mola, vamos a juntar lo que tenemos:

object oJugador;
oJugador = GetPlaceableLastClickedBy();

Bien, sigamos con nuestro pseudocódigo y su transformación:

if (esjugadorhumano([jugador]) == TRUE)
{
daexperiencia(1000, [jugador]);
}

¡Espera! ¡Dijiste línea por línea! Sí claro, pero es que estamos en una condición y tenemos que ver el conjuto.

Las condiciones funcionan así:

if(condicion)
{
//haz algo
}
else
{
//haz lo que quieras si no se cumple
}

Podemos anular todo el bloque del else y dejarlo solo así:

if(condicion)
{
//haz algo
}

Vale, ya en un momento hemos identificado que es una condición. Analicemos la condición de la condición XD sí sí, lo que está entre paréntesis:

esjugadorhumano([jugador]) == TRUE

Bien, aquí no hay punto y coma ¿porqué? ¿no dijiste ... shht! callad! los condicionales son así, no los juzguéis por ello. Vamos a traducir esto un poco más a nuestro código

esjugadorhumano(oJugador) == TRUE

¿Qué es eso de TRUE? bueno, es una constante, las constantes son palabras "humanas" que contienen valores fijos. Esto seguramente de manera interna sea un TRUE = 1 pero da igual, os quedáis con TRUE. Vamos a buscar una función que nos sirva para nosotros.

¿Cómo es un jugador humano en el NWN? PJ (personaje de jugador o personaje jugable) ¿cómo sería en inglés? PC (playable character) busquemos PC ... buff salen unas cuantas pero mirad la tercera:

// * Returns TRUE if oCreature is a Player Controlled character.
int GetIsPC(object oCreature)

¡Ostias que fácil! ¿véis? analicemos:

int -> devuelve un entero, aunque si os fijáis dice que devuelve TRUE ... eso es porque TRUE contiene 1 como valor, pero da igual, es una anécdota anecdótica, no os quedéis con ello.

¿Véis lo que pone entre paréntesis? object oCreature, eso significa que recibe un object. ¿Véis el oCreature? eso es que la función internamente lo llama así, pero te da igual. ¿Has visto que usan la o? ¡SON PROS COMO NOSOTROS!

Vamos a ello:

esjugadorhumano(oJugador) == TRUE
pasa a ser
GetIsPC(oJugador) == TRUE

Joder, que guapo! En nuestro ejemplo:

if (GetIsPC(oJugador) == TRUE)
{
daexperiencia(1000, [jugador]);
}

¿Y porqué pones == en vez de =? ¡Porque el = es para asignar valores y el == para comparar! ¡Nunca os confundáis!

Una cosa buena de los ifs, es que si no pones el == TRUE lo hace por defecto, esto es que la comparación por defecto:

if (GetIsPC(oJugador))

sería igual que

if (GetIsPC(oJugador) == TRUE)

Entonces ¿para qué ponerla? para que cuando empecéis sepáis lo que comparáis, igual queriáis poner:

if (GetIsPC(oJugador) == FALSE)

Aunque técnicamente no sería FALSE sería otra palabra reservada, pero da igual, vamos a lo nuestro:

object oJugador;
oJugador = GetPlaceableLastClickedBy();
if (GetIsPC(oJugador) == TRUE)
{
daexperiencia(1000, [jugador]);
}

Vamos a la siguiente línea:

daexperiencia(1000, [jugador]);

Vamos a buscar rápidamente una función de experiencia, busquemos por XP.

El resultado que aparentemente mejor se ajusta es: GiveXPToCreature

Su descripción es:

// Gives nXpAmount to oCreature.
void GiveXPToCreature(object oCreature, int nXpAmount)

¿véis el void? significa que no devuelve nada. Y requiere dos cosas, un objeto (a quién dar la experiencia) y una cantidad (la experiencia a dar)

En nuestro caso:

GiveXPToCreature(oJugador, 1000);

¡Como mola! ¡Veámoslo completo!

object oJugador;
oJugador = GetPlaceableLastClickedBy();
if (GetIsPC(oJugador) == TRUE)
{
GiveXPToCreature(oJugador, 1000);
}

¡Ya hemos hecho un script!

Esto, en el editor de scripts iría todo dentro del void main() { }

Tal que así:

void main()
{
object oJugador;
oJugador = GetPlaceableLastClickedBy();
if (GetIsPC(oJugador) == TRUE)
{
GiveXPToCreature(oJugador, 1000);
}
}

Guardaríamos este script con un nombre, se compilaría y nos daría este mensaje:

20/02/2012 14:16:46: 0 errores. 'test' se ha compilado con éxito

Despues iríamos a nuestro ubicado, lo examinaríamos y en la pantalla de guiones, en el onused pondríamos este script.

¿Qué pasa si lo ponemos en el onphysicalattacked? ¿daría xp cada vez que atacásemos? ¡No! ¿sabéis porqué?

Os lo explico rápidamente. cada vez que atacásemos se ejecutaría el script, este script:

void main()
{
object oJugador;
oJugador = GetPlaceableLastClickedBy();
if (GetIsPC(oJugador) == TRUE)
{
GiveXPToCreature(oJugador, 1000);
}
}

Como el oJugador es el último que hizo click, nunca podría darle XP al atacar, debería ser algo como:

// Get the last attacker of oAttackee. This should only be used ONLY in the
// OnAttacked events for creatures, placeables and doors.
// * Return value on error: OBJECT_INVALID
object GetLastAttacker(object oAttackee=OBJECT_SELF)

¿véis? esta función nos daría quién es el último jugador que atacó el ubicado.

Pero esto sería ir entrando cada vez más y más en detalles, lo importante es que creéis un script y probéis y experimentéis. Poned las dudas que tengáis pero ... ¡CON TODA LA INFORMACIÓN POSIBLE! no seáis escuetos cuando preguntéis, se trata de que todos aprendan con las dudas y las respuestas.

¡No os olvidéis de hacer el objeto usable! (el ubicado) ya que es importante para poder seleccionarlo y hacer click o atacarlo.

¡Todas las dudas al infierno con ellas! Eso sí, cuando vuelvan del averno os dejo que preguntéis.

Un saludo, espero que os guste y perdáis tiempo con ello.
 

_NagaShadow_

Restos de un PJ de Aharadad
Registrado
29/9/09
Mensajes
1,541
Edad
41
Muy buena iniciativa Wallack. Yo aunque me dedico a programar, nunca me he querido meter en el scripting del nwn porque hay infinidad de funciones que desconozco su utilidad y me echa para atrás. Tal vez sería muy útil que alguien aportara una lista de éstas además de los valores a introducirles y que devuelven claro.
Realmente con muy poco ya se puede empezar a hacer cosas útiles, cómo saber usar condicionales o bucles (sin abusar).
¡Un saludo!
 

Dhraax

Equipo Técnico
Registrado
31/7/11
Mensajes
4,652
$:$:$: que bonito!! lectura no en ingles!!! Gracias!!!!
Naga despues sub algo de lo que fui aprendiendo yo =) haber si le sirve a alguien.

Saludos!
 

Wallack

Pornorroleador en sequía
Registrado
13/12/08
Mensajes
569
Edad
40
_NagaShadow_":marz262x dijo:
Muy buena iniciativa Wallack. Yo aunque me dedico a programar, nunca me he querido meter en el scripting del nwn porque hay infinidad de funciones que desconozco su utilidad y me echa para atrás. Tal vez sería muy útil que alguien aportara una lista de éstas además de los valores a introducirles y que devuelven claro.
Realmente con muy poco ya se puede empezar a hacer cosas útiles, cómo saber usar condicionales o bucles (sin abusar).
¡Un saludo!

http://www.nwnlexicon.com/

Escucha Naga, si sabes programar (en qué programas por curiosidad) métete, en serio, ya sabes pensar de manera lógica y solo es conocer las funciones.

No trates de tener una lista de funciones, intenta pensar qué quieres hacer y lo estructuramos todo y vemos qué funciones puedes necesitar, ver si existen ... es más o menos el proceso que sigo yo.
 

Mandraman

Vampiro que no es Adathiel
Registrado
27/12/10
Mensajes
1,296
Dios, justo ayer estuve machacando la red y el google para encontrar este tipo de cosas... la mayoria me salieron en inglés. A ver si luego tengo un rato para estudiarlo a fondo.
 

soplanucas

Shevarasita que habla bajito
Registrado
20/6/10
Mensajes
966
Edad
45
A primer golpe de vista no me he aclarado mucho, abrire el aurora y tratare de acercar posturas con mi escaso intelecto.
 

_NagaShadow_

Restos de un PJ de Aharadad
Registrado
29/9/09
Mensajes
1,541
Edad
41
Pues he programado en java, php, C#, bash (linux) pero de estos ya casi no me acuerdo. Básicamente lo que mejor se me da y con lo que he trabajado más es C y SAS(que éste último es un lenguaje estadistico para la banca) que curiosamente se parece mucho al lenguaje de programación de phsql (o como se escriba coño XD). Ah bueno, y bases de datos como no.
 

Wallack

Pornorroleador en sequía
Registrado
13/12/08
Mensajes
569
Edad
40
soplanucas":2kzsokn9 dijo:
A primer golpe de vista no me he aclarado mucho, abrire el aurora y tratare de acercar posturas con mi escaso intelecto.
Pregunta las dudas que tengas. Hacer un tutorial para alguien que no sepa nada, nada, nada, nada de programación, puede resultar eterno XD

Lo hice todo lo simple que se me ocurre pero yo llevo programando desde 2003 así que para mi muchos conceptos básicos pueden no serlo para vosotros.

Todas las dudas que tengas, postéalas para que al menos otros las lean, vean las respuestas y aprendan más cosucas!
 

soplanucas

Shevarasita que habla bajito
Registrado
20/6/10
Mensajes
966
Edad
45
Bueno, dada la atención no puedo dejarmelo :D, bien ten en cuenta que yo deje de ver esto de la programación cuande el BASIC iba a ser el idioma definitivo, hazte una idea...

Vamos a ello:

guarda en [jugador] jugador que clico el ubicado
es [jugador] un jugador?
si se cumple -> da 1000 de experiencia a [jugador]
fin condicional

Todo claro. (aunque que "jugador" no es un "Jugador", los pnj´s por IA, clickean ubicados??.

Lo de asignar las variables me deja un poco lelo, el motor no tiene variables asignadas? o sea: Jugador= Jugador "humano", etc..? o por razas o por genero...cada Script requiere que se asigne cada variable?

tenemos un listado de las funciones que queremos y sabemos que necesitan y que nos devuelven.

quizas conociendo los comandos, se pueda uno hacer una idea. Si se que hace tal o cual puedo marear comandos para conseguir pascual.

Bueno, voy a releer tu post de nuevo para que se empapen los conceptos en mi mente enajenada. Dame tiempo. Y Gracias.
 

Wallack

Pornorroleador en sequía
Registrado
13/12/08
Mensajes
569
Edad
40
soplanucas":ssgpitdk dijo:
Bueno, dada la atención no puedo dejarmelo :D, bien ten en cuenta que yo deje de ver esto de la programación cuande el BASIC iba a ser el idioma definitivo, hazte una idea...

Vamos a ello:

guarda en [jugador] jugador que clico el ubicado
es [jugador] un jugador?
si se cumple -> da 1000 de experiencia a [jugador]
fin condicional

Todo claro. (aunque que "jugador" no es un "Jugador", los pnj´s por IA, clickean ubicados??.

Lo de asignar las variables me deja un poco lelo, el motor no tiene variables asignadas? o sea: Jugador= Jugador "humano", etc..? o por razas o por genero...cada Script requiere que se asigne cada variable?

Lo que quiero representar en ese script, es el tipado de datos. Hay diferentes tipos de variables, ejemplo:

int iNumero;
string sTexto;
object oJugador;

Cada tipo de variables puede almacenar un tipo de datos. Asignar variables, es necesario en todo lenguaje de programación para tener un orden en el código, ejemplo:

void main()
{
object oJugador;
oJugador = GetPlaceableLastClickedBy();
if (GetIsPC(oJugador) == TRUE)
{
GiveXPToCreature(oJugador, 1000);
}
}

¿Entiendes este código? este código está así por ser la manera más correcta y ordenada de mostrarlo. Realmente no pasa nada si das 1000 xp a un DM o a un PNJ puesto que no usan experiencia y simplemente no pasará nada, de hecho, el script podría ser así:

void main()
{
GiveXPToCreature(GetPlaceableLastClickedBy(), 1000);
}

Pero estoy seguro de que es más entendible de la primera forma. En realidad quizás hay que entender lo siguiente:

Objeto (object) = PJ (incluimos a los DM's), NPCs, criaturas hostiles, ubicados, áreas, el módulo en sí, items ...

De todos modos, no entiendo exactamente tu duda en este aspecto, he intentado esclarecer todo, pero cada script tiene que tener sus variables. Pero eso es así en todo el mundo XD

Una opción es abrir el editor de guiones, abrir un guión y hacer clic en "todos los recursos" (en las 3 opciones de abajo a la izquierda creo) y podréis ver todos los scripts del juego, desde el bendecir, hasta el tormenta de venganza.

soplanucas":ssgpitdk dijo:
tenemos un listado de las funciones que queremos y sabemos que necesitan y que nos devuelven.

quizas conociendo los comandos, se pueda uno hacer una idea. Si se que hace tal o cual puedo marear comandos para conseguir pascual.

Bueno, voy a releer tu post de nuevo para que se empapen los conceptos en mi mente enajenada. Dame tiempo. Y Gracias.

Lo mejor es, piensa en los conjuros del NWN, intenta separarlos por pasos, por ejemplo:

Bendecir sabemos que a partir del punto donde se lanza, creará un área de efecto, recorrerá ese área comprobando que jugadores hay, comprobará los que estén en el grupo, y les dará unos efectos. Con eso te haces una ligera idea de qué posibilidades hay.

En realidad es mejor que digas, me gustaría hacer esto, y tratar de trozearlo en lenguaje lógico y ver luego si se puede hacer o no. En realidad yo no conozco todas las funciones, aunque no son tantas como en Java u otro lenguaje, pero no conoces todas las funciones porque no es necesario, ya que tienes un pensamiento lógico, adaptas tu idea y buscas funciones específicas para cada paso que has "troceado".

Si quieres di que quieres hacer y probamos a estudiarlo.
 

soplanucas

Shevarasita que habla bajito
Registrado
20/6/10
Mensajes
966
Edad
45
ok, con el ejemplo mas simple he cogido mas el concepto. A ver si tengo tiempo y le pego un poco. De todzs formas mi conocimiento es czsi null, no quisiera retrasar al resto. Id dandole y yo ya pregunto. Gracias.
 

Wallack

Pornorroleador en sequía
Registrado
13/12/08
Mensajes
569
Edad
40
Que resto si ni dios pregunta.
 

soplanucas

Shevarasita que habla bajito
Registrado
20/6/10
Mensajes
966
Edad
45
void main()
{
object oJugador;
oJugador = GetPlaceableLastClickedBy();
if (GetIsPC(oJugador) == TRUE)
{
GiveXPToCreature(oJugador, 1000);
}
}
A ver si lo he cogido.

Esto supongo que será un comienzo basico

object oJugador;
Aquí entiendo que es cuando asignamos nuestra variable, o sea que actue en "objetos tipo jugador"

oJugador = GetPlaceableLastClickedBy();
Aquí le decimos que actue sobre el "objeto tipo jugador" que haga click sobre el ubicado que dispara el trigger.

if (GetIsPC(oJugador) == TRUE)
Aquí nos asegurams que es un personaje controlado por un jugador.Esta parte la entiendo menos, ya que añadimos una condicional que no afecta, salvo claro esta que sirva para otros casos mas complicados, como "si ya ha recibido esta experiencia..." hacer otro efecto.

GiveXPToCreature(oJugador, 1000);
Esto esta claro, otorgar a la variable asignada como "objeto tipo jugador" el efecto elegido
Esto seguro que tiene una finalidad, pero no se cual es XD

Me he ido mucho?
 

Mandraman

Vampiro que no es Adathiel
Registrado
27/12/10
Mensajes
1,296
soplanucas":118ub24d dijo:
if (GetIsPC(oJugador) == TRUE)
{
GiveXPToCreature(oJugador, 1000);
}
}

No se si yo lo he pillado, así que te pongo lo que he entendido yo y que el profe nos corrija.

El if.. es como tu dices
esto --->
Código:
{
GiveXPToCreature(oJugador, 1000);
}

Implica que si se cumple el if, se usa ese comando
Siendo { } lo que abre y cierra lo que se hará si se cumple el if

en teoria podría haber un
Código:
else...
por si la condición no se cumpliera que hiciese otra cosa

Y el último } cierra el script, y ya puso un { justo después del void main ()


¿Me he equivocado de mucho?
 

soplanucas

Shevarasita que habla bajito
Registrado
20/6/10
Mensajes
966
Edad
45
Profeeeeeeeeeee.

Y si en vez de condicional le metemos a "capón" la funcion de "dar XP" a quien "clickee" el ubicado?

Necesitamos siempre condicional??

Profeeeeeeeeeee.
 

Caeles

Enano con acento ruso
Registrado
2/2/12
Mensajes
18
Lo que sucede es que dara siempre los px, incluido a pnj's o monstruos que lo usen (sea por una accion dada por script o un dm controlandolo), hasta podrias dar px a un Dm. En el caso de los monstruos no sucede nada, ya que aunque tengan la px no suben de nivel (incluido si los controla un Dm), hay otra funcion que es para eso.
 

_NagaShadow_

Restos de un PJ de Aharadad
Registrado
29/9/09
Mensajes
1,541
Edad
41
Un ejemplo de condicionales podría ser este:

IF (loquesea == TRUE && loquesea2 != TRUE)
{
IF (estaesotravariable != TRUE)
{
.... //Pueden haber varios condicionales dentro de otros condicionales
}
}

ELSE IF (loquesea == TRUE && loquesea2 == TRUE)
{

}

ELSE
{
// Este final del condicional indicaría que se aplicará para el resto de casos restantes. Es decir, cuando loquesea no sea TRUE y loquesea2 sea o no TRUE.
}

Es una pijada pero lo de abrir y cerrar las llaves es bueno que dependiendo de la jerarquia en la que esteis le vayais dando más o menos espacios (fijaros en mi condicional dentro de otro condicional) porque así es más fácil para saber qué pertenece a qué.

Sobre lo que ha preguntado Poderomano, todo correcto.
Sobre lo de soplanucas, esta parte:
"
oJugador = GetPlaceableLastClickedBy();
Aquí le decimos que actue sobre el "objeto tipo jugador" que haga click sobre el ubicado que dispara el trigger."

Ahí lo que estás haciendo es asignarle a tu variable llamada oJugador el resultado de la funcion GetPlaceableLastClickedBy();


P.D: Bueno, parece que aunque le di los espacios, por aquí sale todo seguido..ain
 

Wallack

Pornorroleador en sequía
Registrado
13/12/08
Mensajes
569
Edad
40
Señores, estoy esta semana en Rotterdam por temas de curro pero os contesto lo que puedo.

soplanucas":27w8ccp3 dijo:
void main()
{
object oJugador;
oJugador = GetPlaceableLastClickedBy();
if (GetIsPC(oJugador) == TRUE)
{
GiveXPToCreature(oJugador, 1000);
}
}
A ver si lo he cogido.

Esto supongo que será un comienzo basico

//Si, esto es lo básico, todos los scripts que se ejecutan tienen esta función como función principal.

object oJugador;
Aquí entiendo que es cuando asignamos nuestra variable, o sea que actue en "objetos tipo jugador"

//No, aquí lo que hacemos es crear una variable llamada oJugador, podrías llamarla ostiasenvinagre. El object del principio la identifica como variable de tipo object. Podrá guardar un jugador o una silla.

oJugador = GetPlaceableLastClickedBy();
Aquí le decimos que actue sobre el "objeto tipo jugador" que haga click sobre el ubicado que dispara el trigger.

//Más o menos. La función devuelve un objeto, que es el objeto que hizo click. Nosotros guardamos ese objeto en nuestra variable oJugador.

if (GetIsPC(oJugador) == TRUE)
Aquí nos asegurams que es un personaje controlado por un jugador.Esta parte la entiendo menos, ya que añadimos una condicional que no afecta, salvo claro esta que sirva para otros casos mas complicados, como "si ya ha recibido esta experiencia..." hacer otro efecto.

//Sí afecta, porque el clic lo ha podido hacer un DM, o incluso un pnj controlado. Y lo correcto es comprobar antes de hacer las cosas.

GiveXPToCreature(oJugador, 1000);
Esto esta claro, otorgar a la variable asignada como "objeto tipo jugador" el efecto elegido
Esto seguro que tiene una finalidad, pero no se cual es XD

//Las llaves sirven para crear bloques:

if(condicion)
{
hola;
}
else
{
adios;
}

Me he ido mucho?

//Solo un poco xD
 

Wallack

Pornorroleador en sequía
Registrado
13/12/08
Mensajes
569
Edad
40
Poderomano":383b89zr dijo:
soplanucas":383b89zr dijo:
if (GetIsPC(oJugador) == TRUE)
{
GiveXPToCreature(oJugador, 1000);
}
}

No se si yo lo he pillado, así que te pongo lo que he entendido yo y que el profe nos corrija.

El if.. es como tu dices
esto --->
Código:
{
GiveXPToCreature(oJugador, 1000);
}

Implica que si se cumple el if, se usa ese comando
Siendo { } lo que abre y cierra lo que se hará si se cumple el if

en teoria podría haber un
Código:
else...
por si la condición no se cumpliera que hiciese otra cosa

Y el último } cierra el script, y ya puso un { justo después del void main ()


¿Me he equivocado de mucho?

//Perfecto ;)
 
Arriba