[Tutorial] [TUT]Basic Checkpoint Streamer
#1

Basic Checkpoint Streamer
This is my 4th TUT, Enjoy .

As always, lets start off with the defines:
pawn Код:
#define MAX_CPS 500 //Change it if you need more or less

enum Info //CP ENUM
{
  Float:CPX, //Xpos
  Float:CPY, //Ypos
  Float:CPZ, //Zpos
  Float:Size, //Size of the CP
  Float:Viewdist //Viewdistance
};

new CPID = -1; //CPID
new PlayerCP[MAX_PLAYERS] = -1; //PlayerCheckpoints (Only one can be active at once).
new CPinfo[MAX_CPS][Info]; //CPINFO
new CPActive[MAX_PLAYERS][MAX_CPS]; //CPActive for player
new CPDisabled[MAX_CPS]; //For disabling checkpoints
Now with all those boring defines over and done with lets get on to the function.

pawn Код:
stock CreateCheckpoint(playerid = -1, Float:cpX, Float:cpY, Float:cpZ, Float:cpSize, Float:viewdist)
Playerid - playerid of the checkpoint, Use -1 if the checkpoint is going to be for everyone. (If left black it's for everyone).
cpX - Xpos of the CP.
cpY - Ypos of the CP.
cpZ - Zpos of the CP.
cpSize - Checkpoint size.
viewdist - The view distance of the checkpoint.

OK, now for the actual function:

pawn Код:
stock CreateCheckpoint(playerid, Float:cpX, Float:cpY, Float:cpZ, Float:cpSize, Float:viewdist = 35.0)
{
  CPID ++; //CPID
  CPinfo[CPID][CPX] = cpX; //CPX Pos
  CPinfo[CPID][CPY] = cpY; //CPY Pos
  CPinfo[CPID][CPZ] = cpZ; //CPZ Pos
  CPinfo[CPID][Size] = cpSize; //Checkpoint Size
  CPinfo[CPID][Viewdist] = viewdist; //View distance
  if(playerid != -1)
  {
    CPActive[playerid][CPID] ++; //Makes the player able to view that checkpoint
  }
  if(playerid == -1)
  {
    for(new i; i<MAX_PLAYERS; i++)
    {
      CPActive[i][CPID] ++;
    }
  }
  return CPID;
}
Now that that is over and done with lets start streaming!

Firstly the timer (Place it under OnGameModeInit or under OnFilterScriptInit):
pawn Код:
SetTimer("Stream", 300, true);
OK, now the actual streaming function:
pawn Код:
forward Stream();
public Stream()
{
    for(new i; i < MAX_PLAYERS; i ++) //Loops through 500 players
    {
      if(IsPlayerConnected(i)) //Brings the 500 players down to the online ones
      {
        PlayerCP[i] = -1;
        for(new j; j < CPID + 1; j ++) //Loops through all CP's
            {
                if(CPDisabled[j] == 0) //Checks if the CP is disabled.
                {
                    if(IsPlayerInRangeOfPoint(i, CPinfo[j][Viewdist], CPinfo[j][CPX], CPinfo[j][CPY], CPinfo[j][CPZ]) && CPActive[i][j] == 1) //Is the player in range of a CP
                {
                SetPlayerCheckpoint(i, CPinfo[j][CPX], CPinfo[j][CPY], CPinfo[j][CPZ], CPinfo[j][Size]);//Sets the player checkpoint
                PlayerCP[i] = j; //Sets the player checkpoint to that in the variable.
                        printf("PCP:%d", j);
           }
                }
            }
            if(PlayerCP[i] == -1) //If there is no CP close enough
            {
                print("NAHBRO");
                PlayerCP[i] = -1; //PlayerCP isn't anything
            DisablePlayerCheckpoint(i); //Disable any checkpoint visible.
            continue;
      }
        }
  }
  return 1;
}
Now we have one last thing that is needed, what happens when we enter the Checkpoints.

pawn Код:
public OnPlayerEnterCheckpoint(playerid)
{
  if(PlayerCP[playerid] != -1) return OnPlayerEnterStreamedCheckpoint(playerid, PlayerCP[playerid]);
  return 1;
}

stock OnPlayerEnterStreamedCheckpoint(playerid, CPID)
{
 
}
For every checkpoint you must assign a variable to it E.g.

pawn Код:
new CPS1, CPS2, CPS3;
CPS1 = CreateCheckpoint(-1, 1000, 1000, 25, 3, 50);
CPS2 = CreateCheckpoint(-1, 1000, 1100, 25, 3, 50);
CPS3 = CreateCheckpoint(-1, 1000, 1200, 25, 3, 50);
//Etc...
So now we have a ID assigned, we can do this under our OnPlayerEnterStreamedCheckpoint function:

pawn Код:
stock OnPlayerEnterStreamedCheckpoint(playerid, CPiD)
{
  if(CPiD == CPS1)
  {
    GameTextForPlayer(playerid, "You have entered checkpoint 1!", 3000, 3);
  }
  if(CPiD == CPS2)
  {
    GameTextForPlayer(playerid, "You have entered checkpoint 2!", 3000, 3);
  }
  if(CPiD == CPS3)
  {
    GameTextForPlayer(playerid, "You have entered checkpoint 3!", 3000, 3);
  }
  //ETC...
}
Now here is a few functions that you might find useful:

pawn Код:
stock DestroyCheckpoint(CPiD) //Destory's a checkpoint
{
    CPDisabled[CPiD] = 1;
    for(new i; i< MAX_PLAYERS; i++)
    {
      if(PlayerCP[i] == CPiD)
      {
        DisablePlayerCheckpoint(i);
      }
    }
}


stock TogglePlayerCheckpoint(playerid, CPiD, toggled) //Toggles a checkpoint for a player 0 = Not active, 1 = active :)
{
  CPActive[playerid][CPiD] = toggled;
}
So, the overall script should look something like this:

pawn Код:
#include <a_samp>

#define MAX_CPS 500 //Change it if you need more or less

enum Info //CP ENUM
{
  Float:CPX, //Xpos
  Float:CPY, //Ypos
  Float:CPZ, //Zpos
  Float:Size, //Size of the CP
  Float:Viewdist //Viewdistance
};

new CPID = -1; //CPID
new PlayerCP[MAX_PLAYERS] = -1; //PlayerCheckpoints (Only one can be active at once).
new CPinfo[MAX_CPS][Info]; //CPINFO
new CPActive[MAX_PLAYERS][MAX_CPS]; //CPActive for player
new CPDisabled[MAX_CPS]; //For disabling checkpoints

stock CreateCheckpoint(playerid, Float:cpX, Float:cpY, Float:cpZ, Float:cpSize, Float:viewdist = 35.0)
{
  CPID ++; //CPID
  CPinfo[CPID][CPX] = cpX; //CPX Pos
  CPinfo[CPID][CPY] = cpY; //CPY Pos
  CPinfo[CPID][CPZ] = cpZ; //CPZ Pos
  CPinfo[CPID][Size] = cpSize; //Checkpoint Size
  CPinfo[CPID][Viewdist] = viewdist; //View distance
  if(playerid != -1)
  {
    CPActive[playerid][CPID] ++; //Makes the player able to view that checkpoint
  }
  if(playerid == -1)
  {
    for(new i; i<MAX_PLAYERS; i++)
    {
      CPActive[i][CPID] ++;
    }
  }
  return CPID;
}
new CPS1, CPS2, CPS3;
public OnFilterScriptInit()
{
  SetTimer("Stream", 1000, true);
  CPS1 = CreateCheckpoint(-1, 2317.130615, 692.398498, 11.460937, 3.0, 30.0);
  CPS2 = CreateCheckpoint(-1, 2396.482666, 691.487060, 11.453125, 3.0, 30.0);
  CPS3 = CreateCheckpoint(-1, 2396.482666, 697.487060, 11.453125, 3.0, 30.0);
    return 1;
}

forward Stream();
public Stream()
{
    for(new i; i < MAX_PLAYERS; i ++) //Loops through 500 players
    {
      if(IsPlayerConnected(i)) //Brings the 500 players down to the online ones
      {
        PlayerCP[i] = -1;
        for(new j; j < CPID + 1; j ++) //Loops through all CP's
            {
                if(CPDisabled[j] == 0) //Checks if the CP is disabled.
                {
                    if(IsPlayerInRangeOfPoint(i, CPinfo[j][Viewdist], CPinfo[j][CPX], CPinfo[j][CPY], CPinfo[j][CPZ]) && CPActive[i][j] == 1) //Is the player in range of a CP
                {
                SetPlayerCheckpoint(i, CPinfo[j][CPX], CPinfo[j][CPY], CPinfo[j][CPZ], CPinfo[j][Size]);//Sets the player checkpoint
                PlayerCP[i] = j; //Sets the player checkpoint to that in the variable.
                        printf("PCP:%d", j);
           }
                }
            }
            if(PlayerCP[i] == -1) //If there is no CP close enough
            {
                print("NAHBRO");
                PlayerCP[i] = -1; //PlayerCP isn't anything
            DisablePlayerCheckpoint(i); //Disable any checkpoint visible.
            continue;
      }
        }
  }
  return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
  if(PlayerCP[playerid] != -1) return OnPlayerEnterStreamedCheckpoint(playerid, PlayerCP[playerid]);
  return 1;
}

stock OnPlayerEnterStreamedCheckpoint(playerid, CPiD)
{
    printf("CPID: %d", CPiD);
    if(CPiD == CPS1)
    {
      GameTextForPlayer(playerid, "CP1", 2000, 3);
    }
    if(CPiD == CPS2)
    {
      GameTextForPlayer(playerid, "CP2", 2000, 3);
    }
    if(CPiD == CPS3)
    {
      GameTextForPlayer(playerid, "CP3", 2000, 3);
    }
    return 1;
}

stock DestroyCheckpoint(CPiD) //Destory's a checkpoint
{
    CPDisabled[CPiD] = 1;
}

stock TogglePlayerCheckpoint(playerid, CPiD, toggled) //Toggles a checkpoint for a player 0 = Not active, 1 = active :)
{
  CPActive[playerid][CPiD] = toggled;
}
Some more functions

pawn Код:
stock GetPlayerCheckpointID(playerid)
{
  return PlayerCP[playerid];
}

stock IsAnyoneStreamingCP(CPiD)
{
  for(new i; i<MAX_PLAYERS; i++)
  {
    if(PlayerCP[i] == CPiD) return i;
  }
  return 0;
}
If you want better indentation that is posted here, http://www.datafilehost.com/download-6801bbd1.html - Outdated.

Enjoy, post any questions etc .
Reply


Messages In This Thread
[TUT]Basic Checkpoint Streamer - by [HiC]TheKiller - 04.01.2010, 08:13
Re: [TUT]Basic Checkpoint Streamer - by V1ceC1ty - 04.01.2010, 08:53
Re: [TUT]Basic Checkpoint Streamer - by Deat_Itself - 04.01.2010, 09:16
Re: [TUT]Basic Checkpoint Streamer - by [03]Garsino - 04.01.2010, 09:45
Re: [TUT]Basic Checkpoint Streamer - by HydraX - 04.01.2010, 14:57
Re: [TUT]Basic Checkpoint Streamer - by [HiC]TheKiller - 04.01.2010, 18:23
Re: [TUT]Basic Checkpoint Streamer - by SegaX - 06.01.2010, 13:38
Re: [TUT]Basic Checkpoint Streamer - by Epic Shower - 30.03.2010, 21:26
Re: [TUT]Basic Checkpoint Streamer - by DarkPower - 06.04.2010, 22:21
Re: [TUT]Basic Checkpoint Streamer - by [HiC]TheKiller - 06.04.2010, 22:32
Re: [TUT]Basic Checkpoint Streamer - by DarkPower - 07.04.2010, 16:54
Re: [TUT]Basic Checkpoint Streamer - by DarkPower - 08.04.2010, 09:17
Re: [TUT]Basic Checkpoint Streamer - by Jay. - 08.04.2010, 09:19
Re: [TUT]Basic Checkpoint Streamer - by DarkPower - 08.04.2010, 16:47
Re: [TUT]Basic Checkpoint Streamer - by Nero_3D - 08.04.2010, 17:36
Re: [TUT]Basic Checkpoint Streamer - by DarkPower - 08.04.2010, 20:11
Re: [TUT]Basic Checkpoint Streamer - by [HiC]TheKiller - 08.04.2010, 22:38
Re: [TUT]Basic Checkpoint Streamer - by [MKD]Max - 07.10.2010, 13:53
Re: [TUT]Basic Checkpoint Streamer - by iRemix - 31.01.2011, 14:00
Re: [TUT]Basic Checkpoint Streamer - by Mean - 04.02.2011, 20:21
Re: [TUT]Basic Checkpoint Streamer - by michaelcosyns - 18.04.2013, 19:14
Re: [TUT]Basic Checkpoint Streamer - by JimmyCh - 22.08.2013, 15:09
Re: [TUT]Basic Checkpoint Streamer - by GabsReDeal - 12.11.2013, 15:11

Forum Jump:


Users browsing this thread: 5 Guest(s)