[Tutorial] Guнa bбsica de SA-MP y Pawn
#1

GUНA BБSICA DE SA-MP Y PAWN

INTRO:

Esta guнa esta basada en diversas guнas y en mi propia experiencia. Guнa creada especialmente para nuevos scripters y usuarios a los que les gustarнa aprender sobre el lenguaje Pawn en SA-MP; explicando solo lo bбsico y cуmo empezar.

* Nota: es importante que el usuario tenga el mayor conocimiento posible del idioma inglйs, dado que el lenguaje de programaciуn Pawn estб basado en este idioma.

Esta guнa estб basada en el estado de SA-MP a inicios del aсo 2015, si usted lee esto en otro tiempo es probable que algunos elementos hayan cambiado y/o actualizado.

Basado en:

Nicholas tutorial
Kwarde tutorial
Wiki SA-MP

Conocimiento propio.



НNDICE:

INICIANDO
Explicando cada archivo y carpeta (solo los bбsicos)
scriptfiles
plugins
pawno
npcmodes
include
gamemodes
filterscripts
announce.exe
samp-npc.exe
samp-server.exe
server.cfg
CONFIGURACIУN

PAWN SCRIPTING
Publics
public OnGameModeInit()
public OnGameModeExit()
public OnPlayerRequestClass(playerid, classid)
public OnPlayerConnect(playerid)
public OnPlayerSpawn(playerid)
public OnPlayerDeath(playerid)
public OnPlayerDisconnect(playerid, reason)
public OnPlayerText(playerid)
public OnPlayerUpdate(playerid)
Funciones
SetPlayerPos(playerid, X, Y, Z);
TextDrawCreate(X, Y, text[])
Dialogs (menъs & otros)
ShowPlayerDialog(playerid, dialogid, style, caption[], info[], button1[], button2[]);
Dialog de cuadro (envнa un mensaje al jugador)
Dialog de texto (permite a los jugadores colocar texto en el dialog)
Dialog de lista (menъ, muestra a los jugadores una lista de opciones)
Dialog de contraseсa (permite a los jugadores colocar texto en el dialog, sin revelar el texto)
CREANDO Y REMOVIENDO OBJETOS
Map editor (1 & 2)
Empezando
Creando objectos
Removiendo objectos
MTA editor
Empezando
Delux GTA Map Converter v2
Creando Objectos
Instalar Streamer
EMPIECE A PRACTICAR



INICIANDO:

Primero debe descargar el archivo SA-MP Windows Server desde SA-MP.com

Despuйs de descargarlo y descomprimirlo, veremos estos archivos...

Archivos y carpetas bбsicos:

scriptfiles, plugins, pawno, npcmodes, include, gamemodes, filterscripts, announce.exe, samp-npc.exe, samp-server.exe & server.cfg

Otros archivos:

Textos que incluyen tйrminos de servicio y una guнa de configuraciуn (samp-license.txt & server-readme.txt respectivamente).

Explicando cada archivo y carpeta (solo los bбsicos):

scriptfiles: esta carpeta contiene informaciуn llamada dentro del script o logs producidos por el script. Normalmente es usada como base de datos.

plugins: esta carpeta contiene cуdigos adicionales que dan mбs opciones en la programaciуn, usualmente programados en otros lenguajes de programaciуn. Esta guнa no darб informaciуn detallada sobre plugins debido a que es mбs avanzado.

pawno: contiene el programa bбsico para empezar a programar en SA-MP; tambiйn tiene la carpeta include que contiene los includes bбsicos de SA-MP para empezar nuestro script (funciones bбsicas de SA-MP). Tambiйn podemos crear nuestros propios includes y aсadirlos al script.

npcmodes: contiene informaciуn sobre NPCs (script & rec); esta guнa no darб informaciуn detallada sobre NPCs debido a que es mбs avanzado.

include: contiene cуdigos que pueden ser incluidos en el script.

gamemodes: contiene los modos de juego bбsicos y si creamos uno debemos colocar aquн tambiйn.

filterscripts: contiene cуdigos adicionales, separados del gamemode, no estбn incluidos dentro de йl y pueden ser llamados al usar comandos rcon.

announce.exe: este archivo nos permitirб mostrar nuestro servidor en la lista de Internet.

samp-npc.exe: nos permitirб usar NPCs.

samp-server.exe: con este archivo iniciamos el servidor.

server.cfg: configuraciуn del servidor.

CONFIGURACIУN:

Primero debemos abrir el archivo "server.cfg" y editar la configuraciуn del servidor.

Al abrirlo encontraremos:

Код:
echo Executing Server Config...
lanmode 0
rcon_password changeme
maxplayers 50
port 7777
hostname SA-MP 0.3 Server
gamemode0 grandlarc 1
filterscripts gl_actions gl_realtime gl_property gl_mapicon ls_mall ls_elevator attachments skinchanger vspawner
announce 0
query 1
chatlogging 0
weburl www.sa-mp.com
onfoot_rate 40
incar_rate 40
weapon_rate 40
stream_distance 300.0
stream_rate 1000
maxnpc 0
logtimeformat [%H:%M:%S]
Puede editar la configuraciуn basado en esto:

Код:
echo Executing Server Config...
lanmode 0 (lan mode activada "1" o desactivada "0")
rcon_password changeme (la contraseсa que usarб al colocar "/Rcon login"; debe editar esto) 
maxplayers 50 (cantidad permitida de jugadores, slots)
port 7777 (el puerto que usarб; por ejemplo: 127.0.0.1:7777)
hostname SA-MP 0.3 Server (el nombre de su servidor)
gamemode0 grandlarc 1 (el nombre del gamemode que usarб, puede aсadir un gamemode si usted crea o descarga uno)
filterscripts gl_actions gl_realtime gl_property gl_mapicon ls_mall ls_elevator attachments skinchanger vspawner (los "filterscripts" que usarб)
announce 0 (servidor visible en la lista de Internet; "1" para activar y "0" para desactivar)
query 1 (informaciуn del servidor visible "1"; "0" no enviarб informaciуn del servidor a los jugadores externos)
chatlogging 0 (guardar conversaciones en el archivo server_log.txt; para guardarlas use "1", para no guardarlas use "0")
weburl www.sa-mp.com (pбgina web del servidor)
onfoot_rate 40 (no se explicarб en esta guнa, es avanzado)
incar_rate 40 (no se explicarб en esta guнa, es avanzado)
weapon_rate 40 (no se explicarб en esta guнa, es avanzado)
stream_distance 300.0 (no se explicarб en esta guнa, es avanzado)
stream_rate 1000 (no se explicarб en esta guнa, es avanzado)
maxnpc 0 (mбximo nъmero de NPCs que pueden entrar al servidor)
logtimeformat [%H:%M:%S]
Tambiйn puede leer mбs sobre el archivo server.cfg y su configuraciуn.

Ejemplo de configuraciуn (la guнa estб basada en esta configuraciуn):

Код:
echo Executing Server Config...
lanmode 0
rcon_password Pawn
maxplayers 100
port 7777
hostname SA-MP Server [0.3z]
gamemode0 Basic 1
filterscripts gl_actions gl_realtime gl_property gl_mapicon ls_mall ls_elevator attachments skinchanger vspawner
announce 1
query 1
chatlogging 1
weburl www.sa-mp.com
onfoot_rate 40
incar_rate 40
weapon_rate 40
stream_distance 300.0
stream_rate 1000
maxnpc 0
logtimeformat [%H:%M:%S]
PAWN SCRIPTING:

Despuйs de editar la configuraciуn empezaremos a programar el modo de juego.

En este caso usaremos un gamemode bбsico que pueden descargar aquн.

Deben colocarlo dentro de la carpeta gamemodes.

Despuйs de hacer esto deben abrir la carpeta pawno, dentro de su servidor, y abrir el archivo "pawno.exe".

Presione "File/Open" (o simplemente CTRL + O) y abra su gamemode, colocado dentro de la carpeta gamemodes.

Dentro tenemos esto:

pawn Код:
#include <a_samp>
Este es el include bбsico de SA-MP, debe estar incluido en cada script que usted cree en el бmbito de SA-MP.

Este es el mensaje que serб mostrado en consola al abrir el archivo samp-server.exe:

pawn Код:
main()
{
print("Script desarrollado por Ygzeb.");
}
El texto azul es el mensaje que serб mostrado.

Puede editar el texto que serб mostrado en consola al encender su servidor, simplemente cambiando el texto azul; por ejemplo:

pawn Код:
main()
{
print("ЎMi primer script!");
}
* Nota: Todos los cуdigos deben tener llaves abiertas y cerradas al empezar y terminar la funciуn.

Ejemplo:

Llaves abiertas = Rojo
Llaves cerradas = Verde

Код:
main()
{
print("ЎMi primer script!");
}
* Nota: ЎEs muy importante que despuйs de realizar un cambio en el script presione F5! Esto actualizarб el archivo AMX y los cambios realizados quedarбn guardados ("si no hay error alguno", aunque en casos especiales hay errores de programaciуn que no figurarбn y afectarбn al servidor internamente). Si todo anda bien verб algo parecido a esto:



De lo contrario significa que el script tiene errores, hizo algo mal y debe corregirlo.

Publics:

Los publics son funciones bбsicas que son llamadas mientras su servidor estб encendido, en momentos precisos.
SA-MP cuenta con publics bбsicos que son llamados en la mayorнa de servidores. Normalmente el nombre de un public describe cuбndo se ejecuta el public.

Algunos publics son llamados en momentos especiales, por ejemplo al spawnear; puede aсadir una funciуn a ese momento en especнfico.

Por ejemplo, si queremos cambiar la vida de los jugadores a 50 al spawnear, usarнamos algo como:

pawn Код:
public OnPlayerSpawn(playerid)
{
   SetPlayerHealth(playerid, 50);
   return 1;
}
* Nota: no podemos usar publics idйnticos en un mismo script; por ejemplo dos publics OnPlayerSpawn. Si queremos aсadir una funciуn adicional debemos agregarla en el mismo public o en un filterscript. Basбndonos en el ejemplo anterior, aсadiremos un mensaje al spawnear:

pawn Код:
public OnPlayerSpawn(playerid)
{
   SetPlayerHealth(playerid, 50);
   SendClientMessage(playerid, -1, "ЎSpawneaste!"); // Funciуn aсadida.
   return 1;
}
Algunos publics que son usados comъnmente:

public OnGameModeInit() - Llamado al iniciar el gamemode.

Informaciуn adicional: https://sampwiki.blast.hk/wiki/OnGameModeInit

Estructura bбsica:

pawn Код:
public OnGameModeInit()
{
    // Aquн va el cуdigo.
    return 1;
}
Ejemplo:

pawn Код:
public OnGameModeInit()
{
    UsePlayerPedAnims(); // Permite a los jugadores correr como CJ.
    SetGameModeText("Blank"); // Nombre del modo, serб mostrado en la lista de servidores.
    AddPlayerClass(115, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    AddPlayerClass(122, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    AddPlayerClass(166, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    AddPlayerClass(270, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    return 1;
}
AddPlayerClass es una funciуn que permite aсadir personajes en la selecciуn de personaje; por ejemplo si queremos aсadir el personaje de Sweet, debemos aсadir esto en nuestro gamemode:

pawn Код:
AddPlayerClass(270, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
El nъmero "270" el ID del personaje de Sweet.

public OnGameModeExit() - Llamado al finalizar el gamemode; no es obligatorio en el script (opcional en la mayorнa de casos).

Informaciуn adicional: https://sampwiki.blast.hk/wiki/OnGameModeExit

Estructura bбsica:

pawn Код:
public OnGameModeExit()
{
    // Aquн va el cуdigo.
    return 1;
}
Ejemplo:

pawn Код:
public OnGameModeExit()
{
    print("Mode ended."); // Mensaje a la consola.
    return 1;
}
public OnPlayerRequestClass(playerid, classid) - Llamado en la selecciуn de personaje.

Informaciуn adicional: https://sampwiki.blast.hk/wiki/OnPlayerRequestClass

Estructura bбsica:

pawn Код:
public OnPlayerRequestClass(playerid, classid)
{
    // Aquн va el cуdigo.
    return 1;
}
Ejemplo:

pawn Код:
public OnPlayerRequestClass(playerid, classid)
{
    SetPlayerPos(playerid, 2294.2810, 558.2053, 7.7813); // Posiciуn del personaje.
    SetPlayerCameraPos(playerid, 2294.3071, 560.6948, 8.7324); // Posiciуn de la cбmara.
    SetPlayerCameraLookAt(playerid, 2294.2810, 558.2053, 7.7813); // Lugar a donde la cбmara seсala.
    SetPlayerFacingAngle(playerid, 0);
    return 1;
}
SetPlayerFacingAngle cambia el бngulo hacia donde el personaje observa; su estructura es:

Код:
playerid = ID del jugador
0 = бngulo (en este caso norte).

    norte (0)
           |
(90) oeste-   -este (270)
           |
        sur (180)
Mayor informaciуn sobre SetPlayerFacingAngle.

public OnPlayerConnect(playerid) - Llamado cuando un jugador se conecta.

Informaciуn adicional: https://sampwiki.blast.hk/wiki/OnPlayerConnect

Estructura bбsica:

pawn Код:
public OnPlayerConnect(playerid)
{
    // Aquн va el cуdigo.
    return 1;
}
Ejemplo:

pawn Код:
public OnPlayerConnect(playerid)
{
    PlayAudioStreamForPlayer(playerid, "http://s1.radio.ge/Music/AcDc/1980_Back_In_Black/06_Back_In_Black.mp3");   // Iniciarб la canciуn Back in Black, AC/DC
    return 1;
}
PlayAudioStreamForPlayer es una funciуn que reproduce un sonido externo al jugador. Su estructura es:

Код:
playerid = ID del jugador
"http://s1.radio.ge/Music/AcDc/1980_Back_In_Black/06_Back_In_Black.mp3" = link del audio
* Nota: el audio debe estar en un formato en especнfico para funcionar, por ejemplo este link.

Puede encontrar mъsica en muchas pбginas. Por ejemplo en esta web.

public OnPlayerSpawn(playerid) - Llamado despuйs de seleccionar personaje, al spawnear. Estas funciones afectarбn al jugador al spawnear.

Informaciуn adicional: https://sampwiki.blast.hk/wiki/OnPlayerSpawn

Estructura bбsica:

pawn Код:
public OnPlayerSpawn(playerid)
{
    // Aquн va el cуdigo.
    return 1;
}
Ejemplo:

pawn Код:
public OnPlayerSpawn(playerid)
{
   SendClientMessage(playerid, -1, "ЎSpawn!"); // Envнa un mensaje al jugador.
   return 1;
}
SendClientMessage es una funciуn que envнa un mensaje al jugador; su estructura es:

Код:
playerid = ID del jugador
-1 = Color, -1 es blanco
"ЎSpawn!" = mensaje
Mayor informaciуn sobre SendClientMessage.

public OnPlayerDeath(playerid) - Llamado al morir. Esta funciуn afectarб al jugador al morir.

Informaciуn adicional: https://sampwiki.blast.hk/wiki/OnPlayerDeath

Estructura bбsica:

pawn Код:
public OnPlayerDeath(playerid)
{
    // Aquн va el cуdigo.
    return 1;
}
Ejemplo:

pawn Код:
public OnPlayerDeath(playerid)
{
   GameTextForPlayer(playerid, "Asesinado", 5000, 2); // Envнa un mensaje en pantalla al jugador.
   return 1;
}
GameTextForPlayer envнa un mensaje en pantalla al jugador; su estructura es:

Код:
playerid = ID del jugador
"Asesinado" = mensaje
5000 = tiempo en mili-segundos; en este caso 5 segundos.
2 = tipo de mensaje
Mayor informaciуn sobre GameTextForPlayer.

public OnPlayerDisconnect(playerid, reason) - Llamado al desconectarse el jugador.

Informaciуn adicional: https://sampwiki.blast.hk/wiki/OnPlayerDisconnect

Estructura bбsica:

pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
    // Aquн va el cуdigo.
    return 1;
}
Ejemplo:

pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
    // Enviando un mensaje a todos que el jugador se desconectу.
    new String[64], // Variable asignada al mensaje. 64 es el nъmero de caracteres que usarб el mensaje (tal vez mбs que el mensaje).
    Nombre[MAX_PLAYER_NAME];  // Variable asignada al nombre del jugador; normalmente definida como MAX_PLAYER_NAME.
    GetPlayerName(playerid, Nombre, MAX_PLAYER_NAME); // Obteniendo el nombre del jugador (Nombre) y el nъmero de caracteres que usa, normalmente definido como MAX_PLAYER_NAME (definido por SA-MP por defecto).
    format(String, sizeof String, "%s saliу.", Nombre); // Aplicando un formato al mensaje.
    SendClientMessageToAll(-1, String); // Enviando un mensaje a todos los jugadores; String es el formato que tendrб el mensaje.
    return 1;
}
public OnPlayerText(playerid) - Llamado cuando el jugador envнa un mensaje (chat).

Informaciуn adicional: https://sampwiki.blast.hk/wiki/OnPlayerText

Estructura bбsica:

pawn Код:
public OnPlayerText(playerid, text[])
{
    // Aquн va el cуdigo.
    return 1;
}
Ejemplo:

pawn Код:
public OnPlayerText(playerid, text[])
{
    new Nombre[MAX_PLAYER_NAME], String[175];
    GetPlayerName(playerid, Nombre, sizeof(Nombre));
    format(String, sizeof(String), "%s [%d]: {FFFFFF}%s", Nombre, playerid, text); // Aplicando formato.
    SendClientMessageToAll(GetPlayerColor(playerid), String); // Enviando el mensaje con GetPlayerColor, que es el color actual del jugador.
    return 0; // Ignorando el texto por defecto, terminando la funciуn.
}
Esta funciуn es el formato aplicado a SendClientMessageToAll. Cuando sea enviado seguirб el formato:

pawn Код:
format(String, sizeof(String), "%s [%d]: {FFFFFF}%s", Name, playerid, text);
Код:
%s y %d son valores asignados dependiendo del jugador.
%s es un valor textual (en este caso el nombre del jugador y el texto).
%d es un valor numйrico (ID del jugador).
pawn Код:
format(String, sizeof(String), "%s [%d]: {FFFFFF}%s", Name, playerid, text);
Nombre, ID & texto son los valores asignados a %s, %d y %s.

public OnPlayerUpdate(playerid) - Llamado cada vez que el usuario envнa su estado al servidor.

Informaciуn adicional: https://sampwiki.blast.hk/wiki/OnPlayerUpdate

Estructura bбsica:

pawn Код:
public OnPlayerUpdate(playerid)
{
    // Aquн va el cуdigo.
    return 1; // Si retorna 0, el cliente no serб actualizado para los demбs jugadores (como si estuviese pausado).
}
Ejemplo:

pawn Код:
public OnPlayerUpdate(playerid)
{
    if(GetPlayerWeapon(playerid) == 38) return Kick(playerid); // Expulsarб al jugador si usa una minigun.
    return 1;
}
"if" para detectar si una situaciуn en especial estб ocurriendo; en caso de ser asн el servidor ejecutarб una funciуn determinada.

Traduciendo esto a nuestro idioma, serнa algo como:

ЎSi estб usando minigun, expъlsalo!

* Nota: usar "if" en OnPlayerUpdate puede causar lag, esto es solo un ejemplo.

Usar la funciуn return con "Kick(playerid);" significa que la funciуn termina ahн. Si tiene otro cуdigo bajo esta funciуn, no serб ejecutado si esta funciуn es llamada.

Por ejemplo:

pawn Код:
public OnPlayerUpdate(playerid)
{
    if(GetPlayerWeapon(playerid) == 38) return Kick(playerid);
    SendClientMessage(playerid, -1, "ЎActualizado!"); // Esta funciуn no serб ejecutada si el jugador estб usando minigun.
    return 1;
}

Funciones:

Bбsicamente, la mayorнa de funciones (funciones nativas/bбsicas de SA-MP) describen lo que hacen en su nombre; puede encontrar muchas de ellas aquн.

Algunas funciones bбsicas que son usadas mayormente:

SetPlayerPos(playerid, X, Y, Z); - Cambia la posiciуn del jugador (X, Y & Z son los puntos donde moverб al jugador).

Informaciуn adicional: https://sampwiki.blast.hk/wiki/SetPlayerPos

Ejemplo:

pawn Код:
SetPlayerPos(playerid, 0.0, 0.0, 3.0); // Cambia la posiciуn del jugador al campo.
Puede guardar su posiciуn actual usando /Save dentro del juego (comando por defecto de SA-MP). Despuйs de esto debe ir a "\GTA San Andreas User Files\SAMP" y abrir el archivo "savedpositions.txt". Dentro encontrarб algo parecido a:

pawn Код:
AddPlayerClass(270, 700, 700, 5, 0, 0, 0, 0, 0, 0, 0);
Luego simplemente copie los valores en rojo:

Код:
AddPlayerClass(270, 700, 700, 5, 0, 0, 0, 0, 0, 0, 0);
* Nota: obviamente los valores no son rojos, solo es un ejemplo.

Luego pegue los valores dentro de la funciуn SetPlayerPos; asн:

Код:
SetPlayerPos(playerid, 700, 700, 5);
Tambiйn puede usar este sistema que lo programarб por usted.

TextDrawCreate(X, Y, text[]) - Crea un textdraw (X & Y son las coordenadas de la pantalla y "text" es el texto que mostrarб).

Informaciуn adicional: https://sampwiki.blast.hk/wiki/TextDrawCreate

Ejemplo de textdraw:

pawn Код:
new Text:Textdraw0;

public OnGameModeInit()
{
    Textdraw0 = TextDrawCreate(240.0, 580.0, "SA-MP 0.3z"); // Esto crea un textdraw sin modificar.
    return 1;
}
Una forma sencilla de usar esta funciуn es con un Editor de Textdraw.

Para mostrar un textdraw al jugador debe usar la funciуn TextDrawShowForPlayer.

Ejemplo de uso (basado en el ejemplo anterior):

pawn Код:
public OnPlayerConnect(playerid)
{
    TextDrawShowForPlayer(playerid, Textdraw0);
}
Para esconder el textdraw del jugador debe usar la funciуn TextDrawHideForPlayer.

Ejemplo:

pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
    TextDrawHideForPlayer(playerid, Textdraw0);
    return 1;
}
Y para destruir el textdraw debe usar TextDrawDestroy.

Ejemplo:

pawn Код:
public OnGameModeInit()
{
    TextDrawDestroy(Textdraw0);
    return 1;
}

Dialogs (menъs & otros):

ShowPlayerDialog(playerid, dialogid, style, caption[], info[], button1[], button2[]); - Muestra al jugador un dialog.

Informaciуn adicional: https://sampwiki.blast.hk/wiki/ShowPlayerDialog

* Nota: Todo dialog necesita un ID ъnico (dialogid); a no ser que no use dicho ID en el public OnDialogResponse (los dialogs de filterscripts e includes debe usar tambiйn un ID ъnico).

Hay cuatro tipos de dialogs:

Dialog de cuadro (envнa un mensaje al jugador):



Ejemplo (con el botуn de cancelar):

pawn Код:
if(!strcmp(cmdtext, "/Ayuda", true))
{
    new Menu[187]; // Nъmero de caracteres que usarб dentro del dialog (todos los caracteres).
    Menu[0]='\0'; // Variable del dialog, definida antes.
    strcat(Menu, "Este es el texto que serб mostrado dentro del dialog. Puede aсadir otra\n", 73); // 73 es el nъmero de caracteres en esta lнnea.
    strcat(Menu, "lнnea usando el sнmbolo de la lнnea anterior (n). No necesita\n", 137); // 137 es el nъmero de caracteres en otras lнneas sumado a esta lнnea.
    strcat(Menu, "colocar el sнmbolo en la ъltima lнnea del dialog.", 187); // Estos son todos los caracteres usados en el dialog.
    ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX, "Ayuda de dialog", Menu, "Aceptar", "Cancelar");
    return 1;
}
Cada lнnea tiene caracteres; la primera lнnea tiene 73 caracteres asн que ponemos 73 al final.

En la segunda y todas las lнneas posteriores debemos contar los caracteres de dicha lнnea sumado con los caracteres de las otras lнneas. En el caso de la segunda lнnea es 137 por lo que pondremos eso al final.

Ejemplo (sin el botуn de cancelar):

pawn Код:
if(!strcmp(cmdtext, "/Ayuda", true))
{
    new Menu[187]; // Nъmero de caracteres que usarб dentro del dialog (todos los caracteres).
    Menu[0]='\0'; // Variable del dialog, definida antes.
    strcat(Menu, "Este es el texto que serб mostrado dentro del dialog. Puede aсadir otra\n", 73); // strcat junta el string de Menu, sumado con el string del texto.
    strcat(Menu, "lнnea usando el sнmbolo de la lнnea anterior (n). No necesita\n", 137); // Todas las lнneas usan strcat.
    strcat(Menu, "colocar el sнmbolo en la ъltima lнnea del dialog.", 187);
    ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX, "Ayuda de dialog", Menu, "Aceptar", ""); // En lugar de cancelar, dejamos el segundo botуn solo con "".
    return 1;
}
La funciуn strcat junta el string de Menu, sumado con el string del texto.

* Nota: Puede usar pбginas para contar caracteres.

Cuando cuenta los caracteres solo debe tomar en cuenta los que estбn entre ""; por ejemplo:

Код:
if(!strcmp(cmdtext, "/Ayuda", true))
{
    new Menu[187];
    Menu[0]='\0';
    strcat(Menu, "Este es el texto que serб mostrado dentro del dialog. Puede aсadir otra\n", 73);
    strcat(Menu, "lнnea usando el sнmbolo de la lнnea anterior (n). No necesita\n", 137);
    strcat(Menu, "colocar el sнmbolo en la ъltima lнnea del dialog.", 187);
    ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX, "Ayuda de dialog", Menu, "Aceptar", "");
    return 1;
}
La \n tambiйn cuenta.

Tambiйn podemos aсadir una funciуn al presionar "Aceptar" o "Cancelar" dentro del public OnDialogResponse.

Por ejemplo:

pawn Код:
if(!strcmp(cmdtext, "/Ayuda", true))
{
    new Menu[187];
    Menu[0]='\0';
    strcat(Menu, "Este es el texto que serб mostrado dentro del dialog. Puede aсadir otra\n", 73);
    strcat(Menu, "lнnea usando el sнmbolo de la lнnea anterior (n). No necesita\n", 137);
    strcat(Menu, "colocar el sнmbolo en la ъltima lнnea del dialog.", 187);
    ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX, "Ayuda de dialog", Menu, "Aceptar", "");
    return 1;
}
Aсadimos un mensaje (la funciуn) dentro del public OnDialogResponse:

pawn Код:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == 1) // El nъmero 1 es el nъmero de nuestro dialog anterior.
    {
        if(response) // Si presionaron 'Aceptar'.
        {
            SendClientMessage(playerid, -1, "ЎGracias por leer!");
        }
    return 1; // Cerrando dialog response del dialog # 1!
    }
return 1; // Cerrando public.
}
* Nota: Al usar OnDialogResponse cada dialog debe tener un nъmero. En este caso usamos el nъmero 1:

Код:
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX, "Ayuda de dialog", Menu, "Aceptar", "");
    return 1;
}
Dialog de texto (permite a los jugadores colocar texto en el dialog)



Ejemplo:

pawn Код:
ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Texto", "ЎEscriba un texto a todos los jugadores", "Aceptar", "Cancelar");
Despuйs de crear nuestro cуdigo debemos crear una funciуn al cуdigo; para ello usaremos public OnDialogResponse:

Ejemplo:

pawn Код:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == 2)
    {
        if(!response) // Si presionaron 'Cancelar'.
        {
            SendClientMessage(playerid, -1, "ЎMensaje cancelado!");
        }
        else // Si presionaron 'Aceptar'.
        {
            new String[200], Nombre[MAX_PLAYER_NAME]; // Definiendo variables.
            GetPlayerName(playerid, Nombre, MAX_PLAYER_NAME); // Obteniendo el nombre del jugador (asignando un valor a la variable).
            format(String, sizeof(String), "[<!>] Anuncio de %s: %s", Nombre, inputtext); // Usando un formato para el mensaje.
            SendClientMessageToAll(-1, String);
        }
    return 1; // Cerrando respuesta del dialog # 2!
    }
return 1; // Cerrando public.
}
Dialog de lista (menъ, muestra a los jugadores una lista de opciones):



Ejemplo (creando un menъ de armas):

pawn Код:
if(!strcmp(cmdtext, "/Weapon", true))
{
    ShowPlayerDialog(playerid, 3, DIALOG_STYLE_LIST, "Armas", "Desert Eagle\n AK-47\n Combat Shotgun", "Seleccionar", "Cerrar");
    return 1;
}
Код:
"Armas" = Tнtulo de la lista
"Desert Eagle\n AK-47\n Combat Shotgun" = Lista.
"Seleccionar" = Seleccionar un нtem (arma).
"Cerrar" = Cerrar lista.
El sнmbolo \n es usado para separar los elementos de la lista (en filas).

Para dar el arma usamos public OnDialogResponse:

pawn Код:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == 3)
    {
        if(response) // Si presionaron 'Seleccionar' o dieron doble clic a un arma.
        {
            switch(listitem) // Creamos swith a todos los elementos de la lista; cada caso representa un elemento.
            {
                case 0:
                {
                    GivePlayerWeapon(playerid, 24, 14); // Dar un arma Desert Eagle con 14 balas.
                }
                case 1:
                {
                    GivePlayerWeapon(playerid, 30, 120); // Dar un arma AK-47 con 120 balas.
                }
                case 2:
                {
                    GivePlayerWeapon(playerid, 27, 28); // Dar un arma Combat Shotgun con 28 balas.
                }
            }
        }
        return 1; // Cerrando dialog response del dialog # 3!
    }
    return 1; // Cerrando public.
}
Estructura de la funciуn GivePlayerWeapon:

pawn Код:
GivePlayerWeapon(playerid, weaponid, ammo);
Informaciуn adicional sobre la funciуn: https://sampwiki.blast.hk/wiki/GivePlayerWeapon


Dialog de contraseсa (permite a los jugadores colocar texto en el dialog, sin revelar el texto):



Tiene la misma estructura que "Dialog de contraseсa"; mayormente usado en sistemas de registro (lo cual es ligeramente avanzado para ser explicado en esta guнa).

Si quiere ver cуmo crear sistemas de registro puede visitar:

TheChaoz, cуmo crear un sistema de registro.
Kush account system guide (Y_INI).
Lorenc_ account system guide (SQLite using rBits).

CREANDO Y REMOVIENDO OBJETOS:

Hay muchos programas para modificar el mapa del servidor; los mбs conocidos son:

Map editor 1 (inglйs)
Map editor 2 (inglйs)
MTA editor

Lista de objetos: https://sampwiki.blast.hk/wiki/Model_ID

Map editor (1 & 2):

Ambos tienen una estructura parecida; esta es una explicaciуn para ambos casos.

Empezando:

- Despuйs de descargarlo, debe abrir el archivo "editor.exe" y presionar el botуn "LOAD".

- Cargarб el mapa del juego (GTA-SA); puede mover la cбmara moviendo el mouse mientras presiona clic derecho. Puede mover por el mapa con el scroll o usando las teclas "W, A, S y D" mientras presiona clic derecho.

Creando objetos:

- Muйvase al lugar donde quiere aсadir el mapa, presione el botуn "Objects" dentro del menъ (el menъ al lado derecho de la ventana).

- Presione "+Add" y busque el objeto que quiere aсadir (ID o nombre); luego haga doble clic en йl y presione el botуn "Add".

- Despuйs de hacerlo presione en el objeto mostrado en el lado derecho de la venta, luego presione "insert".

- Puede mover el objeto usando el panel "Movement".

- Despuйs de mapear puede obtener el cуdigo y aсadirlo a su GM presionando "Show Code". Copa el cуdigo y lo pega en OnGameModeInit.

Ejemplo:

pawn Код:
public OnGameModeInit()
{
    CreateObject(2587, 2001.195679, 1547.113892, 14.283400, 0.0, 0.0, 96.0); // El objeto cargarб a su distancia por defecto (GTA-SA).
    return 1;
}
Informaciуn adicional: https://sampwiki.blast.hk/wiki/CreateObject

Removiendo objetos:

- Muйvase alrededor del mapa y busque el objeto que desea borrar.

- Haga clic en йl y presione la tecla "Supr".

- Despuйs de borrarlo presione "Show Code". Debe pegar el cуdigo en public OnPlayerConnect.

Ejemplo:

pawn Код:
public OnPlayerConnect(playerid)
{
    RemoveBuildingForPlayer(playerid, 3782, 1803.0859, -1294.2031, 34.3438, 0.25);
    return 1;
}
Informaciуn adicional: https://sampwiki.blast.hk/wiki/RemoveBuildingForPlayer


MTA editor:

Este programa es mбs sencillo de usar (para los nuevos) que el otro editor.

Puede descargarlo aquн.

* Nota: El programa puede crear objetos pero no eliminarlos.

Empezando:

- Despuйs de descargarlo, abra el archivo MTA.exe

- Haga clic en el editor de mapas.

- Muйvase por el mapa, use la cбmara y las teclas "W, A, S y D".

- Para crear objetos presione "F" y haga clic en el cubo (parte inferior):



- Busque el objeto y colуquelo en el mapa.

* Nota: Puede mover arriba y abajo haciendo clic en el objecto y usando las teclas "Avpag" y "Repag" (o tambiйn conocidas como "Page Down (pg dn)" y "Page Up (pg up)"). Para rotarlo use "Shift + Scroll". Para cambiar el бngulo use "CTRL + Avpag/Repag" o "CTRL + Flechas".

- Para guardar el mapa use el botуn de guardado:



- Para obtener el cуdigo use un convertidor de mapas MTA:

Delux GTA Map Converter v2 (2015)

Delux GTA Map Converter v2:

- En vez de IPL file format escoja PAWN Code for SA-MP. Busque el mapa dentro de la carpeta MTA; usualmente se encuentra dentro de \mods\deathmatch\resources.

- Copie el cуdigo.


Creando Objetos:

Despuйs de obtener el cуdigo de objeto, debe aсadirlo dentro de public OnGameModeInit o OnFilterScriptInit.

Ejemplo:

pawn Код:
public OnGameModeInit()
{
    CreateObject(2587, 2001.195679, 1547.113892, 14.283400, 0.0, 0.0, 96.0); // El objeto cargarб a su distancia original.
    CreateObject(2587, 2001.195679, 1547.113892, 14.283400, 0.0, 0.0, 96.0, 250.0); //El objeto serб visible a 250 unidades.
    return 1;
}
Sin embargo, SA-MP tiene un lнmite de 1000 objetos. Si quiere optimizar el script o hacerlo mбs rбpido, debe usar el plugin Streamer.

Instalaciуn de Streamer:

- Puede descargarlo desde el tema del plugin.

- Despuйs de descargarlo, pegue el archivo "streamer.so" o "streamer.dll" dentro de la carpeta plugins (o simplemente pegue la carpeta plugins contenida en la descarga dentro de la carpeta del servidor).

- Copie el include "streamer.inc" dentro de la carpeta includes, dentro de la carpeta pawno.

- Edite el archivo "server.cfg" dentro de la carpeta de su servidor y agregue esta lнnea si estб usando Windows:

Код:
plugins streamer.dll
Si usa Linux agregue:

Код:
plugins streamer.so
- Copie este cуdigo dentro debajo de todos los includes (ejemplo de include: #include <a_samp>) de cada script que use el plugin streamer:

pawn Код:
#include <streamer>

#define STREAMER_TYPE_OBJECT (0)
#define STREAMER_TYPE_PICKUP (1)
#define STREAMER_TYPE_CP (2)
#define STREAMER_TYPE_RACE_CP (3)
#define STREAMER_TYPE_MAP_ICON (4)
#define STREAMER_TYPE_3D_TEXT_LABEL (5)
#define STREAMER_TYPE_AREA (6)

#define STREAMER_AREA_TYPE_CIRCLE (0)
#define STREAMER_AREA_TYPE_CYLINDER (1)
#define STREAMER_AREA_TYPE_SPHERE (2)
#define STREAMER_AREA_TYPE_RECTANGLE (3)
#define STREAMER_AREA_TYPE_CUBOID (4)
#define STREAMER_AREA_TYPE_POLYGON (5)

#define STREAMER_OBJECT_TYPE_GLOBAL (0)
#define STREAMER_OBJECT_TYPE_PLAYER (1)
#define STREAMER_OBJECT_TYPE_DYNAMIC (2)

enum
{
    E_STREAMER_ATTACHED_OBJECT,
    E_STREAMER_ATTACHED_PLAYER,
    E_STREAMER_ATTACHED_VEHICLE,
    E_STREAMER_ATTACH_OFFSET_X,
    E_STREAMER_ATTACH_OFFSET_Y,
    E_STREAMER_ATTACH_OFFSET_Z,
    E_STREAMER_ATTACH_R_X,
    E_STREAMER_ATTACH_R_Y,
    E_STREAMER_ATTACH_R_Z,
    E_STREAMER_ATTACH_X,
    E_STREAMER_ATTACH_Y,
    E_STREAMER_ATTACH_Z,
    E_STREAMER_COLOR,
    E_STREAMER_DRAW_DISTANCE,
    E_STREAMER_EXTRA_ID,
    E_STREAMER_INTERIOR_ID,
    E_STREAMER_MAX_X,
    E_STREAMER_MAX_Y,
    E_STREAMER_MAX_Z,
    E_STREAMER_MIN_X,
    E_STREAMER_MIN_Y,
    E_STREAMER_MIN_Z,
    E_STREAMER_MODEL_ID,
    E_STREAMER_MOVE_R_X,
    E_STREAMER_MOVE_R_Y,
    E_STREAMER_MOVE_R_Z,
    E_STREAMER_MOVE_SPEED,
    E_STREAMER_MOVE_X,
    E_STREAMER_MOVE_Y,
    E_STREAMER_MOVE_Z,
    E_STREAMER_NEXT_X,
    E_STREAMER_NEXT_Y,
    E_STREAMER_NEXT_Z,
    E_STREAMER_PLAYER_ID,
    E_STREAMER_R_X,
    E_STREAMER_R_Y,
    E_STREAMER_R_Z,
    E_STREAMER_SIZE,
    E_STREAMER_STREAM_DISTANCE,
    E_STREAMER_STYLE,
    E_STREAMER_TEST_LOS,
    E_STREAMER_TYPE,
    E_STREAMER_WORLD_ID,
    E_STREAMER_X,
    E_STREAMER_Y,
    E_STREAMER_Z
}
* Nota: Este cуdigo estб basado en la actualizaciуn del plugin Streamer, 2015 (v2.7.4).

- Despuйs de hacerlo edite el cуdigo del objeto que desea aсadir. En vez de usar "CreateObject" use "CreateDynamicObject".

Ejemplo:

En vez de usar un cуdigo normal...

pawn Код:
public OnGameModeInit()
{
    CreateObject(2587, 2001.195679, 1547.113892, 14.283400, 0.0, 0.0, 96.0);
    return 1;
}
Use:

pawn Код:
public OnGameModeInit()
{
    CreateDynamicObject(2587, 2001.195679, 1547.113892, 14.283400, 0.0, 0.0, 96.0);
    return 1;
}
* Nota: Puede editar mбs rбpido el cуdigo "CreateObject" usando un bloc de notas (.txt). Pegue el cуdigo dentro; y presione "CTRL + R", busque "CreateObject" y lo reemplaza por "CreateDynamicObject" (use esto si el mapa es muy grande).

- Despuйs de hacer esto abra el archivo PWN donde quiere aсadir los objetos (usualmente dentro del gamemode) y pegue su cуdigo.

Ejemplo:

pawn Код:
public OnGameModeInit()
{
    CreateDynamicObject(2587, 2001.195679, 1547.113892, 14.283400, 0.0, 0.0, 96.0);
    return 1;
}
Informaciуn adicional sobre Streamer.

EMPIECE A PRACTICAR:

Ahora que sabe esto, usted puede practicar editando otros script o puede intentar crear su propio script.

Una buena forma de empezar es editando otros gamemodes

Si hay algъn error en esta guнa o algo deberнa ser aсadido, simplemente comente.

* Nota: esta es una pequeсa guнa comparada con toda la informaciуn bбsica de SA-MP que un nuevo scripter debe conocer; este tema serб actualizado de acuerdo a las sugerencias de los usuarios y sus comentarios.
Reply
#2

que buen aporte men, lo guardare a mis favoritos +rept
Reply
#3

No lo termine de leer pero muy bien ahн +1

PD: Te faltaron traducir algunas partes...
Reply
#4

Buen Aporte bro
Reply
#5

Muy buena CARAJO! :') + 1 rep
Reply
#6

No es que el cliente no serб actualizado, sino que el cliente no enviarб su actualizaciуnal a los demбs jugadores.
Reply
#7

Algo censillo y tonto (Lo que uno hace) en fin mi estimado nobatin Ygzeb cada quien aporte lo que siente que es avanzdo para el...
Reply
#8

Quote:
Originally Posted by LiMPiTo
Посмотреть сообщение
No lo termine de leer pero muy bien ahн +1

PD: Te faltaron traducir algunas partes...
ЎActualizado! Lo corregн y aсadн una guнa sobre la creaciуn y modificaciуn de mapas.

Gracias a todos por el apoyo

Es probable que haga una guнa adicional para aquellos que quieran seguir aprendiendo, explicando informaciуn que no se pudo explicar en esta guнa debido a su extensiуn. La guнa tendrнa informaciуn sobre comandos, vehнculos, condiciones, etc (informaciуn bбsica que no es vital, pero igualmente es importante).

Quote:
Originally Posted by INKISICION
Посмотреть сообщение
Algo censillo y tonto (Lo que uno hace) en fin mi estimado nobatin Ygzeb cada quien aporte lo que siente que es avanzdo para el...
Cada quien publica lo que cree que es necesario para la comunidad. En este caso lo publiquй debido a que varios amigos nuevos en esto me lo pidieron; tomando en cuenta tambiйn que la mayorнa de guнas son difнciles de entender para alguien que es completamente nuevo en esto.

Querнa aclarar eso, no volverй a responder comentarios de alguien asн.
Reply
#9

Quote:
Originally Posted by Ygzeb
Посмотреть сообщение
ЎActualizado! Lo corregн y aсadн una guнa sobre la creaciуn y modificaciуn de mapas.

Gracias a todos por el apoyo

Es probable que haga una guнa adicional para aquellos que quieran seguir aprendiendo, explicando informaciуn que no se pudo explicar en esta guнa debido a su extensiуn. La guнa tendrнa informaciуn sobre comandos, vehнculos, condiciones, etc (informaciуn bбsica que no es vital, pero igualmente es importante).



Cada quien publica lo que cree que es necesario para la comunidad. En este caso lo publiquй debido a que varios amigos nuevos en esto me lo pidieron; tomando en cuenta tambiйn que la mayorнa de guнas son difнciles de entender para alguien que es completamente nuevo en esto.

Querнa aclarar eso, no volverй a responder comentarios de alguien asн.
Tranquilo Ygzeb,la gente que critica,muchas veces nunca aporta nada,se la dan de profesionales,pero nunca ayudan o aportan algo.

Por gente como tu la comunidad sigue viva,si nadie aportara nada,la comunidad no seria una comunidad.

A mi me sirvio,aunque la mayoria ya lo sabia,espero la otra parte,para aprender un poco mas de PAWN y samp.
Reply
#10

Buen aporte +1.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)