Не видел на этом форуме такой урок и решил выложить
В данном уроке поговорим о том, как создавать и использовать чекпоинты.
Для начала рассмотрим как использовать обычные чекпоинты. Что для этого необходимо:
Функции:
а)SetPlayerCheckpoint(playerid,Float:x,Float:y,Flo at:z,Float:size); - Создает маркер на установленном месте, и нужного размера.
Параметры:
playerid ID игрока, для которого создается чекпоинт
Float:x Х-координата
Float:y Y-координата
Float:z Z-координата
Float:size Размер чекпоинта.
б)IsPlayerInCheckpoint(playerid) - проверяет, находится ли игрок в чекпоинте
Параметры:
playerid - IDпроверяемого игрока.
в)DisablePlayerCheckpoint(playerid); - Функция прячет чекпоинт и дезактивирует его.
Параметры:
playerid - ID игрока, для которого чекпоинт должен исчезнуть.
Колбэки:
OnPlayerEnterCheckpoint(playerid) - срабатывает когда игрок входит в чекпоинт.
OnPlayerLeaveCheckpoint(playerid) - срабатывает в момент выхода игрока из чекпоинта

Стандартный код использования Чекпоинта:

#include <a_samp>
public OnPlayerSpawn(playerid)
{
SetPlayerCheckpoint(playerid,1232.122,1235.552,10.223423,3.0);// Координаты взяты из головы, только для примера.
return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
GivePlayerMoney(playerid,500);
SendClientMessage(playerid,0x00FF00FF,"-! Чувак, вот тебе 500$");
DisablePlayerCheckpoint(playerid);// Если мы хотим, чтобы чекпоинт после этого исчез, то вставляем эту функцию.
return 1;
}

В данном скрипте при заходе на чекпоинт игроку будет даваться 500$ и чекпоинт исчезнет. Но в большинстве случаев, большинству необходимо, чтобы разные чекпоинты выполняли разные действия. Сейчас разберем следующий скрипт:

#include <a_samp>

new pCheckpoint[MAX_PLAYERS];// Массив, который будет содержать какое действие должен выполнять действующий чекпоинт.
enum // Воспользуемся конструкцей enum для создания состояния чекпонта, т.е. действующий чекпоинт должен давать деньги, или здоровье к примеру
{
CHECKPOINT_MONEY,
CHECKPOINT_HEALTH
}
public OnPlayerCommandText(playerid,cmdtext[]) // для данного примера, чекпоинты будут вызываться командой
{
if(!strcmp(cmdtext,"/checkmoney",true))
{
SetPlayerCheckpoint(playerid,1232.122,1235.552,10.223423,3.0);// Координаты взяты из головы, только для примера.
pCheckpoint[playerid]=CHECKPOINT_MONEY;// Т.е. мы скрипту даем понять, что чекпоинт должен давать деньги
return 1;
}
if(!strcmp(cmdtext,"/checkhealth",true))
{
SetPlayerCheckpoint(playerid,1232.122,1235.552,10.223423,3.0);// Координаты взяты из головы, только для примера.
pCheckpoint[playerid]=CHECKPOINT_HEALTH;// Т.е. мы скрипту даем понять, что чекпоинт должен давать здоровье
return 1;
}
return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
switch(pCheckpoint[playerid])
{
case CHECKPOINT_MONEY:
{
GivePlayerMoney(playerid,500);
SendClientMessage(playerid,0x00FF00FF,"-! Чувак, вот тебе 500$");
DisablePlayerCheckpoint(playerid);// Если мы хотим, чтобы чекпоинт после этого исчез, то вставляем эту функцию.
return 1;
}
case CHECKPOINT_HEALTH:
{
new Float:health;
GetPlayerHealth(playerid,health);
SetPlayerHealth(playerid,health+10.0);
SendClientMessage(playerid,0x00FF00FF,"-! Чувак, вот тебе не много здоровья");
DisablePlayerCheckpoint(playerid);// Если мы хотим, чтобы чекпоинт после этого исчез, то вставляем эту функцию.
return 1;
}
}
return 1;
}

Но опять же, скрипт будет выполняться, только в момент входа игрока в чекпоинт. Сейчас мы попробуем сделать скрипт, который будет давать либо здоровье либо деньги, по желанию использующего.

#include <a_samp>
forward inCheckpoint();
new pCheckpoint[MAX_PLAYERS];// Массив, который будет содержать какое действие должен выполнять действующий чекпоинт.
enum // Воспользуемся конструкцей enum для создания состояния чекпонта, т.е. действующий чекпоинт должен давать деньги, или здоровье к примеру
{
CHECKPOINT_MONEY,
CHECKPOINT_HEALTH
}
public OnGameModeInit()
{
SetTimer("inCheckpoint",10000,true);// 1 раз в 10 секунд таймер будет выполняться
return 1;
}
public OnPlayerCommandText(playerid,cmdtext[]) // для данного примера, чекпоинты будут вызываться командой
{
if(!strcmp(cmdtext,"/checkmoney",true))
{
SetPlayerCheckpoint(playerid,1232.122,1235.552,10.223423,3.0);// Координаты взяты из головы, только для примера.
pCheckpoint[playerid]=CHECKPOINT_MONEY;// Т.е. мы скрипту даем понять, что чекпоинт должен давать деньги
return 1;
}
if(!strcmp(cmdtext,"/checkhealth",true))
{
SetPlayerCheckpoint(playerid,1232.122,1235.552,10.223423,3.0);// Координаты взяты из головы, только для примера.
pCheckpoint[playerid]=CHECKPOINT_HEALTH;// Т.е. мы скрипту даем понять, что чекпоинт должен давать здоровье
return 1;
}
return 1;
}

public inCheckpoint()
{
for(new idx=GetMaxPlayers();idx>=0;--idx)
{
if(IsPlayerConnected(idx)&&IsPlayerInCheckpoint(idx))
{
switch(pCheckpoint[idx])
{
case CHECKPOINT_MONEY:
{
GivePlayerMoney(idx,500);
SendClientMessage(idx,0x00FF00FF,"-! Чувак, вот тебе 500$");
return 1;
}
case CHECKPOINT_HEALTH:
{
GetPlayerHealth(playerid,health);
SetPlayerHealth(playerid,health+10.0);
SendClientMessage(idx,0x00FF00FF,"-! Чувак, вот тебе не много здоровья");
return 1;
}
}
}
}
return 1;
}