Aprender pawn





Introducción

Hacia rato que no creaba ningun tutorial, y tenia ganas de aportar con algo nuevo y util, asi que se me ocurrio hacer este tutorial, de aproximadamente 1198 lineas.
Bueno en este tutorial, voy a tratar de ayudar a los mas nuevos a dar sus primeros pasos con este lenguaje de programacion de scripts llamado pawn. Y a aquellos que saben un poco, a que sigan aprendiendo cosas nuevas, o a recordar cosas que se habian olvidado.
Este tutorial va a ir desde lo mas basico, hasta cosas un avanzadas. Y el objetivo no es otro que no sea aprender.
Espero que les sirva y cualquier error q cometa, haganmelo saber, ya que todos siempre estamos aprendiendo algo y nos podemos equivocar.




Forma de uso

Primero, antes que se manden a empezar a leer, quiero aclarar, que este tutorial esta dividido en 3 niveles: Nivel Basico/Nulo, Medio y Avanzado. Cada nivel consta con conocimientos a corde al nivel propuesto, pero les suguiero a aquellos que no han leido demasiado sobre pawn, que lean desde el principio, aun que tengan los conocimientos, porque lo que se dice en el nivel basico, se da por entendido en los demas niveles y asi.
Segundo, lo ideal para que fijen bien los conocimientos sobre este tutorial, seria que cuando aprenden algo nuevo, lo prueben y si no lo terminan de entender o no les sale cuando lo practican, paren y piensen a ver que puede estar mal y si es necesario pregunten y luego cuando lo tengan bien claro, sigan.




Primeros pasos

Bueno pawn es un sistema muy amplio, pero vamos a ir conociendolo paso a paso.
Lo primero que vamos a aprender es como almacenar datos en variables/arrays, esto va a ser muy util y es lo que posiblemente usen mas en los scripts que vallan a programar a futuro.


Nivel: Basico/Nulo

Variables y Arrays

Primeros pasos con variables y arrays

¿Qué es una variable?
La respuesta es muy simple:
Una variable es un pedacito de memoria que se reserva para el programa durante la ejecución del mismo, para almacenar informacion, que luego usara.

Para definir una variable en pawn, la forma mas simple es utilizar "new" y se utiliza de la siguiente forma.

pawn Code:

new MiVariable;



Esa sentencia define "MiVariable" como una variable de tipo entero (en ingles integer).

¿Qué es un tag, y cuales de variables existen?
Un tag es un pedacito de codigo, que aAsignacion la hora de compilar, brinda informacion extra sobre la variable que definimos.

Tags:

Float => almacena numeros enteros y numeros con coma.
File => almacena el handle de un archivo abierto. (no se preocupen de que es un handle, luego lo explicare).
Bool => almacena true o false, verdadero o falso.
Integer => almacena numeros enteros.


¿Cómo definimos una variable con un tag?

Para definir una variable de tag float o file, lo vamos a hacer de la siguiente forma:
pawn Code:

new tag:Nombre;



Ejemplos:
·float:

pawn Code:

new Float:MiFloat;


·file:

pawn Code:

new File:MiFile;



·bool:

pawn Code:

new bool:MyBool;


·integer:

pawn Code:

new MiInteger;



Ahora, posiblemente se esten preguntando "¿Por qué no se utiliza integer:nombre?", esto es porque pawn por defecto, si no se le especifica, define las variables como integers.

¿Qué es un array?
Para simplificarlo, un array es lo mismo que una variable, pero puede contener una mayor cantidad de datos, en vez de solo 1.

¿Cuales son los tags de los arrays?
Los mismos tags que tienen las variables, y se los especifica de igual forma. "tag:nombre".

¿Cómo defino un array?
La forma de definir un array es muy sensilla, de hecho es = que definir una variable, exepto que tiene una diferencia.

pawn Code:

new MiArray[4];




Como pueden ver, solo varia ; en este caso, n=4.¿Qué representa "n"? n representa el tamaño de ese array.

!Importante: A la hora de definir un array, debemos tener en cuenta, que este nunca puede tomar el valor de la definicion.
Ejemplo:

pawn Code:

new Array[5];
Array[5] = 4;//esto causara un error, dado que el index maximo de Array es 4.



Ahora que mas o menos tenemos idea de como se declara una variable y un array, veremos otras formas de declararlos.

Tipos de variables/arrays:
Estos metodos se aplican tanto para variables como para arrays, asi q los mezclare para variar un poco.
Existen 4 tipos, de los cuales ahora veremos los dos mas faciles de aprender.


Local
Definición:
Solo puede ser utilizada dentro del entorno en el cual es declarada(ej: Callbacks, funciones, etc). Para declarar una variable/array de este tipo, la declaracion debe ser realizada dentro del entorno en el que se decea usar la variable/array.

Ejemplificacion:
pawn Code:

public OnPlayerConnect(playerid)
{
new str[36+MAX_PLAYER_NAME], name[MAX_PLAYER_NAME];//declaracion del array local
GetPlayerName(playerid, name, sizeof(name));
format(str, sizeof(str), ">>%s(%i) ha ingresado en el servidor", name, playerid);
SendClientMessageToAll(0xFFFF00FF, str);
return 1;
}





Global
Definición:
Puede ser utilizada en todo el proyecto. Para declarar una variable/array de este tipo, debe declararse fuera de cualquier funcion o callback.

Ejemplificacion:
pawn Code:

new Connected[MAX_PLAYERS];

public OnPlayerConnect(playerid)
{
Connected[playerid] = true;
return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
Connected[playerid] = false;
return 1;
}





!Importante: Tenemos que tener en cuenta, que cuando declaramos una variable/array tanto local, la variable existe dentro de los espacios inferiores, pero no en los superiores.
ejemplo:
pawn Code:


MyFuncion()
{
new var1;
for(new i; i<5; i++){
//var1 todabia existe.
new var2;
printf("%i", var2);
var2++;
//var2 todabia existe
}
//var1, todabia existe, pero var2 no existe
}
//var1 no existe.




Ahora que ya sabemos que es una variable, un array y como definirlos. iremos con otro tema.

Operadores

Operadores simples

¿Qué es un operador?
Un operador es un simbolo que se utiliza en expreciones, o bien para realizar una accion.

¿Cuáles son los Operadores?

Aritmeticos:
·A + B => Retorna la suma de A y B.
·A - B => Retorna la resta de A y B.
·A * B => Retorna la multiplicacion de A y B.
·A / B => Retorna la division de A y B.
·A % B => Retorna el resto de la division de A y B.


Asignacion:
·A = B => Asigna a A el valor de B.
·A ++ => Asigna a A el resultado de A+1.
·A -- => Asigna a A el resultado de A-1.
·A += B => Asigna a A el resultado de A+B.
·A -= B => Asigna a A el resultado de A-B.
·A *= B => Asigna a A el resultado de A*B.
·A /= B => Asigna a A el resultado de A/B.
·A %= B => Asigna a A el resto de A/B.



Racionales(numericos):
·A == B => Retorna "true" si A=B, de lo contrario retorna "false".
·A != B => Retorna "false" si A=B, de lo contrario retorna "true".
·A < B => Retorna "true" si A<B, de lo contrario retorna "false".
·A > B => Retorna "true" si A>B, de lo contrario retorna "false".
·A <= B => Retorna "true" si A<=B, de lo contrario retorna "false".
·A >= B => Retorna "true" si A>=B, de lo contrario retorna "false".


Racionales(booleans):
·!B => Retorna "true" si B=false, de lo contrario retorna "false".
·A || B => Retorna "true" si A=true o B=true, de lo contrario retorna "false".
·A && B => Retorna "true" si A=true y B=true, de lo contrario retorna "false".


Micelaneos:
·([]) => Se utiliza para la declaracion de arrays.




Expreciones

¿Qué es una expreción?
Una exprecion es una convinacion de variables/arrays, funciones, que son evaluadas segun los parametros indicados. (si no entienden, no se preocupen, luego entenderan)

¿Cuáles son las expreciones que existen y cómo se utilizan?
Existen 16 expreciones, pero ahora solo veremos algunas. Mas adelante veremos las demas.

if
Es una de las expreciones mas importantes, se utiliza para comparar, y segun el resultado de la comparacion, se realiza o no una determinada accion.

Ejemplo1:
pawn Code:

public OnPlayerConnect(playerid){
new rnd = random(2);
if(rnd = 0)SendClientMessage(playerid, 0x00FF00FF, "Bienvenido al servidor"Aprender pawn (Basico/Medio/Avanzado);
return 1;
}


Ejemplo2:
pawn Code:

public OnPlayerConnect(playerid){
new rnd = random(2);
if(rnd = 0){
SendClientMessage(playerid, 0xFF0000FF, "Fuera de mi servidor"facil;
Kick(playerid);
}
return 1;
}



!Importante: Cuando el codigo a ejecutar si la comparacion es verdadera es de 1 linea o 1 sentencia (ejemplo1), no es necesario usar brackets, de lo contrario estos se deben colocar(ejemplo2).

else
Es al igual que if una de las expreciones mas importantes, y tambien una de las mas utilizadas. Su uso consiste en el opuesto de if o

Ejemplo:
pawn Code:

Estado(playerid)
{
if(IsPlayerConnected(playerid)){
printf("El jugador %i esta conectado", playerid);
return 1;
}
else{
printf("El jugador %i esta desconectado", playerid);
return 0;
}


}

assert
Es similar a if, pero si es falso, entonces retorna(fin del callback/funcion)

Ejemplo:
pawn Code:

public OnFilterScriptInit()
{
new num = 5;
assert(num>0);
printf("%i", num);
return 1;
}



En el ejemplo dado, si la variable num es > 0 entonces escribira el valor de num en la consola, de lo contrario retornana.

return
Se utiliza para retornar un valor de una funcion/callback, o bien para salir (de la)/(del) misma/o

Ejemplo:
pawn Code:

IsValidPlayer(playerid)
{
if(playerid==INVALID_PLAYER_ID || !IsPlayerConnected(playerid))return false;
return true;
}




Caracteres Especiales

Script

·() => Indica que la linea actual, sigue en la de abajo.
·( => Fin de sentencia.





Nivel: Medio


Inicializadores
Bueno ahora vamos a avanzar un poco mas alla de las clasicas definiciones y vamos a comprender un poco mas sobre este lenguaje de programacion de scripts.
Ahora vamos a aprender un poco sobre:
new, enum, forward y public.

new

¿Cómo se usa new?
bueno esto no lo vamos a ver, ya que es realmente algo muy basico, y lo explique anteriormente.
Lo que realmente vamos a ver es porque usar new y no otros, es decir vamos a ver el correcto uso de esta sentencia.

La verdad es que no es muy complicado el uso de esta sentencia.
Cuando usar new

·Si necesitamos declarar una variable/array a nivel local, cuyo contenido pueda cambiar.
·Si necesitamos declarar una variable/array a nivel global, cuyo conenido pueda cambiar.



Cuando no usar new

·Para declarar una funcion.
·Para declarar un callback.
·Para declarar un array que no cambiara su contenido.


Enums

¿Qué es un enum?
Basicamente un enum, consiste en una lista.

¿Cómo se define un enum?
Un enum como tal, se define de la siguiente forma:
pawn Code:

enum MiEnum{elemento0, elemento1, elementon};




llevado a la practica y para mas facil lectura, podemos crear algo asi:
pawn Code:

enum Lista{
elemento_0,
elemento_1,
elemento_2,
elemento_n
};



¿Qué utilidad tienen los enums?
Generalmente los enums se suelen utilizar para listar datos. El mas usado de ellos similar al anterior, para luego obtener los datos y asignarlos en un array.HTTP

Ejemplo:
pawn Code:

enum PD{
Dinero,
Vida,
Armadura,
Advertencias
};
new PlayerInfo[MAX_PLAYERS][PD];





public

¿Qué es y para que sirve public?
Sirve para la declaracion de funciones/callbacks o bien variables.

¿Cuándo usar public?
·Se utiliza para la declaracion de funciones/callbacks que deben ser accesibles desde todos los documentos.
·Tambien se puede utilizar para la declaracion de variables que necesitamos que el host pueda modificar, ya que el host no puede modificar variables declaradas con new.(siempre variables globales)


forward

¿Qué es y para que sirve forward?
forward le "dice" de sierta forma que la funcion que se declara luego del mismo, "viene despues". Esto es asi ya que las funciones standar declaradas en pawn, no son declaradas hasta su uso.
pero las funciones declaradas como public, no son standard y pawn exige la declaracion de las mismas antes de su uso. Por eso se usa "forward funcion(parametros);"

¿Cuándo usar forward?
Siempre que se declare una funcion del tipo public.



Definiciones

Los Arrays y sus dimenciones

Dimenciones de un array
pawn Code:

new Array[5]




Ese array es unidimencional, ¿Qué quiere decir eso? Que solo tiene una dimencion.

¿Puede un array tener mas de una dimencion?
Si, puede y pawn soporta hasta tres dimenciones.

Aca les dejo unos "graficos" simples para que lo puedan entender mejor.

Unidimencional:
pawn Code:

new ArrayUnidimencional[5];

Code:

X
X
X
X
X



Cada una de esas x, puede contener un valor diferente.

Bidimencional:
pawn Code:

new ArrayBidimencional[5][2];

Code:

X X
X X
X X
X X
X X



Cada una de esas x, puede tener un valor diferente, que a su vez contiene otro valor. (Si no lo entienden no se preocupen. luego lo explicare de otra forma)

Tridimencional:
pawn Code:

new ArrayTridimencional[5][2][2];





Ahora bien, supongamos que tengo declarado un array asi:
pawn Code:

new Array[4];




y luego le agrego un valor.
pawn Code:

Array[2] = 6;



Graficamente:

Code:

X
X
6
X


Ahora, posiblemente, se esten preguntando xq en la 3 posicion? cuando en el index del array(numero q indica la posicion del array a utilizar) es "2".
eso es porque todos los arrays empiezan con el index 0 y no con el 1.
Graficamente

Code:

index 0 1 2 3
valorX X 6 X


otro ejemplo.

pawn Code:

new Array[5][2];
Array[2][1] = 5;



Graficamente:
Code:

X X
5 X
X X
X X
X X


Del mismo modo con un array tridimencional. dado que no se puede representar en un plano, les dejo el link a un grafico. para los 3 tipos de arrays (principalmente miren la estructura del tridimencional). Link


Inicialización
El concepto de inicializacion hace referencia al valor que se le da a una variable/array al crearlo.
por defecto en una variable su valor es "", mientras q en un array cada uno de los valores q puede contener es 0.

¿Cómo inicializar una variable?
La inicializacion de una variable es realmente muy simple, consiste en setear el valor correspondiente.

Ejemplo:
pawn Code:

new Variable = 5;



La variable se inicia en 5.

¿Cómo inicializar un array?
Es un poco mas complicado que una variable, pero aun asi sigue siendo algo simple.

Ejemplo1:
pawn Code:

new Array[10] = {1, 5, 5, 9, 10, 6, 7, 3, 0, 10};



Ejemplo2:
pawn Code:

new Array[2][3] = {{1, 5, 6}, {4, 2, 7}};



En los ejemplos dados anteriormente se inicializan los arrays definidos ya con los valores seteados.
Ejemplo3:
pawn Code:

new Array[10] = {1, 2, ...};



Esta forma de inicializar un array es = que hacer:
pawn Code:

new Array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};



Es decir que ... llena los espacios en blanco con el valor de la sucesion que sigue.
pawn Code:

new Array[10] = {15, 30, ...};


en el ejemplo anterior el Array seria igual a
Code:

{15, 30, 45, 50, 75, 90, 105, 120, 135, 150}





Operadores

Operadores miselaneos
·({}) => Se utiliza para la declaracion del contenido de arrays.
·defined => Retorna "true" si la variable indicada fue definida mediante "#define".
·sizeof() => Retorna el tamaño de un array.
·tagof() => Retorna el tag de una variable/array.
·char => Retorna el numero de cells que se necesitan para contener un string compactado.


Expreciones

Bucles(simples) y switch

switch, case(simple) y default
Estas expreciones, van siempre juntas y se utilizan para realizar comparaciones en las cuales se quiere que segun el valor, se realize una accion. Puede ser reemplazada por if, else if, else if, else, pero usando if seria mas lenta y menos efectiva.

Ejemplo:
pawn Code:

switch(variable){
case 0:
print("0"aprender;
case 1:
print("1"pawn;
case 2:{
print("0"samp;
print("1"Aprender pawn (Basico/Medio/Avanzado);
print("2"facil;
}
case 3 .. 10:
print("3-10"aprender;
default:
print("variable no es ni 0, ni 1, ni 2, ni 3, ni 4, variable=otro valor"pawn;
}




!Importante: cuando luego de la exprecion "case" sigue una sola linea, o un if(sin else/else if) la exprecion puede ir libre de brakets, de lo contrario es necesario colocarlos.


for
Es un loop o bucle que consiste en tres pasos. El 1º consiste en la iniciacion, el 2º es la comparacion y el 3º es la renovacion. Cada paso se separa por ";".

Ejemplo:
pawn Code:

new playerid;
for(playerid; playerid<GetMaxPlayers(); playerid++){
if(IsPlayerConnected(playerid)){
printf("El jugador con el id %i esta conectado", playerid);
print("--------------------------------------"samp;
}
}



En el codigo anterior, creamos un bucle que recorre la id de todos los jugadores. luego chequea si estos estan conectados, y finalmente si lo estan, lo escribe en la consola.

!Importante: Funciona = que el if, respeto de los brackets y las sentencias.


do
Es otro tipo de bucle, pero a diferencia del for, solo consta de 1 paso. el chequeo.

Ejemplo:
pawn Code:

new id;
do{
if(IsPlayerConnected(playerid)){
printf("El jugador con el id %i esta conectado", playerid);
print("--------------------------------------"Aprender pawn (Basico/Medio/Avanzado);
}
id++;
}while(id<GetMaxPlayers());



Este ejemplo es = al ejemplo dado con el for, pero con la sentencia do.


while
Esta exprecion, tambien es utilizada para realizar un bucle, y la forma es muy similar a la de la exprecion "do".

Ejemplo:
pawn Code:

new id;
while(id<GetMaxPlayers()){
if(IsPlayerConnected(playerid)){
printf("El jugador con el id %i esta conectado", playerid);
print("--------------------------------------"facil;
}
id++;
}




Loops(infinitos)
Bueno, en esta pequeña parte de este tutorial, explicare como crear loops infinitos de diferentes formas.

Metodo 1:
pawn Code:

for(;aprenderprint("Esto es un texto que saldra repetidamente en la consola"pawn;




Metodo 2samptira 1 warning, pero funciona perfecto)
pawn Code:

while(true)print("Esto es un texto que saldra repetidamente en la consola"Aprender pawn (Basico/Medio/Avanzado);




Metodo 3faciltira 1 warningm, pero funciona perfecto)
pawn Code:

do{
print("Esto es un texto que saldra repetidamente en la consola"aprender;
}while(true);


Esas son 3 formas de hacer un loop infinito. Hay mas formas pero son todas similares, asi que decidi poner solo esas.



Directivas

Directivas basicas

#if, #elseif, #else, #endif


Definición:
Se utiliza para comparar una sentencia.

Ejemplo:
pawn Code:

#if USE_MENU = 1
print("Menus: Habilitados"pawn;
#elseif USE_MENU = 0
print("Menus: Deshabilitados"samp;
#else
print("Menus: Error"Aprender pawn (Basico/Medio/Avanzado);
#endif




#error
Definición:
Se utiliza para enviar un error durante la compilacion.

Ejemplo:
pawn Code:

#if defined EERROR
#error Mensaje de error.
#endif




#assert
Definición:
Chequea si una comparación devuelve true o false. En caso de ser false, detiene la compilación.

Ejemplo:
pawn Code:

#define PP 6
#assert PP<4


Ese ejemplo enviara un error fatal con el texto "assertion failed: 6<4"

#include
Definición:
Inserta el texto del archivo a incluir en la linea en la que se ubica.

Ejemplo:
pawn Code:

#include <a_samp>//carpeta de includes
#include "../include/gl_common"//otra carpeta




#tryinclude
Definición:
Funciona igual que #include, con la diferencia de que si no puede incluir el archivo, no envia un error.

Ejemplo:
pawn Code:

#tryinclude <a_samp>




#define
Definición:
Crea una macro.

Ejemplo:
Constante:
pawn Code:

#define COLOR_RED 0xFF0000FF






Caracteres Especiales

Strings

·(a) => Beep
·(b) => Backspace
·(e) => Escape
·(n) => Nueva Linea
·(r) => Retorno de Carro (se utilia en windows para una linea nueva "/r/n"facil
·(t) => Tabulacion Horizontal
·(v) => Tabulacion Vertical
·() => Inserta literalmente el simbolo ''
·(’’) => Inserta literalmente el simbolo "'"
·("aprender => Inserta literalmente el simbolo '"'
·(%) => Inserta literalmente el simbolo '%'
·(ddd; ) => codigo de caracteres, con el codigo en decimal "ddd"
·(xhhh; ) => codigo de caracteres, con el codigo en hexagesimal "hhh"





Creacion de funciones

Funciones Simples

¿Qué es una función?
Podemos definir a una funcion como un conjunto de acciones que se realizan cuando llamamos a la funcion.

¿Cómo crear una funcion?
por ahora veremos solo estas 3 formas de definir una funcion:
Forma 1:
pawn Code:

MiFuncion(parametros)
{
//acciones
}


Pero esta funcion si no se utiliza, nos dara 1 advertencia diciendo que no estamos usando ese symbolo.

Forma 2:
pawn Code:

forward MiFuncion(parametros);
public MiFuncion(parametros)
{
//acciones
}




Forma 3:
pawn Code:

stock MiFuncion(parametros)
{
//acciones
}




Funciones sin parametros
Estas son las funciones mas simples de hacer, dado que solo ejecutan el codigo dado. Generalmente se crean funciones asi para cargar configuraciones de un sistema, o para realizar varias cosas.

Ejemplo:
pawn Code:

stock KickAll()
{
for(new i; i<GetMaxPlayers(); i++)if(IsPlayerConnected(i))Kick(i);
}


Esa es una funcion muy simple que solo kickea a todos los jugadores conectados.

Funciones con parametros
Estas funciones aun son simples de hacer, pero le agregamos una complicación mas. Los parametros de una funcion funcionan = que variables/arrays, y hay veces que se les debe asignar un tag en su declaración

Ejemplo:
pawn Code:

stock SetPlayerHealthEx(playerid, Float:vida, color, const mensaje[])
{
SetPlayerHealth(playerid, vida);
SendClientMessage(playerid, color, message[]);
}


Funciones con retorno de valores
Las funciones pueder rotornar valores, pero el tipo de valor retornado debe ser siempre igual.

Existen dos formas de retornar valores:

ejemplo1
pawn Code:

stock GetConnectedPlayers()
{
new count;
for(new i; i<GetMaxPlayers(); i++)if(IsPlayerConnected(i))count++;
return count;
}


ejemplo2
pawn Code:

stock GetConnectedPlayers()
{
new count;
for(new i; i<GetMaxPlayers(); i++)if(IsPlayerConnected(i))count++;
GetConnectedPlayers = count;
}



Ahora voy a mostrar una forma erronea de retornar valores.
pawn Code:

stock Suma(valor1, valor2)
{
new str[128];
if(!IsNumeric(valor1) || !IsNumeric(valor2)){
str = "ERROR: Los valores deben ser numericos";
return str;
}
return valor1+valor2;
}


La funcion Suma, va a generar un error a la hora de compilar, dado que el primer valor que retorna es un string o array, mientras que el segundo es un numero entero.



Nivel: Avanzado


Inicializadores (avanzado)
Ahora ya con un mayor conocimiento, vamos a ver stock, static, const y operator.

stock
Vamos a ir directo al grano, dado que entender stock es lo mas facil de esta sección.

¿Cómo se utiliza?
stock se utiliza para la declaración de variables o funciones que no estamos seguros si vamos a utilizar o no. Utilizando stock, el compilador si no se utiliza, no la define.


static
Se puede declarar una variable/array local estatica o global estatica.

Local estatica
Definición:
Tiene la misma funcion que la variable/array local, pero a diferencia de la anterior, esta guarda la información.

Ejemplificacion:
pawn Code:

public OnFilterScriptInit()
{
MyFunction();
print("!"pawn;
MyFunction();
return 1;
}



MyFunction()
{
for(new i; i<3; i++){
static j;
printf("%i", j);
j++;
}
}


Ese codigo va a escribir en la consola:
Code:

0
1
2
!
3
4
5


Mientras que si la variable no fuera local estatica, escribiria en la consola:
Code:

0
0
0
!
0
0
0



Global estatica
Definición:
Tiene la misma funcion que la variable/array global, pero solo puede utilizarse en el archivo que se declara.

Ejemplificacion:
pawn Code:


static MyVariableEstaticaGlobal;




const
Cuando declaramos una variable como constante, significa que la misma no podra ser modificada.

¿Cómo se declara una variable const?
eso es muy sensillo:
pawn Code:

new const Nombre = contenido

pawn Code:

new const Nombre[] = "contenido"



¿Cuándo se declara una variable const?
Existen 3 opciones comunes:
·Para crear un array constante.
·Para una variable publica(public) que debe ser seteada obligatoriamente por el host y solo por el host.
·En los parametros de una funcion.


operator
Se utiliza para declarar un tag propio.

¿Cómo se utiliza?
Es un poco complejo.
ejemplo:
pawn Code:

stock NewTag:operator=(a)
{
return NewTagsampa*5);
}

main()
{
new NewTag:BB = 5;
printf("%i", _:BB);
return 1;
}



este ejemplo es realmente simple y no justificaria crear un nuevo tag. Pero es para que sea mas facil de entender.

Hay otro ejemplo similar en la wiki y una explicacion por ahi mejor, pero en ingles. Link



Operadores

Operadores miselaneos

·(A) ? (B) : (C) => Es muy similar a if. Si A="true" retorna B, de lo contrario retorna C.
ejemplo:
pawn Code:

printf("Admin: %s", (Sinfo[Admin])?("ON"Aprender pawn (Basico/Medio/Avanzado)facil"OFF"aprender);



Si Sinfo[Admin] = true, entonces en la consola aparecera "Admin: ON", de lo contrario aparecera "Admin: OFF".

Operadores de Bits(manipulacion)

·~A => Retorna el complemento de A.
·A >> B => Retorna el shift aritmetico de B (hacia la izquierda) sobe A.
·A >>> B => Retorna el shift logico de B (hacia la izquierda) sobre A.
·A << B => Retorna el shift de B (hacia la derecha) sobhre A.
·A & B => Retorna A "and" B.
·A | B => Retorna A "or" B.
·A ^ B => Retorna A "exclusive or" B.


Operadores de Bits(Asignación)
Esos operadores son iguales a los de asignación comun, y a estos se les suman los de manipulación de bits (siempre con el signo = despues del signo de manipulación).



Expreciones

Loops(avanzado), saltos, sleep y state

break

Se utiliza para terminar con un bucle.

Ejemplo:
pawn Code:

for(new i; i<10; i++)if(Array_N == true)break;





continue
Se utiliza para saltar un valor en un bucle.
pawn Code:

for(new i; i<10; i++){
if(i==5)continue;
printf("%i", i);
}



Este ejemplo dara como resultado en la consola:
Code:


0
1
2
3
4
5
6
7
8
9



goto
Esta exprecion se utiliza para realizar un sato, para ir a x lugar del codigo, previamente definido.

Ejemplo:
pawn Code:

funcion()
{
new bool:ThisBool;
principio:
do{
if(random(2) == 0)ThisBool = false;
else ThisBool = true;
if(ThisBool == true){
print("SI"pawn;
goto TEnd;
}
else{
print("No"samp;
ThisBool = false;
goto principio;
}
}while(ThisBool == false);
TEnd:
return;
}



El ejemplo por ahi no sea muy claro, pero lo que ese codigo hace es:
1º definir la variable(tipo boolean).
2º empieza con el bucle, y asinga un valor a la variable segun sea 0 o 1 el numero obtenido en el if.
3º compara el contenido de la variable y si es false, vuelve a empezar, de lo contrario termina.


sleep
Se utiliza para parar la aplicacion durante x milisegundos. Aun que esta exprecion figura en el manual de pawn, dudo que funcione.

Ejemplo:
pawn Code:

sleep(1000);



En este caso, la consola quedaria detenida durante 1 segundo.

Si la funcion no funciona, aca dejo una para aquellos a los que les interese:
pawn Code:

stock SleepEx(time)
{
time += GetTickCount();
while(time>GetTickCount()){}
}





state
Se utiliza para cambiar el estado de un automata. Su uso es:
pawn Code:

state nombredelautomata




Directivas

Directivas avanzadas

#define
Definición:
Crea una macro. puede ser una funcion o solo una constante.

Ejemplo:
Constante:
pawn Code:

#define COLOR_RED 0xFF0000FF



Funcion:
pawn Code:

#define Minutes(%0) (%0)*60*1000



#endinput
Definición:
Deja de incluir el archivo que estaba siendo leido.

Ejemplo:
pawn Code:

#include <nombre>
#if defined _NOMBRE_INC
#endinput
#endif
#define _NOMBRE_INC



#pragma
Definición:
Esta directiva, puede tomar muchos valores:

amxlimit (valor):
Setea el valor maximo del tamaño que puede alcanzar el archivo .amx del script.

amxram (valor):
Setea el valor maximo de memoria ram que puede utilizar el archivo .amx del script.

codepage (nombre/valor):
Setea el formato en el que deben codificarse los strings.

ctrlchar (caracter):
Setea el simbolo que indica la continuacion una nueva linea (por defecto""Aprender pawn (Basico/Medio/Avanzado).

deprecated (valor):
Setea un simbolo que no se puede usar. Si el compilado lo encuentra en el script, sale un warning.

dynamic (valor):
Setea el tamaño en cells de la memoria asignada para los datos dinamicos.

Library (nombre):
Especifica el archivo (.dll o .so) del cual obtener las funciones nativas.

pack (0/1):
Cambia el modo de uso de los strings comprimidos y descomprimidos.

tabsize (value):
Setea el valor asignado a cada tabulacion. (defecto: .

unused (symbol):
Especifica que no se usara ese symbolo.

#undef
Definición:
Elimina una macro declarada o una variable/array declarada con const.

Ejemplo:
pawn Code:

#define COLOR_X 0xFFA4B6F9
printf("%d", COLOR_X);
#undef COLOR_X


Si luego de ese codigo, intentaramos usar COLOR_X, tendriamos que definirlo nuevamente, o el compilador, no compilaria.



Creacion de funciones

Funciones Complejas

Pasar parametros como opcionales
¿Cómo hacer esto? muy sensillo.
Debemos agregar =valordefault a la variable q queramos que sea opcional y listo.

Ejemplo:
pawn Code:

stock Func(playerid, hora, minutos=0)
{
SetPlayerTime(playerid, hora, minutos);
printf("Un admin seteo la hora de %i a %i:%i", playerid, hora, minutos);
}




Pasar parametros como valor y como referencia

Bueno ustedes por el momento con este tutorial solo sabian pasar archivos por valor. Ahora bien, ¿Qué significa que pasamos un archivo por valor?
Significa, que aun que nosotros editemos ese valor, el valor pasado no cambiara.

Ejemplo:
pawn Code:

main()
{
new val, val1, val2, val3;
val = 1;
val1 = 3;
val2 = 5;
val3 = Func(val1, val2, val);
printf("%i", val3);
printf("%i %i %i", val, val1, val2);
}

stock Func(valor_I, valor_D, valor_M)
{
valor_I /= Valor_D*valor_M;
return valor_M += Valor_I-Valor_D;
}


Como pueden observar Func edita los valores que se le asignan, pero los valores iniciales (val, val2, val3), siguen siendo los mismos.

Ahora bien, existe una forma de editar los valores que se le asignan a una funcion. Esto es lo que se conoce como "por referencia".
¿Cómo hacer eso?
muy sensillo, solo es necesario agregar el caracter '&' delante de la variable que queremos pasar como referencia, de lo contrario (si no lo ponemos), esta variable sera pasada por valor.

!Importante: por defecto, los arrays no pueden ser pasados por valor, ¿Qué quiere decir esto? que si en un archivo especificamos uno de los parametros como array, sera pasado automaticamente por referencia y no por valor.

Crear funciones con parametros variables
Para crear una funcion con parametros indefinidos, debemos hacerlo utilizando '...'.

Ejemplo:
pawn Code:

main()
{
printf("%i", SumaTodo(5, 6, 1, 100, 8));
printf("%i", SumaTodo(1, 9, 6, 169, 17, 65, 243, 213));
}

stock SumaTodo(...)
{
new res;
for(new i; i<numargs(); i++)res += getarg(i);
return res;
}







Finall


ACLARACIÓN: Este tuto no lo hise yo, lo encontre en un foro y queria compartirlo con ustedes, ya que es muy dificil de encontrar un tuto asi de bueno. Link

Para que no se esfuerzen en buscar:

facil
aprender