SA-MP Forums

Go Back   SA-MP Forums > SA-MP Scripting and Plugins > Scripting Help > Tutorials

Reply
 
Thread Tools Display Modes
Old 03/06/2011, 02:09 PM   #1
Deskoft
Guest
 
Posts: n/a
Default Scripter's Guide [UPDATED (June 4, 2011)]

Definitions

In Scripting there are alot of definitions that you may need to know.
This are the definitions for this First Tutorial:

Filterscript (Script): A filterscript is a script that is attached to the Gamemode to work with the gamemode but not as the gamemode.
They are like add-ons.

Gamemode (Script): A gamemode is the main script running on a server.

Includes (Script): A include is a script that helps to script in someway. Examples are dini, zcmd, dudb. etc.

Chapter I - SA-MP & PAWNO

San Andreas Multiplayer is a modification of the Game "Grand Thef Auto San Andreas".
It was released in the year 2004 and people still play it.
If we make a analisis of all the Modifications of GTA:SA the most important Of all times are
MTA and SAMP, MTA is really customizable to be honest, you can even add images but...

What about SAMP?

San Andreas Multiplayer right now has 20,000 Players, sa-mp has more Roleplay Servers plus
better scripts. MTA uses lua and SA-MP uses pawn.

But well, let's leave this topic and start to script...

Chapter II - Downloading SA-MP & Downloading the Server Pack + Pawno

Pawno is the main Pawn editor, and Pawn is the programming language used in sa-mp.
In order to play SA-MP you need to download SA-Mp from this page, the client, and aswell the server pack. It will include many folders (the server pack), I suggest you to put them in a easy to open place, for example, your desktop.
I will explain each of the folders there:

Filterscripts (Folder): All filterscripts (See Definitions) go here.
Gamemodes (Folder): All Gamemodes (See Definitions) come here.
Includes (Folder): All Includes (See Definitions) come here.
Pawno (Folder): Pawno is here.
Plugins (Folder): This is a folder that does not come with installation, all plugins go here.
NOTE: You need to create this folder.
Scriptfiles (Folder): All the files of the script (NOT THE LISTED ABOVE) come here, for example, all user information, Server info. etc. ALL is managed by the scripts but not by sa-mp itself.

Chapter III - Setting up your server

Now what we are going to do is to see if our server is working. by default you have grandlarency (or something like that).
I suggest you download Notepad++ for opening all the files we are going to open (but .pwn or .inc)
After downloading Notepad++ open server.cfg (In Notepad++ right click > Edit in Notepad ++)
You will see this:

Code:
echo Executing Server Config...
lanmode 0
rcon_password rconpass (or sth like this)
maxplayers 50
port 7777
hostname SA-MP 0.3 Server
gamemode0 grandlarc (or sth like this)
filterscripts (sth here)
announce 1
query 1
weburl www.sa-mp.com
maxnpc 0
onfoot_rate 40
incar_rate 40
weapon_rate 40
stream_distance 300.0
stream_rate 1000
on rcon_pass, change rconpass to a password you want for the Rcon, Rcon is the default admin system on all pawno script it can't be deleted but only blocked with scripts (we will learn that later).
now delete gamemode0 content and filterscripts too.
should end like...

Code:
echo Executing Server Config...
lanmode 0
rcon_password yourpass
maxplayers 50
port 7777
hostname SA-MP 0.3 Server
gamemode0
filterscripts
announce 1
query 1
weburl www.sa-mp.com
maxnpc 0
onfoot_rate 40
incar_rate 40
weapon_rate 40
stream_distance 300.0
stream_rate 1000
Save the file with the name "tutfile" and open pawno (Server File > pawno > pawno.exe)
You will see a blank "file".
Create a new file and you will see some text appeared, that's the default "start script" with all callbacks and funcs (we are going to learn this later). Now only save it on gamemodes and Press F5, a compiler will pop up and say if it has errors warning or if compilation is clean.
If it's clean then just go to the Server Folder and open again server.cfg.
Now change gamemode to this:
Code:
gamemode0 tutscript
Save it and now run (On Server Folders) samp-server.exe
should appear a black window and that means your server is running.
Now open sa-mp and add this server to favorites:
127.0.0.1:7777 (this is the port)
This is only FOR YOU. others will need YOUR ip.
Now, go on, join it, you may see that the cam is in LV and that you spawn at LV that's how to set a basic server with a blank script.

__________________________________________________ ___________________________________________

Information

This is the second tutorial of my tutorial series, if you haven't read my First tutorial click here.
This tutorial will explain the basics of pawn.

What is pawn?

Wikipedia defines pawn as:
Quote:
Originally Posted by Wikipedia
Pawn, formerly known as Small, is an open source programming language primarily intended as an embeddable scripting language. It is maintained by a Dutch company named CompuPhase, which released the first version in 1998.
for us pawn is our programming language that is specially for sa-mp scripting, but sa-mp is not all colorful and learning it without knowing any other programming language may be quite hard, this tutorial is intended to teach you the basics of pawno.

Credits & Script Information Making

What I do in all the scripts i make is to set information and credits.
As we said we have this:

pawn Code:
// This is a comment
// uncomment the line below if you want to write a filterscript
//#define FILTERSCRIPT

#include <a_samp>

#if defined FILTERSCRIPT

public OnFilterScriptInit()
{
    print("\n--------------------------------------");
    print(" Blank Filterscript by your name here");
    print("--------------------------------------\n");
    return 1;
}

public OnFilterScriptExit()
{
    return 1;
}

#else

main()
{
    print("\n----------------------------------");
    print(" Blank Gamemode by your name here");
    print("----------------------------------\n");
}

#endif

public OnGameModeInit()
{
    // Don't use these lines if it's a filterscript
    SetGameModeText("Blank Script");
    AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
    return 1;
}

public OnPlayerConnect(playerid)
{
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    return 1;
}

public OnPlayerSpawn(playerid)
{
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    return 1;
}

public OnVehicleSpawn(vehicleid)
{
    return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
    return 1;
}

public OnPlayerText(playerid, text[])
{
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (strcmp("/mycommand", cmdtext, true, 10) == 0)
    {
        // Do something here
        return 1;
    }
    return 0;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
    return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
    return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
    return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
    return 1;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveRaceCheckpoint(playerid)
{
    return 1;
}

public OnRconCommand(cmd[])
{
    return 1;
}

public OnPlayerRequestSpawn(playerid)
{
    return 1;
}

public OnObjectMoved(objectid)
{
    return 1;
}

public OnPlayerObjectMoved(playerid, objectid)
{
    return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
    return 1;
}

public OnVehicleMod(playerid, vehicleid, componentid)
{
    return 1;
}

public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
    return 1;
}

public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
    return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
    return 1;
}

public OnPlayerExitedMenu(playerid)
{
    return 1;
}

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
    return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    return 1;
}

public OnRconLoginAttempt(ip[], password[], success)
{
    return 1;
}

public OnPlayerUpdate(playerid)
{
    return 1;
}

public OnPlayerStreamIn(playerid, forplayerid)
{
    return 1;
}

public OnPlayerStreamOut(playerid, forplayerid)
{
    return 1;
}

public OnVehicleStreamIn(vehicleid, forplayerid)
{
    return 1;
}

public OnVehicleStreamOut(vehicleid, forplayerid)
{
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
    return 1;
}

Let's delete first lines (1, 2, 3) that contain:

pawn Code:
// This is a comment
// uncomment the line below if you want to write a filterscript
//#define FILTERSCRIPT

They are not very useful.
as you already read on that 3 lines // is a comment aswell as /**/,
we will learn about comments:

NOTE: Don't add this.

pawn Code:
//<----- 1-Lined Comment

As you see, // is a 1 lined comment, so if we type...

pawn Code:
//<----- 1-Lined Comment
But this is not

will give you this error:

Code:
 error 010: invalid function or declaration
Why? cause it's not in a comment, with // only the text NEAR // will be comment.

So i can't make multi-lined comments?

Of course you can, /* and */ are used for multi-lined comments.
For example:
(Again, don't add this)

pawn Code:
/* This is a comment */

That is a multi-lined comment, but now let's go to the official script you are making.
We want to have the credits of the script, we want it, that's true. so we gotta
set some credits as Comment, some credits on main() function and some information
thing when a player connects, that will be the first thing we have to do, atleast i do.

So on the first lines put your "Copyright" and information, and credits. etc.
I will put this:

pawn Code:
/***********************************
*        TUTORIAL SCRIPT           *
*  CREATED BY: CHRISTIAN *
*  MODIFIED BY: MATTHEW STRIKER *
************************************/


/*
Deskoft Studios Tutorial Script

Developer: Christian
This script is created to teach users
the programming language used in
sa-mp, "pawn". This script can be
copied, used, modified or whatever
they want, i don't care. i only want
you to leave the credits as they are.

CREDITS:
 Christian (Teaching & Developing the Script)
 Matthew Striker (Continuing the tutorial)
*/

That, i will compile now and...
I have this:

Quote:
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
That means it's a clean compilation and there was no errors or warnings.

So we have just learned comments and we have our Mini-Credits developed
Now what?

let's check the function "main()"

pawn Code:
main()
{
    print("\n----------------------------------");
    print(" Blank Gamemode by your name here");
    print("----------------------------------\n");
}

What the **** is that?
Simple, that's called a function. has { and }, inside that { and } all the Function is made
inside ( and ) there are parameters.
now, print is used to print some text in the console (a.k.a black box where you run your script).
let's delete the pritns in main() and make OUR own print.
But first just delete them and go to the first lines.
We are going to learn something really useful:
#define.
Now the word "define" by wordnetweb.princeton.edu is:

Quote:
Originally Posted by wordnetweb.princeton.edu
give a definition for the meaning of a word
So we basically set a type of Meaning for something.

let's make some basic defines...
I will put this:
(NOTE: I suggest putting it AFTER #include <samp>)

pawn Code:
#define DEVELOPER "Christian"
#define VERSION "v.0.0.1a"
Now we are putting new stuff in our brain.
why the fuck is it in " and "?
all text inside " and " is called a string.
A string contains text, but we will learn how to put variables (We will learn the definition later)
later.
let's imagine strings are letters, we are setting the title of the letter to DEVELOPER and the content to v.0.0.1a
and VERSION as title and v.0.0.1a as content.
Now we will learn another useful function called printf, sends a formatted string to the console.
I know you are saying... What the ****?
but i will explain this.
it's pretty much the same as print but now you can use variables or defines or anything else.
this is a example: (DONT ADD)
pawn Code:
printf("Version: %s", VERSION);
remember the #define VERSION "v.0.0.1a" thing? it will output this:
Code:
Version: v.0.0.1a
on Console.
Now, what is %s? it's a string.
this are all the things that can be used:

%b Inserts a number at this position
%d Inserts an integer (whole) number
%f Inserts a floating point number.
%i Inserts an integer.
%s Inserts a string.
%x Inserts a number in hexadecimal notation.
%% Inserts the literal '%'
We will learn them later.
but now only strings.
if we use:
printf("%s %s", VERSION, DEVELOPER);
it will output:

Code:
v.0.0.1a Christian
so it prints them in order.
Now let's start working...
on the function main() let's put your info:

pawn Code:
print("Tutorial Script");
    printf("Version: %s", VERSION);
    printf("Developer: %s", DEVELOPER);
that will output:

Code:
Tutorial Script
Version: 0.0.1a
Developer: Christian
__________________________________________________ _________________________________________

Information

This is the second part of my tutorial series.
If you haven't checked part 2 click here.

What is a variable?

Wikipedia defines variable as
Quote:
Originally Posted by Wikipedia
a variable is a facility for storing data
So yeah, stores data, but what is the difference with #define?
#define can't be changed after compilation but a variable can.
Let's see... (DONT ADD THIS):

pawn Code:
new number=1;
new number2=1;
new result;
result=number+number2;
That's basically 1+1 = 2.
let's imagine a variable is like your brain.
You find Anne in the street and tell her:

Quote:
You: Hello Anne
Anne: Hi there
You: I have just learned math
Anne: Cool!
You: Do you know what 1+1 is?
Now Anne starts thinking, but that "thinking" lasts only some few seconds as it's a simple operation, in programming that operation may take less than a second (Depeding on lag, and the script way of programming).
so after... 1 second she may answer:

Quote:
Anne: 2 ofcourse!
You: Nice Job!
Now, we will start learning variables...

Integrer:

A integrer contains numbers, what we learned there was a integrer.
a example would be...
pawn Code:
new integrer;
instead of integrer you can put any name, you can put new mynumb; or whatever.
That stores ONLY a number.

Variables for Strings:

A Variable for Strings is:
pawn Code:
new myname[128];

What is [128]? the max lenght of the string inside the variable.
There are many other types of variables or systems of storing things but we will learn them later aswell.

We will now learn a new method called arrays or global variables.
Let's see...
pawn Code:
new Score[MAX_PLAYERS];
I putted that near the defines.
Now, what is MAX_PLAYERS? Guess...
That's a define, but...
Where was it defined?
you remember server.cfg and the func max_players? there.
Can you modify it? yes, ovbiously, and we will do it via script.
I prefer doing it via script.
Add this near your defines:

pawn Code:
#undef MAX_PLAYERS
#define MAX_PLAYERS 50

The #undef basically undefines a define.
and there you go.
We have this at the moment:

pawn Code:
Deskoft Studios Tutorial Script

Developer: Christian
This script is created to teach users
the programming language used in
sa-mp, "pawn". This script can be
copied, used, modified or whatever
they want, i don't care. i only want
you to leave the credits as they are.
*/

#include <a_samp>
#define DEVELOPER "Christian"
#define VERSION "v.0.0.1a"
#undef MAX_PLAYERS
#define MAX_PLAYERS 50
new Score[MAX_PLAYERS];

#if defined FILTERSCRIPT

public OnFilterScriptInit()
{
    print("\n--------------------------------------");
    print(" Blank Filterscript by your name here");
    print("--------------------------------------\n");
    return 1;
}

public OnFilterScriptExit()
{
    return 1;
}

#else

main()
{
    print("Tutorial Script");
    printf("Version: %s", VERSION);
    printf("Developer: %s", DEVELOPER);
}

#endif

public OnGameModeInit()
{
    // Don'
t use these lines if it's a filterscript
    SetGameModeText("Blank Script");
    AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
    return 1;
}

public OnPlayerConnect(playerid)
{
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    return 1;
}

public OnPlayerSpawn(playerid)
{
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    return 1;
}

public OnVehicleSpawn(vehicleid)
{
    return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
    return 1;
}

public OnPlayerText(playerid, text[])
{
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (strcmp("/mycommand", cmdtext, true, 10) == 0)
    {
        // Do something here
        return 1;
    }
    return 0;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
    return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
    return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
    return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
    return 1;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveRaceCheckpoint(playerid)
{
    return 1;
}

public OnRconCommand(cmd[])
{
    return 1;
}

public OnPlayerRequestSpawn(playerid)
{
    return 1;
}

public OnObjectMoved(objectid)
{
    return 1;
}

public OnPlayerObjectMoved(playerid, objectid)
{
    return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
    return 1;
}

public OnVehicleMod(playerid, vehicleid, componentid)
{
    return 1;
}

public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
    return 1;
}

public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
    return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
    return 1;
}

public OnPlayerExitedMenu(playerid)
{
    return 1;
}

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
    return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    return 1;
}

public OnRconLoginAttempt(ip[], password[], success)
{
    return 1;
}

public OnPlayerUpdate(playerid)
{
    return 1;
}

public OnPlayerStreamIn(playerid, forplayerid)
{
    return 1;
}

public OnPlayerStreamOut(playerid, forplayerid)
{
    return 1;
}

public OnVehicleStreamIn(vehicleid, forplayerid)
{
    return 1;
}

public OnVehicleStreamOut(vehicleid, forplayerid)
{
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
    return 1;
}

In the next tutorial we will learn how to modify the scores and how to use Timers...

__________________________________________________ ___________________________

Now we will learn how to use timers and modify the score...
Wikipedia defines timers as...

Quote:
Originally Posted by Wikipedia
A timer is a specialized type of clock. A timer can be used to control the sequence of an event or process. Whereas a stopwatch counts upwards from zero for measuring elapsed time, a timer counts down from a specified time interval, like an hourglass
So yeah, a timer calls a function after x amount of milliseconds.

SetTimer(FuncName[], Milliseconds, Repeat)

That's the command to create a Timer...
Let's see, we want to create a timer that every second checks the money of the player
and sets the Score to that.
So we first create the function...

Public Functions

Ok i created this next to main():

pawn Code:
public SetScore()
{
    return 1;
}

basically a public function is a function that will be called by a timer or by the script at start.
NOTHING ELSE, a normal functions is like this:

pawn Code:
myfunc()
{
    return 1;
}

Now, basically in this public function we will use our first for();...

For()

When you use for, you will repeat something while something is true.
Let's see...

pawn Code:
for(new i=0;i<5;i++)
{

}

That will create first the variable (Int) i that starts in 0, then check if i is Less than 5 and then add +1 to i.
when i arrives to 4 it will just stop the for.
Let's use this.

On your SetScore public func type this:

pawn Code:
for(new i=0;i<MAX_PLAYERS;i++)
    {
        Score[i]=GetPlayerMoney(i);
        SetPlayerScore(i, Score[i]);
    }

What is that doing?
it will start the i variable in 0, and the max players is 500, so the loop will get the money of all the players, and set it as it's score!

SetPlayerScore(playerid, Score)

That basically sets the score of a player, you can...
pawn Code:
SetPlayerScore(playerid, 5);
And will set the score to 5.

GetPlayerMoney(playerid)
returns the amount of money a player has, it can be used like this...
pawn Code:
new playermoney;
playermoney=GetPlayerMoney(playerid);

Now... Compile your script.


Code:
public function lacks forward declaration (symbol "SetScore")
That right?
Yes, public functions need to be forwarded like this:
(On the start of the code, near #defines)

pawn Code:
forward SetScore();

You basically put the header.
Well that's all for now, later we will learn more things.

_________________________________

Now we will learn how to make a simple login system, but first you will need dini.inc
You can download it from: here

Now we have this code:

pawn Code:
Developer: Christian
This script is created to teach users
the programming language used in
sa-mp, "pawn". This script can be
copied, used, modified or whatever
they want, i don't care. i only want
you to leave the credits as they are.
*/

#include <a_samp>
#define DEVELOPER "Christian"
#define VERSION "v.0.0.1a"
#undef MAX_PLAYERS
#define MAX_PLAYERS 50
new Score[MAX_PLAYERS];
forward SetScore();

#if defined FILTERSCRIPT

public OnFilterScriptInit()
{
    print("\n--------------------------------------");
    print(" Blank Filterscript by your name here");
    print("--------------------------------------\n");
    return 1;
}

public OnFilterScriptExit()
{
    return 1;
}

#else

main()
{
    print("Tutorial Script");
    printf("Version: %s", VERSION);
    printf("Developer: %s", DEVELOPER);
}

#endif

public SetScore()
{
    for(new i=0;i<MAX_PLAYERS;i++)
    {
        Score[i]=GetPlayerMoney(i);
        SetPlayerScore(i, Score[i]);
    }
    return 1;
}

public OnGameModeInit()
{
    // Don'
t use these lines if it's a filterscript
    SetGameModeText("Blank Script");
    AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
    return 1;
}

public OnPlayerConnect(playerid)
{
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    return 1;
}

public OnPlayerSpawn(playerid)
{
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    return 1;
}

public OnVehicleSpawn(vehicleid)
{
    return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
    return 1;
}

public OnPlayerText(playerid, text[])
{
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (strcmp("/mycommand", cmdtext, true, 10) == 0)
    {
        // Do something here
        return 1;
    }
    return 0;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
    return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
    return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
    return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
    return 1;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveRaceCheckpoint(playerid)
{
    return 1;
}

public OnRconCommand(cmd[])
{
    return 1;
}

public OnPlayerRequestSpawn(playerid)
{
    return 1;
}

public OnObjectMoved(objectid)
{
    return 1;
}

public OnPlayerObjectMoved(playerid, objectid)
{
    return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
    return 1;
}

public OnVehicleMod(playerid, vehicleid, componentid)
{
    return 1;
}

public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
    return 1;
}

public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
    return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
    return 1;
}

public OnPlayerExitedMenu(playerid)
{
    return 1;
}

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
    return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    return 1;
}

public OnRconLoginAttempt(ip[], password[], success)
{
    return 1;
}

public OnPlayerUpdate(playerid)
{
    return 1;
}

public OnPlayerStreamIn(playerid, forplayerid)
{
    return 1;
}

public OnPlayerStreamOut(playerid, forplayerid)
{
    return 1;
}

public OnVehicleStreamIn(vehicleid, forplayerid)
{
    return 1;
}

public OnVehicleStreamOut(vehicleid, forplayerid)
{
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
    return 1;
}

Now as we have downloaded dini.inc (and placed it on include and pawno>include folder)
we can add this near #include <a_samp>:

pawn Code:
#include <dini>

What that do? that includes dini, that is for saving files.
Okay, we start by creating a folder in our scriptfiles folder. Call it "Users" (Capitalized).
Now to the script...

pawn Code:
public OnPlayerConnect(playerid)
{
    new pname[128];
    GetPlayerName(playerid, pname, sizeof(pname));
    return 1;
}

that will get the name of the player.
we create a string... pname and we Get the PlayerName
sizeof(pname) basically returns 128, why? cause [128] is the size of the string.
Okay now we will start to use dini.
First let's check if the user file exists.
we will use format(.
Format is like printf()
%s, %d, %i. etc.

now... we will put this near GetPlayerName
pawn Code:
format(file, sizeof(file), "Users/%s.ini", pname);
Notice a difference?
sizeof(file) right?
well this is how to use format:
format(output, sizeofoutput, formattedtext, ....);
so we now have the FILE of the user that has just connected.
Now let's check if the file exists.
Now, on the top of the file put this:
pawn Code:
#define COLOR_GREY        0xAFAFAFAA
Why? that's a Hexadecimal color for the COLOR Grey.
Now we will introduce a new function called
SendClientMessage(playerid, COLOR, string);
that sends a message in the game to the player.
so let's add this next to format();
pawn Code:
if(dini_Exists(file))
    {
    }else{
    }
we have this at the moment on OnPlayerConnect:
pawn Code:
public OnPlayerConnect(playerid)
{
    new pname[128];
    GetPlayerName(playerid, pname, sizeof(pname));
    new file[128];
    format(file, sizeof(file), "Users/%s.ini", pname);
    if(dini_Exists(file))
    {
    }else{
    }
    return 1;
}

that last code checks if the file exists.
Now, basically, let's learn the new functions...
dini_Exists: basically checks if a file exists, it will return 1 if the file exists!
so yes, let's continue...
inside that, let's add...
pawn Code:
public OnPlayerConnect(playerid)
{
    new pname[128];
    GetPlayerName(playerid, pname, sizeof(pname));
    new file[128];
    format(file, sizeof(file), "Users/%s.ini", pname);
    if(dini_Exists(file))
    {
        // means the file exists!
    }else{
        dini_Create(file);
    }
    return 1;
}

so that will basically, create the file, that dini_Create is used to create files, it can be .ini, .txt!
now, we have a player file created!

Register System!

Now we will work on a register system, which is something slightly more complex for begginers.
At the moment, our code is:
pawn Code:
/*
Developer: Christian
This script is created to teach users
the programming language used in
sa-mp, "pawn". This script can be
copied, used, modified or whatever
they want, i don't care. i only want
you to leave the credits as they are.
*/


#include <a_samp>
#include <dini>

#define DEVELOPER "Christian"
#define VERSION "v.0.0.1a"
#undef MAX_PLAYERS
#define MAX_PLAYERS 50
new Score[MAX_PLAYERS];
forward SetScore();

#if defined FILTERSCRIPT

public OnFilterScriptInit()
{
    print("\n--------------------------------------");
    print(" Blank Filterscript by your name here");
    print("--------------------------------------\n");
    return 1;
}

public OnFilterScriptExit()
{
    return 1;
}

#else

main()
{
    print("Tutorial Script");
    printf("Version: %s", VERSION);
    printf("Developer: %s", DEVELOPER);
}

#endif

public SetScore()
{
    for(new i=0;i<MAX_PLAYERS;i++)
    {
        Score[i]=GetPlayerMoney(i);
        SetPlayerScore(i, Score[i]);
    }
    return 1;
}

public OnGameModeInit()
{
    // Don't use these lines if it's a filterscript
    SetGameModeText("Blank Script");
    AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
    return 1;
}

public OnPlayerConnect(playerid)
{
    new pname[128];
    GetPlayerName(playerid, pname, sizeof(pname));
    new file[128];
    format(file, sizeof(file), "Users/%s.ini", pname);
    if(dini_Exists(file))
    {
        // means the file exists!
    }else{
        dini_Create(file);
    }
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    return 1;
}

public OnPlayerSpawn(playerid)
{
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    return 1;
}

public OnVehicleSpawn(vehicleid)
{
    return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
    return 1;
}

public OnPlayerText(playerid, text[])
{
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (strcmp("/mycommand", cmdtext, true, 10) == 0)
    {
        // Do something here
        return 1;
    }
    return 0;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
    return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
    return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
    return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
    return 1;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveRaceCheckpoint(playerid)
{
    return 1;
}

public OnRconCommand(cmd[])
{
    return 1;
}

public OnPlayerRequestSpawn(playerid)
{
    return 1;
}

public OnObjectMoved(objectid)
{
    return 1;
}

public OnPlayerObjectMoved(playerid, objectid)
{
    return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
    return 1;
}

public OnVehicleMod(playerid, vehicleid, componentid)
{
    return 1;
}

public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
    return 1;
}

public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
    return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
    return 1;
}

public OnPlayerExitedMenu(playerid)
{
    return 1;
}

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
    return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    return 1;
}

public OnRconLoginAttempt(ip[], password[], success)
{
    return 1;
}

public OnPlayerUpdate(playerid)
{
    return 1;
}

public OnPlayerStreamIn(playerid, forplayerid)
{
    return 1;
}

public OnPlayerStreamOut(playerid, forplayerid)
{
    return 1;
}

public OnVehicleStreamIn(vehicleid, forplayerid)
{
    return 1;
}

public OnVehicleStreamOut(vehicleid, forplayerid)
{
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
    return 1;
}

So, now, let's create a public function, again, public functions are only used when we use timers, so that's what we are going to use.
pawn Code:
forward OnPlayerRegister(playerid, step);
public OnPlayerRegister(playerid, step)
{
    return 1;
}
Oh no! Look! a forward! Why god? I'll have to explain them what a forward is!
Well, instead of raging and quitting sa-mp, let's say every single public (that is not pre-defined, as the ones you can see, as they are already forwarded in a_samp) must be forwarded, otherwise you recieve warnings...
Wasn't that hard huh?

But every single public function need to be called! so yeah, let's call it!

[PAWN]
public OnPlayerConnect(playerid)
{
new pname[128];
GetPlayerName(playerid, pname, sizeof(pname));
new file[128];
format(file, sizeof(file), "Users/%s.ini", pname);
if(dini_Exists(file))
{
// means the file exists!
}else{
dini_Create(file);
OnPlayerRegister(playerid, 1);
}
return 1;
}
[PAWN]
so yeah, I added it OnPlayerConnect, but wait a second, what if they /quit while the tutorial is on?
let's add something else to the OnPlayerConnect...
change...
pawn Code:
if(dini_Exists(file))
to...
pawn Code:
if(!dini_Exists(file))
Oh God! a "!", so complex!, basically, if ... "if(dini_Exists)" returned 1, now the "1" will check if it returns 0.
So now...
pawn Code:
public OnPlayerConnect(playerid)
{
    new pname[128];
    GetPlayerName(playerid, pname, sizeof(pname));
    new file[128];
    format(file, sizeof(file), "Users/%s.ini", pname);
    if(!dini_Exists(file))
    {
        dini_Create(file);
        OnPlayerRegister(playerid, 1);
    }
    return 1;
}

That will mean, if the file DOESN'T Exist, the file will get created, but still we have the same problem, if they quit while the tutorial is on, they will be considered as registered.
pawn Code:
public OnPlayerConnect(playerid)
{
    new pname[128];
    GetPlayerName(playerid, pname, sizeof(pname));
    new file[128];
    format(file, sizeof(file), "Users/%s.ini", pname);
    if(!dini_Exists(file))
    {
        dini_Create(file);
        OnPlayerRegister(playerid, 1);
    }
    if(dini_Int(pfile, "Registered") == 0)
    {
        OnPlayerRegister(playerid, 1);
    }
    return 1;
}
Before you shot yourself after reading that, let me explain it on a simple way.
I did explain what a integrer is right? Well here, my friend, you will read a field.
a INI file is a file that is used to save stats, it's like...
"Registered=1", which means he is registered.
Now it will check if he was registered!

My first tutorial
oh my good! My first tutorial! I'm so excited, i'll be able to impress my girlfriend saying I'm a professional scripter! Well, yeah my friend, today is the day you were waiting for, today your dreams become true, you will make your first tutorial.

So we had this sexy public function:
pawn Code:
forward OnPlayerRegister(playerid, step);
public OnPlayerRegister(playerid, step)
{
    return 1;
}
It's so complex, it has a return 1, it's simply sexy.
but what about we make it more sexy?
You notice the "step", that's the step of our tutorial, ever noticed how in a server the text started to pass and it looked so complex? Well yeah, you, my friend, are going to do that.

Let's start by such a simple thing, as adding the step number 1.

pawn Code:
forward OnPlayerRegister(playerid, step);
public OnPlayerRegister(playerid, step)
{
    if(step == 1)
    {
   
    }
    return 1;
}
Was that hard?
Anyways, so yes, currently if the user presses SHIFT or presses the SPAWN button, he can spawn, don't worry, we will delete that soon.
But, for a tutorial to be considered a tutorial, you need cameras!

Time for some In Game action my friend, don't rage now, partner, medics are incoming!
It's time... to... Press F5!



Oh! Oh oh my god! how could I forgot about pfile!
We got our first error, how exciting.
Sometimes pressing F5 can be as exciting as buying Modern Warfare 2 and not being able to run it.

pawn Code:
public OnPlayerConnect(playerid)
{
    new pname[128];
    GetPlayerName(playerid, pname, sizeof(pname));
    new file[128];
    format(file, sizeof(file), "Users/%s.ini", pname);
    if(!dini_Exists(file))
    {
        dini_Create(file);
        OnPlayerRegister(playerid, 1);
    }
    if(dini_Int(pfile, "Registered") == 0)
    {
        OnPlayerRegister(playerid, 1);
    }
    return 1;
}
So yes, try to find the error, we had a "file" function, but we have a "pfile", which means, we need to use "file" instead of "pfile".
pawn Code:
public OnPlayerConnect(playerid)
{
    new pname[128];
    GetPlayerName(playerid, pname, sizeof(pname));
    new file[128];
    format(file, sizeof(file), "Users/%s.ini", pname);
    if(!dini_Exists(file))
    {
        dini_Create(file);
        OnPlayerRegister(playerid, 1);
    }
    if(dini_Int(file, "Registered") == 0)
    {
        OnPlayerRegister(playerid, 1);
    }
    return 1;
}
Good Job! You are learning to fix errors!
Now Press F5, only a stupid warning about strtok, which doesn't matter for now.
Now open your console, which is samp-server.exe.



Wow, a black console! That's so sexy!
That's called our console, and everything is working correctly up to now!
But we need to take camera coords (to make the camera change of position and that stuff you see in a tutorial), so, i'm scared my friend, it's time for...

THE /V COMMAND!!!
OH GOD! OH NO! THE /V COMMAND!
NOW WE MUST USE 2 MORE INCLUDES!
Well yeah, for this part we will use zcmd and sscanf, which are easier to use.
You already installed dini, so what about we install zcmd, which is almost the same, a include.
Our friend ZeeX made it, so that you guys don't shoot your PC with a M4A1.
Here, click this.
Now, time to download, SSCANF2.

here, click this
our friend Y_Less (very good scripter and software engineer, to be honest), created this include so that we can make params as fast as saying "hi".
but, this is a bit complex to install,
first of all, add the .inc to your pawno>includes folder, then, on the main server folder, create a folder called "plugins", and now, inside place the .dll / .so, now open server.cfg, and add a new line, plugins.
like this:
Code:
echo Executing Server Config...
lanmode 0
rcon_password idontknowhowtoscriptpleasehelpme
maxplayers 500
port 7777
hostname [0.3] My Test Server
gamemode0 tutscript
filterscripts 
announce 0
query 1
weburl www.sa-mp.com
onfoot_rate 40
incar_rate 40
weapon_rate 40
stream_distance 300.0
stream_rate 1000
maxnpc 0
plugins sscanf
Was that hard? if you are in linux....

Code:
echo Executing Server Config...
lanmode 0
rcon_password idontknowhowtoscriptpleasehelpme
maxplayers 500
port 7777
hostname [0.3] My Test Server
gamemode0 tutscript
filterscripts 
announce 0
query 1
weburl www.sa-mp.com
onfoot_rate 40
incar_rate 40
weapon_rate 40
stream_distance 300.0
stream_rate 1000
maxnpc 0
plugins sscanf.so
Now, inside your script...
pawn Code:
#include <a_samp>
#include <dini>
#include <zcmd>
#include <sscanf2>
Yep! Yep!, We are done with those bastard includes, we neutralized our problem! Target neutralized.
Now... we have this...
pawn Code:
/*
Developer: Christian
This script is created to teach users
the programming language used in
sa-mp, "pawn". This script can be
copied, used, modified or whatever
they want, i don't care. i only want
you to leave the credits as they are.
*/


#include <a_samp>
#include <dini>
#include <zcmd>
#include <sscanf2>

#define DEVELOPER "Christian"
#define VERSION "v.0.0.1a"
#undef MAX_PLAYERS
#define MAX_PLAYERS 50
new Score[MAX_PLAYERS];
forward SetScore();

#if defined FILTERSCRIPT

public OnFilterScriptInit()
{
    print("\n--------------------------------------");
    print(" Blank Filterscript by your name here");
    print("--------------------------------------\n");
    return 1;
}

public OnFilterScriptExit()
{
    return 1;
}

#else

main()
{
    print("Tutorial Script");
    printf("Version: %s", VERSION);
    printf("Developer: %s", DEVELOPER);
}

#endif

public SetScore()
{
    for(new i=0;i<MAX_PLAYERS;i++)
    {
        Score[i]=GetPlayerMoney(i);
        SetPlayerScore(i, Score[i]);
    }
    return 1;
}

public OnGameModeInit()
{
    // Don't use these lines if it's a filterscript
    SetGameModeText("Blank Script");
    AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
    return 1;
}

forward OnPlayerRegister(playerid, step);
public OnPlayerRegister(playerid, step)
{
    if(step == 1)
    {
   
    }
    return 1;
}

public OnPlayerConnect(playerid)
{
    new pname[128];
    GetPlayerName(playerid, pname, sizeof(pname));
    new file[128];
    format(file, sizeof(file), "Users/%s.ini", pname);
    if(!dini_Exists(file))
    {
        dini_Create(file);
        OnPlayerRegister(playerid, 1);
    }
    if(dini_Int(file, "Registered") == 0)
    {
        OnPlayerRegister(playerid, 1);
    }
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    return 1;
}

public OnPlayerSpawn(playerid)
{
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    return 1;
}

public OnVehicleSpawn(vehicleid)
{
    return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
    return 1;
}

public OnPlayerText(playerid, text[])
{
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (strcmp("/mycommand", cmdtext, true, 10) == 0)
    {
        // Do something here
        return 1;
    }
    return 0;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
    return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
    return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
    return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
    return 1;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveRaceCheckpoint(playerid)
{
    return 1;
}

public OnRconCommand(cmd[])
{
    return 1;
}

public OnPlayerRequestSpawn(playerid)
{
    return 1;
}

public OnObjectMoved(objectid)
{
    return 1;
}

public OnPlayerObjectMoved(playerid, objectid)
{
    return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
    return 1;
}

public OnVehicleMod(playerid, vehicleid, componentid)
{
    return 1;
}

public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
    return 1;
}

public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
    return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
    return 1;
}

public OnPlayerExitedMenu(playerid)
{
    return 1;
}

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
    return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    return 1;
}

public OnRconLoginAttempt(ip[], password[], success)
{
    return 1;
}

public OnPlayerUpdate(playerid)
{
    return 1;
}

public OnPlayerStreamIn(playerid, forplayerid)
{
    return 1;
}

public OnPlayerStreamOut(playerid, forplayerid)
{
    return 1;
}

public OnVehicleStreamIn(vehicleid, forplayerid)
{
    return 1;
}

public OnVehicleStreamOut(vehicleid, forplayerid)
{
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
    return 1;
}

Wohoo our first 300 lines! Now instead of opening your wine bottles and getting grounded by your mom, press the F5 button in your keyboard.
woho, 1 warning (the strtok, which we will fix soon)!
now that we have that, let's work on the actual /v CMD.
with ZCMD, your commands are made like this:
pawn Code:
CMD:somethinghere(playerid, params[])
{
}
Basically, CMD makes it a public function, it's a macro.
let's work on our actual command.

pawn Code:
COMMAND:v(playerid, params[])
{
    // my first command, i'm so horny!
    return 1;
}
I added this on the bottom of my script, for order purposes.
that won't do nothing at the moment, what about we add the params.
pawn Code:
new vehicleid, color1, color2;
    if(!sscanf(params, "iii", vehicleid, color1, color2))
    {
    }
We add that to our command, what will that do?
We created 3 variables, to store our vehicleid and desired colors.
the if(!sscanf) will detect the parameters, and save them on the variables.

so yes...
pawn Code:
COMMAND:v(playerid, params[])
{
    // my first command, i'm so horny!
    new vehicleid, color1, color2;
    if(!sscanf(params, "iii", vehicleid, color1, color2))
    {
    }else{
    }
    return 1;
}
We have that.

on the else, it will be called, if for example, you do /v only, without params...
for you to understand it, let's add this:
pawn Code:
#define COLOR_GREY 0xAFAFAFAA
#define COLOR_GREEN 0x33AA33AA
#define COLOR_RED 0xAA3333AA
#define COLOR_YELLOW 0xFFFF00AA
#define COLOR_WHITE 0xFFFFFFAA
#define COLOR_BLUE 0x0000BBAA
#define COLOR_LIGHTBLUE 0x33CCFFAA
#define COLOR_ORANGE 0xFF9900AA
#define COLOR_RED 0xAA3333AA
#define COLOR_LIME 0x10F441AA
#define COLOR_MAGENTA 0xFF00FFFF
#define COLOR_NAVY 0x000080AA
#define COLOR_AQUA 0xF0F8FFAA
#define COLOR_CRIMSON 0xDC143CAA
#define COLOR_FLBLUE 0x6495EDAA
#define COLOR_BISQUE 0xFFE4C4AA
#define COLOR_BLACK 0x000000AA
#define COLOR_CHARTREUSE 0x7FFF00AA
#define COLOR_BROWN 0XA52A2AAA
#define COLOR_CORAL 0xFF7F50AA
#define COLOR_GOLD 0xB8860BAA
#define COLOR_GREENYELLOW 0xADFF2FAA
#define COLOR_INDIGO 0x4B00B0AA
#define COLOR_IVORY 0xFFFF82AA
#define COLOR_LAWNGREEN 0x7CFC00AA
#define COLOR_LIMEGREEN 0x32CD32AA //<--- Dark lime
#define COLOR_MIDNIGHTBLUE 0X191970AA
#define COLOR_MAROON 0x800000AA
#define COLOR_OLIVE 0x808000AA
#define COLOR_ORANGERED 0xFF4500AA
#define COLOR_PINK 0xFFC0CBAA // - Light light pink
#define COLOR_SEAGREEN 0x2E8B57AA
#define COLOR_SPRINGGREEN 0x00FF7FAA
#define COLOR_TOMATO 0xFF6347AA // - Tomato >:/ sounds wrong lol... well... :P
#define COLOR_YELLOWGREEN 0x9ACD32AA //- like military green
#define COLOR_MEDIUMAQUA 0x83BFBFAA
#define COLOR_MEDIUMMAGENTA 0x8B008BAA // dark magenta ^^

#define COLOR_GREY        0xAFAFAFAA
#define COLOR_GREEN       0x33AA33AA
#define COLOR_BRIGHTRED   0xFF0000AA
#define COLOR_DARKRED     0xC60000FF
#define COLOR_YELLOW      0xFFFF00AA
#define COLOR_TAN         0xBDB76BAA
#define COLOR_PURPLE      0x800080AA
#define COLOR_WHITE       0xFFFFFFAA
#define COLOR_LIGHTBLUE   0x33CCFFAA
#define COLOR_ORANGE      0xFF9900AA
#define COLOR_INDIGO      0x4B00B0AA
#define COLOR_SYSTEM      0xa9c4e4
#define COLOR_SANTORANGE  0xFF6C3BAA
#define COLOR_INVIS       0xAFAFAF00
#define COLOR_CRIMBLUE    0x3A47DEFF
#define COLOR_WANTED      0xCC0066AA
#define COLOR_GROVE       0x378729FF
#define COLOR_BALLAS      0xA31D88FF
#define COLOR_DARKGREY    0x696969FF
#define COLOR_ERPSS       0x549852FF
#define COLOR_L1A         0x50A2ABFF
#define COLOR_FADE1       0xE6E6E6E6
#define COLOR_FADE2       0xC8C8C8C8
#define COLOR_FADE3       0xAAAAAAAA
#define COLOR_FADE4       0x8C8C8C8C
#define COLOR_FADE5       0x6E6E6E6E
#define BLACK             0x000000FF
On top of the script, this are colors, for the messages we will send to the players, just add it near the #includes.
We have this:
pawn Code:
/*
Developer: Christian
This script is created to teach users
the programming language used in
sa-mp, "pawn". This script can be
copied, used, modified or whatever
they want, i don't care. i only want
you to leave the credits as they are.
*/


#include <a_samp>
#include <dini>
#include <zcmd>
#include <sscanf2>

#define COLOR_GREY 0xAFAFAFAA
#define COLOR_GREEN 0x33AA33AA
#define COLOR_RED 0xAA3333AA
#define COLOR_YELLOW 0xFFFF00AA
#define COLOR_WHITE 0xFFFFFFAA
#define COLOR_BLUE 0x0000BBAA
#define COLOR_LIGHTBLUE 0x33CCFFAA
#define COLOR_ORANGE 0xFF9900AA
#define COLOR_RED 0xAA3333AA
#define COLOR_LIME 0x10F441AA
#define COLOR_MAGENTA 0xFF00FFFF
#define COLOR_NAVY 0x000080AA
#define COLOR_AQUA 0xF0F8FFAA
#define COLOR_CRIMSON 0xDC143CAA
#define COLOR_FLBLUE 0x6495EDAA
#define COLOR_BISQUE 0xFFE4C4AA
#define COLOR_BLACK 0x000000AA
#define COLOR_CHARTREUSE 0x7FFF00AA
#define COLOR_BROWN 0XA52A2AAA
#define COLOR_CORAL 0xFF7F50AA
#define COLOR_GOLD 0xB8860BAA
#define COLOR_GREENYELLOW 0xADFF2FAA
#define COLOR_INDIGO 0x4B00B0AA
#define COLOR_IVORY 0xFFFF82AA
#define COLOR_LAWNGREEN 0x7CFC00AA
#define COLOR_LIMEGREEN 0x32CD32AA //<--- Dark lime
#define COLOR_MIDNIGHTBLUE 0X191970AA
#define COLOR_MAROON 0x800000AA
#define COLOR_OLIVE 0x808000AA
#define COLOR_ORANGERED 0xFF4500AA
#define COLOR_PINK 0xFFC0CBAA // - Light light pink
#define COLOR_SEAGREEN 0x2E8B57AA
#define COLOR_SPRINGGREEN 0x00FF7FAA
#define COLOR_TOMATO 0xFF6347AA // - Tomato >:/ sounds wrong lol... well... :P
#define COLOR_YELLOWGREEN 0x9ACD32AA //- like military green
#define COLOR_MEDIUMAQUA 0x83BFBFAA
#define COLOR_MEDIUMMAGENTA 0x8B008BAA // dark magenta ^^

#define COLOR_GREY        0xAFAFAFAA
#define COLOR_GREEN       0x33AA33AA
#define COLOR_BRIGHTRED   0xFF0000AA
#define COLOR_DARKRED     0xC60000FF
#define COLOR_YELLOW      0xFFFF00AA
#define COLOR_TAN         0xBDB76BAA
#define COLOR_PURPLE      0x800080AA
#define COLOR_WHITE       0xFFFFFFAA
#define COLOR_LIGHTBLUE   0x33CCFFAA
#define COLOR_ORANGE      0xFF9900AA
#define COLOR_INDIGO      0x4B00B0AA
#define COLOR_SYSTEM      0xa9c4e4
#define COLOR_SANTORANGE  0xFF6C3BAA
#define COLOR_INVIS       0xAFAFAF00
#define COLOR_CRIMBLUE    0x3A47DEFF
#define COLOR_WANTED      0xCC0066AA
#define COLOR_GROVE       0x378729FF
#define COLOR_BALLAS      0xA31D88FF
#define COLOR_DARKGREY    0x696969FF
#define COLOR_ERPSS       0x549852FF
#define COLOR_L1A         0x50A2ABFF
#define COLOR_FADE1       0xE6E6E6E6
#define COLOR_FADE2       0xC8C8C8C8
#define COLOR_FADE3       0xAAAAAAAA
#define COLOR_FADE4       0x8C8C8C8C
#define COLOR_FADE5       0x6E6E6E6E
#define BLACK             0x000000FF

#define DEVELOPER "Christian"
#define VERSION "v.0.0.1a"
#undef MAX_PLAYERS
#define MAX_PLAYERS 50
new Score[MAX_PLAYERS];
forward SetScore();

#if defined FILTERSCRIPT

public OnFilterScriptInit()
{
    print("\n--------------------------------------");
    print(" Blank Filterscript by your name here");
    print("--------------------------------------\n");
    return 1;
}

public OnFilterScriptExit()
{
    return 1;
}

#else

main()
{
    print("Tutorial Script");
    printf("Version: %s", VERSION);
    printf("Developer: %s", DEVELOPER);
}

#endif

public SetScore()
{
    for(new i=0;i<MAX_PLAYERS;i++)
    {
        Score[i]=GetPlayerMoney(i);
        SetPlayerScore(i, Score[i]);
    }
    return 1;
}

public OnGameModeInit()
{
    // Don't use these lines if it's a filterscript
    SetGameModeText("Blank Script");
    AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
    return 1;
}

forward OnPlayerRegister(playerid, step);
public OnPlayerRegister(playerid, step)
{
    if(step == 1)
    {
   
    }
    return 1;
}

public OnPlayerConnect(playerid)
{
    new pname[128];
    GetPlayerName(playerid, pname, sizeof(pname));
    new file[128];
    format(file, sizeof(file), "Users/%s.ini", pname);
    if(!dini_Exists(file))
    {
        dini_Create(file);
        OnPlayerRegister(playerid, 1);
    }
    if(dini_Int(file, "Registered") == 0)
    {
        OnPlayerRegister(playerid, 1);
    }
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    return 1;
}

public OnPlayerSpawn(playerid)
{
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    return 1;
}

public OnVehicleSpawn(vehicleid)
{
    return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
    return 1;
}

public OnPlayerText(playerid, text[])
{
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (strcmp("/mycommand", cmdtext, true, 10) == 0)
    {
        // Do something here
        return 1;
    }
    return 0;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
    return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
    return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
    return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
    return 1;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveRaceCheckpoint(playerid)
{
    return 1;
}

public OnRconCommand(cmd[])
{
    return 1;
}

public OnPlayerRequestSpawn(playerid)
{
    return 1;
}

public OnObjectMoved(objectid)
{
    return 1;
}

public OnPlayerObjectMoved(playerid, objectid)
{
    return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
    return 1;
}

public OnVehicleMod(playerid, vehicleid, componentid)
{
    return 1;
}

public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
    return 1;
}

public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
    return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
    return 1;
}

public OnPlayerExitedMenu(playerid)
{
    return 1;
}

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
    return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    return 1;
}

public OnRconLoginAttempt(ip[], password[], success)
{
    return 1;
}

public OnPlayerUpdate(playerid)
{
    return 1;
}

public OnPlayerStreamIn(playerid, forplayerid)
{
    return 1;
}

public OnPlayerStreamOut(playerid, forplayerid)
{
    return 1;
}

public OnVehicleStreamIn(vehicleid, forplayerid)
{
    return 1;
}

public OnVehicleStreamOut(vehicleid, forplayerid)
{
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
    return 1;
}

COMMAND:v(playerid, params[])
{
    // my first command, i'm so horny!
    new vehicleid, color1, color2;
    if(!sscanf(params, "iii", vehicleid, color1, color2))
    {
    }else{
    }
    return 1;
}

Now, let's work on SendClientMessage! Woho! We will send our first message!

pawn Code:
COMMAND:v(playerid, params[])
{
    // my first command, i'm so horny!
    new vehicleid, color1, color2;
    if(!sscanf(params, "iii", vehicleid, color1, color2))
    {
    }else{
        SendClientMessage(playerid, COLOR_GREY, "ERROR: This command requires: /v [vehicleid][color1][color2]");
    }
    return 1;
}
That will send a message to "playerid", in "Color Grey", saying "ERROR:" bla bla bla.
Yes, very simple? Well, now time to work on the other side of the table...
pawn Code:
if(!sscanf(params, "iii", vehicleid, color1, color2))
    {
        new vin;
Every vehicle has a vin, like your class number, 1, 2, 3, 4, 5.
We need this vin to edit the vehicle.
And we also want the vehicle to appear in the position of the player right?
pawn Code:
new Float:x, Float:y, Float:z;
this will store the coords of the player...
So we have this...
pawn Code:
COMMAND:v(playerid, params[])
{
    // my first command, i'm so horny!
    new vehicleid, color1, color2;
    if(!sscanf(params, "iii", vehicleid, color1, color2))
    {
        new vin;
        new Float:x, Float:y, Float:z;
    }else{
        SendClientMessage(playerid, COLOR_GREY, "ERROR: This command requires: /v [vehicleid][color1][color2]");
    }
    return 1;
}
now, a float is a complex number, which can be 1.90990990, or 25.0.
so yes, let's work on getting the coords...
pawn Code:
COMMAND:v(playerid, params[])
{
    // my first command, i'm so horny!
    new vehicleid, color1, color2;
    if(!sscanf(params, "iii", vehicleid, color1, color2))
    {
        new vin;
        new Float:x, Float:y, Float:z;
        GetPlayerPos(playerid, x, y, z);
    }else{
        SendClientMessage(playerid, COLOR_GREY, "ERROR: This command requires: /v [vehicleid][color1][color2]");
    }
    return 1;
}
that will store on x, y, z the POSITION / COORDS of the player.

pawn Code:
COMMAND:v(playerid, params[])
{
    // my first command, i'm so horny!
    new vehicleid, color1, color2;
    if(!sscanf(params, "iii", vehicleid, color1, color2))
    {
        new vin;
        new Float:x, Float:y, Float:z;
        GetPlayerPos(playerid, x, y, z);
        CreateVehicle(vehicleid, x, y, z, 0.0, color1, color2, -1);
    }else{
        SendClientMessage(playerid, COLOR_GREY, "ERROR: This command requires: /v [vehicleid][color1][color2]");
    }
    return 1;
}
SO that creates the vehicle itself, the vehicletype, x, y, z, rotation to 0.0, and the colors required.
THAT -1 is so that the vehicle won't respawn!
But, let's put the player inside the vehicle!
add:
pawn Code:
vin=CreateVehicle(vehicleid, x, y, z, 0.0, color1, color2, -1);
Why? as I already explained, we need to store the vin so we can edit the vehicle!
and now...
pawn Code:
PutPlayerInVehicle(playerid, vin, 0);
That basically puts the player in the "vin" (vehicle), in seat 0 (driver).
We have this:
pawn Code:
/*
Developer:  Christian
This script is created to teach users
the programming language used in
sa-mp, "pawn". This script can be
copied, used, modified or whatever
they want, i don't care. i only want
you to leave the credits as they are.
*/


#include <a_samp>
#include <dini>
#include <zcmd>
#include <sscanf2>

#define COLOR_GREY 0xAFAFAFAA
#define COLOR_GREEN 0x33AA33AA
#define COLOR_RED 0xAA3333AA
#define COLOR_YELLOW 0xFFFF00AA
#define COLOR_WHITE 0xFFFFFFAA
#define COLOR_BLUE 0x0000BBAA
#define COLOR_LIGHTBLUE 0x33CCFFAA
#define COLOR_ORANGE 0xFF9900AA
#define COLOR_RED 0xAA3333AA
#define COLOR_LIME 0x10F441AA
#define COLOR_MAGENTA 0xFF00FFFF
#define COLOR_NAVY 0x000080AA
#define COLOR_AQUA 0xF0F8FFAA
#define COLOR_CRIMSON 0xDC143CAA
#define COLOR_FLBLUE 0x6495EDAA
#define COLOR_BISQUE 0xFFE4C4AA
#define COLOR_BLACK 0x000000AA
#define COLOR_CHARTREUSE 0x7FFF00AA
#define COLOR_BROWN 0XA52A2AAA
#define COLOR_CORAL 0xFF7F50AA
#define COLOR_GOLD 0xB8860BAA
#define COLOR_GREENYELLOW 0xADFF2FAA
#define COLOR_INDIGO 0x4B00B0AA
#define COLOR_IVORY 0xFFFF82AA
#define COLOR_LAWNGREEN 0x7CFC00AA
#define COLOR_LIMEGREEN 0x32CD32AA //<--- Dark lime
#define COLOR_MIDNIGHTBLUE 0X191970AA
#define COLOR_MAROON 0x800000AA
#define COLOR_OLIVE 0x808000AA
#define COLOR_ORANGERED 0xFF4500AA
#define COLOR_PINK 0xFFC0CBAA // - Light light pink
#define COLOR_SEAGREEN 0x2E8B57AA
#define COLOR_SPRINGGREEN 0x00FF7FAA
#define COLOR_TOMATO 0xFF6347AA // - Tomato >:/ sounds wrong lol... well... :P
#define COLOR_YELLOWGREEN 0x9ACD32AA //- like military green
#define COLOR_MEDIUMAQUA 0x83BFBFAA
#define COLOR_MEDIUMMAGENTA 0x8B008BAA // dark magenta ^^

#define COLOR_GREY        0xAFAFAFAA
#define COLOR_GREEN       0x33AA33AA
#define COLOR_BRIGHTRED   0xFF0000AA
#define COLOR_DARKRED     0xC60000FF
#define COLOR_YELLOW      0xFFFF00AA
#define COLOR_TAN         0xBDB76BAA
#define COLOR_PURPLE      0x800080AA
#define COLOR_WHITE       0xFFFFFFAA
#define COLOR_LIGHTBLUE   0x33CCFFAA
#define COLOR_ORANGE      0xFF9900AA
#define COLOR_INDIGO      0x4B00B0AA
#define COLOR_SYSTEM      0xa9c4e4
#define COLOR_SANTORANGE  0xFF6C3BAA
#define COLOR_INVIS       0xAFAFAF00
#define COLOR_CRIMBLUE    0x3A47DEFF
#define COLOR_WANTED      0xCC0066AA
#define COLOR_GROVE       0x378729FF
#define COLOR_BALLAS      0xA31D88FF
#define COLOR_DARKGREY    0x696969FF
#define COLOR_ERPSS       0x549852FF
#define COLOR_L1A         0x50A2ABFF
#define COLOR_FADE1       0xE6E6E6E6
#define COLOR_FADE2       0xC8C8C8C8
#define COLOR_FADE3       0xAAAAAAAA
#define COLOR_FADE4       0x8C8C8C8C
#define COLOR_FADE5       0x6E6E6E6E
#define BLACK             0x000000FF

#define DEVELOPER "Christian"
#define VERSION "v.0.0.1a"
#undef MAX_PLAYERS
#define MAX_PLAYERS 50
new Score[MAX_PLAYERS];
forward SetScore();

#if defined FILTERSCRIPT

public OnFilterScriptInit()
{
    print("\n--------------------------------------");
    print(" Blank Filterscript by your name here");
    print("--------------------------------------\n");
    return 1;
}

public OnFilterScriptExit()
{
    return 1;
}

#else

main()
{
    print("Tutorial Script");
    printf("Version: %s", VERSION);
    printf("Developer: %s", DEVELOPER);
}

#endif

public SetScore()
{
    for(new i=0;i<MAX_PLAYERS;i++)
    {
        Score[i]=GetPlayerMoney(i);
        SetPlayerScore(i, Score[i]);
    }
    return 1;
}

public OnGameModeInit()
{
    // Don't use these lines if it's a filterscript
    SetGameModeText("Blank Script");
    AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
    return 1;
}

forward OnPlayerRegister(playerid, step);
public OnPlayerRegister(playerid, step)
{
    if(step == 1)
    {
   
    }
    return 1;
}

public OnPlayerConnect(playerid)
{
    new pname[128];
    GetPlayerName(playerid, pname, sizeof(pname));
    new file[128];
    format(file, sizeof(file), "Users/%s.ini", pname);
    if(!dini_Exists(file))
    {
        dini_Create(file);
        OnPlayerRegister(playerid, 1);
    }
    if(dini_Int(file, "Registered") == 0)
    {
        OnPlayerRegister(playerid, 1);
    }
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    return 1;
}

public OnPlayerSpawn(playerid)
{
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    return 1;
}

public OnVehicleSpawn(vehicleid)
{
    return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
    return 1;
}

public OnPlayerText(playerid, text[])
{
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (strcmp("/mycommand", cmdtext, true, 10) == 0)
    {
        // Do something here
        return 1;
    }
    return 0;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
    return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
    return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
    return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
    return 1;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveRaceCheckpoint(playerid)
{
    return 1;
}

public OnRconCommand(cmd[])
{
    return 1;
}

public OnPlayerRequestSpawn(playerid)
{
    return 1;
}

public OnObjectMoved(objectid)
{
    return 1;
}

public OnPlayerObjectMoved(playerid, objectid)
{
    return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
    return 1;
}

public OnVehicleMod(playerid, vehicleid, componentid)
{
    return 1;
}

public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
    return 1;
}

public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
    return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
    return 1;
}

public OnPlayerExitedMenu(playerid)
{
    return 1;
}

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
    return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    return 1;
}

public OnRconLoginAttempt(ip[], password[], success)
{
    return 1;
}

public OnPlayerUpdate(playerid)
{
    return 1;
}

public OnPlayerStreamIn(playerid, forplayerid)
{
    return 1;
}

public OnPlayerStreamOut(playerid, forplayerid)
{
    return 1;
}

public OnVehicleStreamIn(vehicleid, forplayerid)
{
    return 1;
}

public OnVehicleStreamOut(vehicleid, forplayerid)
{
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
    return 1;
}

COMMAND:v(playerid, params[])
{
    // my first command, i'm so horny!
    new vehicleid, color1, color2;
    if(!sscanf(params, "iii", vehicleid, color1, color2))
    {
        new vin;
        new Float:x, Float:y, Float:z;
        GetPlayerPos(playerid, x, y, z);
        vin=CreateVehicle(vehicleid, x, y, z, 0.0, color1, color2, -1);
        PutPlayerInVehicle(playerid, vin, 0);
    }else{
        SendClientMessage(playerid, COLOR_GREY, "ERROR: This command requires: /v [vehicleid][color1][color2]");
    }
    return 1;
}
With the fully working /v command! What about we start working on the actual tutorial?!?
Let's press the Sexy F5 button, and open our sexy black console, and get inside our sexy server, on your sa-mp, add this server: 127.0.0.1:7777, and get in game!

When we get inside, let's spawn a chopper (/v 487 0 0 with the command we have), and fly to our desired location, here we have my screenshots:

First, we decided a place to hide the player, if you don't set the player pos, the camera will look crappy as the player will be in coords 0.0, 0.0, 0.0. So yes, hide the player in a intelligent position.

and type /save (Description), now, let's pick a camera initial position, this is the position where the camera will be at.


Excellent, now we save where the camera will look at, in which direction...


If you didn't understand a line of what I just said, don't be afraid to ask a question iin this topic.
So let's go to "My Documents > GTA San Andreas User File > SAMP > savedpositions.txt", in my case, I have this:
Code:
AddStaticVehicle(487,1758.8578,-1871.2877,30.0641,95.6751,0,0); // Here we will put the player
AddStaticVehicle(487,1781.1493,-1833.0995,33.3569,11.3549,0,0); // camera
AddPlayerClass(0,1781.0450,-1808.2030,13.5312,11.4841,0,0,0,0,0,0); // look at
So, let's analize it...
Quote:
AddStaticVehicle(487,1758.8578,-1871.2877,30.0641,95.6751,0,0); // Here we will put the player
AddStaticVehicle(487,1781.1493,-1833.0995,33.3569,11.3549,0,0); // camera
AddPlayerClass(0,1781.0450,-1808.2030,13.5312,11.4841,0,0,0,0,0,0); // look at
so yes, it's basically "x, y, z", after the "skin id" or "vehicle id", that's our coords, let's go to our code...

pawn Code:
forward OnPlayerRegister(playerid, step);
public OnPlayerRegister(playerid, step)
{
    if(step == 1)
    {
        SetPlayerPos(playerid, 1758.8578,-1871.2877,30.0641); // Hidden Player
        SetPlayerCameraPos(playerid, 1781.1493,-1833.0995,33.3569); // Camera Pos
        SetPlayerCameraLookAt(playerid, 1781.0450,-1808.2030,13.5312); // Camera Look At
    }
    return 1;
}
So we have 3 new concepts...
SetPlayerPos(playerid, Float:x, Float:y, Float:z); - Sets the player pos.
SetPlayerCameraPos(playerid, Float:x, Float:y, Float:z); - Sets the camera pos.
SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z); - Sets the camera direction.
We have our basic camera system, let's add text...

pawn Code:
forward OnPlayerRegister(playerid, step);
public OnPlayerRegister(playerid, step)
{
    if(step == 1)
    {
        SetPlayerPos(playerid, 1758.8578,-1871.2877,30.0641); // Hidden Player
        SetPlayerCameraPos(playerid, 1781.1493,-1833.0995,33.3569); // Camera Pos
        SetPlayerCameraLookAt(playerid, 1781.0450,-1808.2030,13.5312); // Camera Look At
        SendClientMessage(playerid, COLOR_WHITE, "==============================================================================");
        SendClientMessage(playerid, COLOR_WHITE, "Deskoft's Freeroam/Roleplay Script");
        SendClientMessage(playerid, COLOR_GREY, "Welcome to Deskoft's Freeroam/Roleplay Script! We are proud to have you here.");
        SendClientMessage(playerid, COLOR_GREY, "This is the tutorial, in which you will create your account.");
        SendClientMessage(playerid, COLOR_GREY, "Please wait while we load and save the required files.");
        SendClientMessage(playerid, COLOR_WHITE, "==============================================================================");
    }
    return 1;
}


This tutorial is an introduction to our Pawn Classroom! Be sure to check it out if you are trying to learn PAWN!

Last edited by Deskoft; 09/12/2011 at 01:39 AM.
  Reply With Quote
Old 03/06/2011, 02:13 PM   #2
Deskoft
Guest
 
Posts: n/a
Default Re: Scripter's Guide [NEW]

FAQ
1. Why did you create a new topic, with a new account?
Mainly, because the old user wanted me to continue the tutorial, plus, he is retired from gaming.

2. Everything's on the wiki!
Yeah, I agree, some people want it all together on a same tutorial, though.

3. Why all the errors?
His english was horrible, he told me just to publish it, and I had to ask him if I was able to edit it, I have made some modifications, aswell as some requests from Christian. My english is not that good either. It's a SUPER long tutorial, I find my time very limited, therefore, it's almost impossible for me to actually correct all the errors, sorry!

4. Who made this tutorial?
Christian, he is my friend. He had some private matters to attend, with her sister Jennifer, both of them were into gaming, both of them worked with me at Lawedan, and both of them created this tutorial.

5. Why are you posting it then?
As stated in number 1, he asked me to continue this tutorial, as I was in that time, when they resigned, the only user with advanced programming knowledge.

6. Where did he learn to script / Sources ?
I never asked him, therefore, I can't answer that question.

7. Where did YOU learn to script?
I am currently studying Software Engineering.

8. This tutorial is not well explained!
I don't think that's true, as of now, I seldom receive inquiries about stuff explained on this tutorial, the original guide required some explanation, and yes, I've done that.

9. Are you continuing this tutorial?
Yes, I am.

I AM NOT THE ONLY ONE WORKING ON THIS GUIDE, ALL THE SCRIPTERS IN LAWEDAN COMPUTERS, INC HAVE CONTRIBUTED, OUR WIKI AND BLOG EDITORS HAVE CONTRIBUTED WITH SCREENSHOTS!

Last edited by Deskoft; 14/11/2011 at 08:27 PM.
  Reply With Quote
Old 03/06/2011, 04:10 PM   #3
Meinstad
Gangsta
 
Meinstad's Avatar
 
Join Date: Sep 2010
Location: Northpole
Posts: 648
Reputation: 31
Default Re: Scripter's Guide [NEW]

Good work. Thanks for the tutorial.
__________________
Meinstad is offline   Reply With Quote
Old 04/06/2011, 01:25 PM   #4
Basicz
Gangsta
 
Basicz's Avatar
 
Join Date: Aug 2010
Location: Indonesia, Surabaya.
Posts: 621
Reputation: 35
Default Re: Scripter's Guide [NEW]

What a long tutorial!

You've must took some time to type it!

And, this is a very nice tutorial for me.
__________________

- Quina, from the game " Final Fantasy IX "
Basicz is offline   Reply With Quote
Old 04/06/2011, 03:34 PM   #5
Elka_Blazer
Big Clucker
 
Elka_Blazer's Avatar
 
Join Date: Apr 2011
Posts: 160
Reputation: 1
Default Re: Scripter's Guide [NEW]

Im sure you had to drink a lot of water while making this tutorial.

Great job man.
__________________
Did I help you ? well you can help me too by pressing this star(on my post)


[/COLOR]
Elka_Blazer is offline   Reply With Quote
Old 04/06/2011, 03:58 PM   #6
CraZy_KiLLaH
Guest
 
Posts: n/a
Default Re: Scripter's Guide [NEW]

I saw the same tutorial somewhere else or atleast similar. It was made by Christian_Larrabure..

Edit: Christian_Larrabure is Deskoft

Nice tutorial!

Last edited by CraZy_KiLLaH; 05/06/2011 at 03:19 AM.
  Reply With Quote
Old 04/06/2011, 05:07 PM   #7
Deskoft
Guest
 
Posts: n/a
Default Re: Scripter's Guide [NEW]

Thanks, i'm trying to help the members.
  Reply With Quote
Old 04/06/2011, 05:18 PM   #8
Deskoft
Guest
 
Posts: n/a
Default Re: Scripter's Guide [NEW]

Sorry for double post! Updated the tutorial.
  Reply With Quote
Old 07/06/2011, 04:08 AM   #9
John_Conner
Little Clucker
 
Join Date: May 2011
Posts: 7
Reputation: 2
Default Re: Scripter's Guide [NEW]

Great tutorial. One of the best beginner scripts ever. Thanks a lot
John_Conner is offline   Reply With Quote
Old 07/06/2011, 04:43 AM   #10
Deskoft
Guest
 
Posts: n/a
Default Re: Scripter's Guide [NEW]

Updated! - Added the first part of the tutorial.
  Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Need a experience scripter's help NOOOO Help Archive 2 30/01/2011 09:14 AM
need scripter's sggassasin Help Archive 19 18/08/2009 08:17 PM


All times are GMT. The time now is 01:28 PM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.