[Tutorial] Creating a rank system with textdraws for each rank + certain health/armour upon spawn.
#1

This is my first tutorial, so please don't be so rude if you don't like it, and try and help me if something is wrong.
Alright, let's get started...

1.- At the top of your gamemode define a global variable, in wich we'll know the rank a player is..
pawn Код:
new Rank[MAX_PLAYERS];
2.- Here we'll create the textdraw variables.

pawn Код:
new Text:Textdraw0[MAX_PLAYERS];
new Text:Textdraw1[MAX_PLAYERS];
new Text:Textdraw2[MAX_PLAYERS];
new Text:Textdraw3[MAX_PLAYERS];
new Text:Textdraw4[MAX_PLAYERS];
new Text:Textdraw5[MAX_PLAYERS];
new Text:R1[MAX_PLAYERS];
new Text:R2[MAX_PLAYERS];
new Text:R3[MAX_PLAYERS];
new Text:R4[MAX_PLAYERS];
new Text:R5[MAX_PLAYERS];
Q: Why using MAX_PLAYERS?
A: it is because it will create a global array with one slot for every player, then the function will assign whatever is in the variable in this case the textdraw.

3.- In this step we'll be creating the textdraws.
Costep 3-1: Find the public OnGameModeInIt()
pawn Код:
public OnGameModeInit() //In this public we'll be creating the textdraws.
{
    return 1;
}
Costep 3-2
pawn Код:
public OnGameModeInIt()
{
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    Textdraw0[i] = TextDrawCreate(503.000000, 102.000000, "]");
    TextDrawBackgroundColor(Textdraw0[i], 255);
    TextDrawFont(Textdraw0[i], 0);
    TextDrawLetterSize(Textdraw0[i], 0.529999, 1.299999);
    TextDrawColor(Textdraw0[i], 16777215);
    TextDrawSetOutline(Textdraw0[i], 1);
    TextDrawSetProportional(Textdraw0[i], 1);
    TextDrawUseBox(Textdraw0[i], 1);
    TextDrawBoxColor(Textdraw0[i], -1347440726);
    TextDrawTextSize(Textdraw0[i], 605.000000, 0.000000);

    Textdraw1[i] = TextDrawCreate(521.000000, 102.000000, "]");
    TextDrawBackgroundColor(Textdraw1[i], 255);
    TextDrawFont(Textdraw1[i], 0);
    TextDrawLetterSize(Textdraw1[i], 0.509999, 1.300000);
    TextDrawColor(Textdraw1[i], 16777215);
    TextDrawSetOutline(Textdraw1[i], 1);
    TextDrawSetProportional(Textdraw1[i], 1);

    Textdraw2[i] = TextDrawCreate(538.000000, 102.000000, "]");
    TextDrawBackgroundColor(Textdraw2[i], 255);
    TextDrawFont(Textdraw2[i], 0);
    TextDrawLetterSize(Textdraw2[i], 0.509999, 1.300000);
    TextDrawColor(Textdraw2[i], 16777215);
    TextDrawSetOutline(Textdraw2[i], 1);
    TextDrawSetProportional(Textdraw2[i], 1);

    Textdraw3[i] = TextDrawCreate(556.000000, 102.000000, "]");
    TextDrawBackgroundColor(Textdraw3[i], 255);
    TextDrawFont(Textdraw3[i], 0);
    TextDrawLetterSize(Textdraw3[i], 0.509999, 1.300000);
    TextDrawColor(Textdraw3[i], 16777215);
    TextDrawSetOutline(Textdraw3[i], 1);
    TextDrawSetProportional(Textdraw3[i], 1);

    Textdraw4[i] = TextDrawCreate(575.000000, 102.000000, "]");
    TextDrawBackgroundColor(Textdraw4[i], 255);
    TextDrawFont(Textdraw4[i], 0);
    TextDrawLetterSize(Textdraw4[i], 0.509999, 1.300000);
    TextDrawColor(Textdraw4[i], 16777215);
    TextDrawSetOutline(Textdraw4[i], 1);
    TextDrawSetProportional(Textdraw4[i], 1);

    Textdraw5[i] = TextDrawCreate(594.000000, 102.000000, "0");
    TextDrawBackgroundColor(Textdraw5[i], 255);
    TextDrawFont(Textdraw5[i], 3);
    TextDrawLetterSize(Textdraw5[i], 0.509999, 1.300000);
    TextDrawColor(Textdraw5[i], 16777215);
    TextDrawSetOutline(Textdraw5[i], 1);
    TextDrawSetProportional(Textdraw5[i], 1);

    R1[i] = TextDrawCreate(594.000000, 102.000000, "1");
    TextDrawBackgroundColor(R1[i], 255);
    TextDrawFont(R1[i], 3);
    TextDrawLetterSize(R1[i], 0.509999, 1.300000);
    TextDrawColor(R1[i], 16777215);
    TextDrawSetOutline(R1[i], 1);
    TextDrawSetProportional(R1[i], 1);

    R2[i] = TextDrawCreate(594.000000, 102.000000, "2");
    TextDrawBackgroundColor(R2[i], 255);
    TextDrawFont(R2[i], 3);
    TextDrawLetterSize(R2[i], 0.509999, 1.300000);
    TextDrawColor(R2[i], 16777215);
    TextDrawSetOutline(R2[i], 1);
    TextDrawSetProportional(R2[i], 1);

    R3[i] = TextDrawCreate(594.000000, 102.000000, "3");
    TextDrawBackgroundColor(R3[i], 255);
    TextDrawFont(R3[i], 3);
    TextDrawLetterSize(R3[i], 0.509999, 1.300000);
    TextDrawColor(R3[i], 16777215);
    TextDrawSetOutline(R3[i], 1);
    TextDrawSetProportional(R3[i], 1);

    R4[i] = TextDrawCreate(594.000000, 102.000000, "4");
    TextDrawBackgroundColor(R4[i], 255);
    TextDrawFont(R4[i], 3);
    TextDrawLetterSize(R4[i], 0.509999, 1.300000);
    TextDrawColor(R4[i], 16777215);
    TextDrawSetOutline(R4[i], 1);
    TextDrawSetProportional(R4[i], 1);

    R5[i] = TextDrawCreate(594.000000, 102.000000, "5");
    TextDrawBackgroundColor(R5[i], 255);
    TextDrawFont(R5[i], 3);
    TextDrawLetterSize(R5[i], 0.509999, 1.300000);
    TextDrawColor(R5[i], 16777215);
    TextDrawSetOutline(R5[i], 1);
    TextDrawSetProportional(R5[i], 1);
    }
    return 1;
}
Q: What is this line for?
pawn Код:
for(new i = 0; i < MAX_PLAYERS; i++)
    {

A: Well this line is becase as we have defined the array MAX_PLAYERS ([playerid]) and you can't use playerid in on OnGameModeInIt playerid is replaced with the array
pawn Код:
[i]
.

4.- Creating the ranks.

Costep 4-1: Find the public OnPlayerSpawn(playerid)
pawn Код:
public OnPlayerSpawn(playerid) //In this public we'll be creating the ranks + showing the textdraws.
{
    return 1;
}
Costep 4-2: Creating the ranks.
pawn Код:
public OnPlayerSpawn(playerid)
{
 if(GetPlayerScore(playerid) <=0) // If the player's score is 0, then it will show him TextDraw 5.
    {
        TextDrawShowForPlayer(playerid, Textdraw5[playerid]); //Showing TD 5 defined in ongamemodeinit
        TextDrawHideForPlayer(playerid, Textdraw0[playerid]);
        TextDrawHideForPlayer(playerid, Textdraw1[playerid]);
        TextDrawHideForPlayer(playerid, Textdraw2[playerid]);
        TextDrawHideForPlayer(playerid, Textdraw3[playerid]);
        TextDrawHideForPlayer(playerid, Textdraw4[playerid]);
        TextDrawHideForPlayer(playerid, R1[playerid]);
        TextDrawHideForPlayer(playerid, R2[playerid]);
        TextDrawHideForPlayer(playerid, R3[playerid]);
        TextDrawHideForPlayer(playerid, R4[playerid]);
        TextDrawHideForPlayer(playerid, R5[playerid]);
        SetPlayerHealth(playerid, 80);
        SendClientMessage(playerid, Azul, " ");
        SendClientMessage(playerid, Azul, "{FFFFFF}[ {33CCFF}* {FFFFFF}] You are rank {FFFFFF}({33CCFF}0{FFFFFF}) so you get {33CCFF}80 {FFFFFF}hp and {33CCFF}0 {FFFFFF}armour");
        SendClientMessage(playerid, COLOR_GREY, "[ * ] Read /ranks for more information!");
        SendClientMessage(playerid, Azul, " ");
        Rank[playerid] = 0; //Here's the variable storing the player's rank this case = 0.
    }
else if(GetPlayerScore(playerid) <=100) //note the else if.
    {
        TextDrawHideForPlayer(playerid, Textdraw5[playerid]);
        TextDrawShowForPlayer(playerid, Textdraw0[playerid]);
        TextDrawHideForPlayer(playerid, Textdraw1[playerid]);
        TextDrawHideForPlayer(playerid, Textdraw2[playerid]);
        TextDrawHideForPlayer(playerid, Textdraw3[playerid]);
        TextDrawHideForPlayer(playerid, Textdraw4[playerid]);
        TextDrawShowForPlayer(playerid, R1[playerid]);
        TextDrawHideForPlayer(playerid, R2[playerid]);
        TextDrawHideForPlayer(playerid, R3[playerid]);
        TextDrawHideForPlayer(playerid, R4[playerid]);
        TextDrawHideForPlayer(playerid, R5[playerid]);
        SetPlayerHealth(playerid, 100);
        SetPlayerArmour(playerid, 10);
        SendClientMessage(playerid, Azul, " ");
        SendClientMessage(playerid, Azul, "{FFFFFF}[ {33CCFF}* {FFFFFF}] You are rank {FFFFFF}({33CCFF}1{FFFFFF}) so you get {33CCFF}100 {FFFFFF}hp and {33CCFF}10 {FFFFFF}armour");
        SendClientMessage(playerid, COLOR_GREY, "[ * ] Read /ranks for more information!");
        SendClientMessage(playerid, Azul, " ");
        Rank[playerid] = 1;
    }
    else if(GetPlayerScore(playerid) <=150)
    {
        TextDrawHideForPlayer(playerid, Textdraw5[playerid]);
        TextDrawShowForPlayer(playerid, Textdraw0[playerid]);
        TextDrawShowForPlayer(playerid, Textdraw1[playerid]);
        TextDrawHideForPlayer(playerid, Textdraw2[playerid]);
        TextDrawHideForPlayer(playerid, Textdraw3[playerid]);
        TextDrawHideForPlayer(playerid, Textdraw4[playerid]);
        TextDrawHideForPlayer(playerid, R1[playerid]);
        TextDrawShowForPlayer(playerid, R2[playerid]);
        TextDrawHideForPlayer(playerid, R3[playerid]);
        TextDrawHideForPlayer(playerid, R4[playerid]);
        TextDrawHideForPlayer(playerid, R5[playerid]);
        SetPlayerHealth(playerid, 100);
        SetPlayerArmour(playerid, 30);
        SendClientMessage(playerid, Azul, " ");
        SendClientMessage(playerid, Azul, "{FFFFFF}[ {33CCFF}* {FFFFFF}] You are rank {FFFFFF}({33CCFF}2{FFFFFF}) so you get {33CCFF}100 {FFFFFF}hp and {33CCFF}30 {FFFFFF}armour");
        SendClientMessage(playerid, COLOR_GREY, "[ * ] Read /ranks for more information!");
        SendClientMessage(playerid, Azul, " ");
        Rank[playerid] = 2;
    }
    else if(GetPlayerScore(playerid) <=300)
    {
        TextDrawHideForPlayer(playerid, Textdraw5[playerid]);
        TextDrawShowForPlayer(playerid, Textdraw0[playerid]);
        TextDrawShowForPlayer(playerid, Textdraw1[playerid]);
        TextDrawShowForPlayer(playerid, Textdraw2[playerid]);
        TextDrawHideForPlayer(playerid, Textdraw3[playerid]);
        TextDrawHideForPlayer(playerid, Textdraw4[playerid]);
        TextDrawHideForPlayer(playerid, R1[playerid]);
        TextDrawHideForPlayer(playerid, R2[playerid]);
        TextDrawShowForPlayer(playerid, R3[playerid]);
        TextDrawHideForPlayer(playerid, R4[playerid]);
        TextDrawHideForPlayer(playerid, R5[playerid]);
        SetPlayerHealth(playerid, 100);
        SetPlayerArmour(playerid, 50);
        SendClientMessage(playerid, Azul, " ");
        SendClientMessage(playerid, Azul, "{FFFFFF}[ {33CCFF}* {FFFFFF}] You are rank {FFFFFF}({33CCFF}3{FFFFFF}) so you get {33CCFF}100 {FFFFFF}hp and {33CCFF}50 {FFFFFF}armour");
        SendClientMessage(playerid, COLOR_GREY, "[ * ] Read /ranks for more information!");
        SendClientMessage(playerid, Azul, " ");
        Rank[playerid] = 3;
    }
    else if(GetPlayerScore(playerid) <=750)
    {
        TextDrawHideForPlayer(playerid, Textdraw5[playerid]);
        TextDrawShowForPlayer(playerid, Textdraw0[playerid]);
        TextDrawShowForPlayer(playerid, Textdraw1[playerid]);
        TextDrawShowForPlayer(playerid, Textdraw2[playerid]);
        TextDrawShowForPlayer(playerid, Textdraw3[playerid]);
        TextDrawHideForPlayer(playerid, Textdraw4[playerid]);
        TextDrawHideForPlayer(playerid, R1[playerid]);
        TextDrawHideForPlayer(playerid, R2[playerid]);
        TextDrawHideForPlayer(playerid, R3[playerid]);
        TextDrawShowForPlayer(playerid, R4[playerid]);
        TextDrawHideForPlayer(playerid, R5[playerid]);
        SetPlayerHealth(playerid, 100);
        SetPlayerArmour(playerid, 75);
        SendClientMessage(playerid, Azul, " ");
        SendClientMessage(playerid, Azul, "{FFFFFF}[ {33CCFF}* {FFFFFF}] You are rank {FFFFFF}({33CCFF}4{FFFFFF}) so you get {33CCFF}100 {FFFFFF}hp and {33CCFF}75 {FFFFFF}armour");
        SendClientMessage(playerid, COLOR_GREY, "[ * ] Read /ranks for more information!");
        SendClientMessage(playerid, Azul, " ");
        Rank[playerid] = 4;
    }
    else if(GetPlayerScore(playerid) <=1000)
    {
        TextDrawHideForPlayer(playerid, Textdraw5[playerid]);
        TextDrawShowForPlayer(playerid, Textdraw0[playerid]);
        TextDrawShowForPlayer(playerid, Textdraw1[playerid]);
        TextDrawShowForPlayer(playerid, Textdraw2[playerid]);
        TextDrawShowForPlayer(playerid, Textdraw3[playerid]);
        TextDrawShowForPlayer(playerid, Textdraw4[playerid]);
        TextDrawHideForPlayer(playerid, R1[playerid]);
        TextDrawHideForPlayer(playerid, R2[playerid]);
        TextDrawHideForPlayer(playerid, R3[playerid]);
        TextDrawHideForPlayer(playerid, R4[playerid]);
        TextDrawShowForPlayer(playerid, R5[playerid]);
        SetPlayerHealth(playerid, 100);
        SetPlayerArmour(playerid, 100);
        SendClientMessage(playerid, Azul, " ");
        SendClientMessage(playerid, Azul, "{FFFFFF}[ {33CCFF}* {FFFFFF}] You are rank {FFFFFF}({33CCFF}1{FFFFFF}) so you get {33CCFF}100 {FFFFFF}hp and {33CCFF}100 {FFFFFF}armour");
        SendClientMessage(playerid, COLOR_GREY, "[ * ] Read /ranks for more information!");
        SendClientMessage(playerid, Azul, " ");
        Rank[playerid] = 5;
    }
    return 1;
}
Q: Why hiding the rest of the textdraws?
A: It is because, if we create the rank only showing one textdraw the rest of the textdraws would be bugged as they'll show up later.

Example:
Player gets all the ranks by mistake, admin sets his score to 0. All the textdraws will be there as we are not hiding the textdraws.

Note: You could create the /ranks command with the score you're gonna use.

Here's a picture of how the ranks look like.

When the player is rank 0.


When the player is rank 5.

Tips: You can use zamaroht textdraw editor to create the textdraws https://sampforum.blast.hk/showthread.php?tid=290640

Or iPLEOMAX Textdraw editor: https://sampforum.blast.hk/showthread.php?tid=376758
Reply
#2

Great tutorial, thanks!
Reply
#3

Use player textdraws rather than global textdraws so you don't have to waste so many global textdraws, everything in SA:MP has limits, remember that.

https://sampwiki.blast.hk/wiki/Limits
https://sampwiki.blast.hk/wiki/CreatePlayerTextDraw
Reply
#4

Indeed, looks easier.. for the next time, thank you
Reply
#5

great and useful tutorial good job mate
Reply
#6

Well, honestly, the tutorial is poorly explained... No, not even poorly, you haven't explain anything, just posted the code and that's all. This should rather be in filterscript section.

Even though it's not explained, it can be useful for some people I guess.

You need to explain better, that's why it's tutorial section.

To understand better what I'm talking about, please read this topic:

https://sampforum.blast.hk/showthread.php?tid=65567
Reply
#7

Can be done in a simpler way.
No need to create different textdraws for each star, you could create one textdraw and use TextDrawSetString.

Poorly explained though, explain every minor thing please. Why here, why not there, what does this do, what will this do, etc.

Anyways, explain more, and the tutorial will be fine.
Reply
#8

Tomorrow i'll re-make it, thanks for the suggestions.
Reply
#9

Good one, +3 reps.
Reply
#10

Very Nicely Done. Thanks.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)