Look here
#1

My problem is that when i enter a checkpoint i show a sendclientmessage and it not stops to show. I need to show it only 1 time. I know that the problem is that the checkpoint checking with the timer if i'm on checkpoint and shows me the message again by timer. I need to see this message only 1 time.




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;
public OnFilterScriptInit()
{
  SetTimer("Stream", 1000, true);
  CPS1 = CreateCheckpoint(-1, 2317.130615, 692.398498, 11.460937, 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)
    {
      SendClientMessage(playerid,color,"To exit out of the checkpoint, hit 'Close' to close the menu, and press 'space' to walk out.");
    }
    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;
}
Reply
#2

After you send the message the first time, disable the checkpoint (DisablePlayerCheckpoint) or alternatively create a variable. And set the variable to '1' if he enters the checkpoint. Then in the check, if he is already in the checkpoint, don't send the message again.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)