[Duda] Return - їComo funcionan?.
#1

Buenas, vale que no me llevo bien con los return y sй que es importante dentro de pawn pero no logro entender como usarlo, es decir yo entiendo lo mбs tipico.

pawn Код:
return 1; // o return 0;
Pero no logro entender la funcionalidad por ejemplo, Si yo quiero retornar el valor de una variable, No sй como debo hacerlo, O el por que de cuando se debe retornar una variable.

Bбsicamente combinar return con todo. (Si tienen un tutorial en inglйs pбsenlo por favor).

Gracias.
Reply
#2

Por ejemplo, para hacer una funciуn:
pawn Код:
stock Funcion()
{
new VAR = 5;
return VAR;
}

// Al usar
new var = Funcion();
if(var == 5) print("5");
else printf("%d", var);
Es solo un ejemplo, normalmente se suele usar de otras maneras... un poco mбs avanzadas por asн decirlo.



EDIT: En algunas callbacks como OnPlayerCommandText, 1 significa sucess y 0 failed.
Reply
#3

Return lo que hace es finalizar la ejecuciуn de un cуdigo. Donde lo pongas hasta ahн se ejecutarб.

Devuelve el valor que se indique, ya sea en variable o escrito. Tambiйn puedes retornar strings o floats, no sуlo enteros.
Reply
#4

Es un poco complicado de explicar y ya que no encontrй una guнa completa tratarй de explicarlo en forma simple.

El return es lo que retorna una variable. Harй un ejemplo con "public OnPlayerUpdate".

Por ejemplo, en el caso de "OnPlayerUpdate", si utilizamos "return 1;" el jugador se actualizarб respecto al servidor (Lo normal).

pawn Код:
public OnPlayerUpdate(playerid)
{
return 1;
}
Pero, si por ejemplo, cambiamos el "return 1;" por "return 0;", el jugador no se actualizarб respecto al servidor y los demбs lo verнan como si se encontrase pausado.

El return en general, sirve para retornar valores o ejecutar una acciуn una vez finalizada la funciуn, o bien, para terminarla. Un ejemplo:

pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
if(!strcmp(cmdtext, "/Command", true))
{
SendClientMessage(playerid, -1, "Escribiу un comando.");
return 0;
}
return SendClientMessage(playerid, -1, "Comando inexistente.");
}
En este caso, la funciуn de "/Command" serб llamada solo si el jugador la escribe y una vez que ocurra esto, retornarб 0, lo cual significa que la funciуn de dicho public ya se realizу y no ejecutarб mбs funciones.

Y en caso el usuario no use la funciуn de "/Command", entonces le saldrнa el mensaje que retornarнa que al analizar la funciуn del public en general, no se detectу ningъn comando. Entonces el return serнa, en este caso, lo que ocurre si la funciуn es ejecutada.

En conclusiуn, el return serнa el final de la funciуn y lo que se quiere ejecutar, sin que se pueda ejecutar mбs funciones de dicho cуdigo.

Harй otro ejemplo con un comando:

pawn Код:
if(strcmp("/Admin", cmdtext, true, 10) == 0)
{
if(IsPlayerAdmin(playerid)) return SendClientMessageToAll(-1, "El administrador escribiу un comando.");
SendClientMessageToAll(-1, "Un usuario escribiу el comando del administrador.");
return 1;
}
En este caso, si el usuario es un administrador retornarб el mensaje de "El administrador escribiу un comando." y no se ejecutarбn las demбs funciones, mientras que si el usuario no es administrador se ejecutarбn las demбs funciones que en este caso solo serнan el "Un usuario escribiу el comando del administrador."

Ahora, algo importante es saber la diferencia entre "return 0;" y "return 1;". Para esto darй un ejemplo.

Supongamos que tengo dos FilterScripts y un GameMode. En un FilterScript tengo esto:

pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp("/Admin", cmdtext, true, 10) == 0)
{
if(IsPlayerAdmin(playerid)) return SendClientMessageToAll(-1, "El administrador escribiу un comando.");
SendClientMessageToAll(-1, "Un usuario escribiу el comando del administrador.");
return 1;
}
return 1;
}
En el otro:

pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp("/Usuario", cmdtext, true, 10) == 0)
{
if(IsPlayerAdmin(playerid)) return SendClientMessageToAll(-1, "Un usuario escribiу un comando.");
SendClientMessageToAll(-1, "El administrador escribiу un comando de un usuario.");
return 1;
}
return 1;
}
Y en el GameMode:

pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp("/Command", cmdtext, true, 10) == 0)
{
SendClientMessageToAll(-1, "Se ejecutу el comando.");
return 1;
}
return SendClientMessage(playerid, -1, "Comando inexistente.");
}
Que los FilterScripts tengan "return 1;" anula todos los otros "public OnPlayerCommandText" ya que la funciуn fue ejecutada.

Ahora, si colocamos "return 0;" en un FilterScript; algo asн:

pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp("/Admin", cmdtext, true, 10) == 0)
{
if(IsPlayerAdmin(playerid)) return SendClientMessageToAll(-1, "El administrador escribiу un comando.");
SendClientMessageToAll(-1, "Un usuario escribiу el comando del administrador.");
return 1;
}
return 0;
}
Estarнa permitiendo otros "public OnPlayerCommandText" de otros FilterScript, por lo que puede se ejecutarбn los demбs comandos.

Entonces, la diferencia entre "return 1;" y "return 0;" es que el "return 1;" solo terminarнa la funciуn en un cуdigo, significarнa que la funciуn fue llamada. Colocar "return 1;" no afectarнa funciones comunes de SA-MP como "OnPlayerUpdate", mientras que "return 0;" anularнa las funciones por completo una vez puesto.

Los returns tambiйn sirven para asignar valores a determinadas funciones, aunque esto es un poco mбs avanzado.

En general, este tema no es muy complicado de entender, sino de explicarlo. Quizб luego haga una guнa mбs completa y la comento aquн por si le sirve
Reply
#5

Eso del return 0 de tu ejemplo de "anularlas por completo" es sуlo aplicable a OnPlayerUpdate, en el resto de callbacks no.
Reply
#6

Quote:
Originally Posted by [J]ulian
Посмотреть сообщение
Eso del return 0 de tu ejemplo de "anularlas por completo" es sуlo aplicable a OnPlayerUpdate, en el resto de callbacks no.
Se aplica a mбs de una como a "OnPlayerWeaponShot".
Reply
#7

He probado retornar 0 en OnGameModeInit y 3 OnFilterScriptInit y se han llamado los 3. Quizбs solo aplica para OnPlayerCommandText, habrнa que probar xD

EDIT: Segun la wiki si se llaman cuando se retorna 0.

pawn Код:
// Returning 0 informs the server that the command hasn't been processed by this script.
// OnPlayerCommandText will be called in other scripts until one returns 1.
// If no scripts return 1, the 'SERVER: Unknown Command' message will be shown to the player.
Reply
#8

Quote:
Originally Posted by [J]ulian
Посмотреть сообщение
He probado retornar 0 en OnGameModeInit y 3 FS y se han llamado los 3. Quizбs solo aplica para OnPlayerCommandText, habrнa que probar xD
Claro, habrнa que probar con cada public ya funcionan de forma distinta. En fin, solo son unos ejemplos y por lo demбs el usuario puede sacar sus propias conclusiones de como funciona en cada public. La wiki dice exactamente eso respecto a "OnPlayerCommandText".

Ademбs, la mayorнa de informaciуn sobre como funciona cada public se puede encontrar en la wiki o en el foro
Reply
#9

Muchas gracias, Me habйis confundido al final, Pero poco a poco estoy entendiendo.
Reply
#10

Quote:
Originally Posted by CrashCar
Посмотреть сообщение
Muchas gracias, Me habйis confundido al final, Pero poco a poco estoy entendiendo.
De nada, lo ъltimo no es tan importante por lo que le sugiero ignorarlo por ahora hasta que entienda un poco mбs del tema

Lo ъltimo depende del funcionamiento de SA-MP en sн y su forma de procesar diferentes funciones. Respecto a eso, la mayorнa de informaciуn se encuentra en la wiki.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)