Чекпоинты

Описание: Основы скриптинга
Модератор: SJplayer

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#1 Дим » 22 мая 2013, 16:39

Чекпоинты
Автор: Dima-kun

У чекпоинтов есть разные функции к примеру такие как:

Код: Выделить всё

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) - срабатывает в момент выхода игрока из чекпоинта


Примеры использования чекпоинта:

Код: Выделить всё

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
}   


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

Код: Выделить всё

new pCheckpoint[MAX_PLAYERS];// Массив, который будет содержать какое действие должен выполнять действующий чекпоинт. 
enum // Воспользуемся конструкцей enum для создания состояния чекпонта, т.е. действующий чекпоинт должен давать деньги, или здоровье.

CHECKPOINT_MONEY
CHECKPOINT_HEALTH 

public 
OnPlayerCommandText(playerid,cmdtext[]) // для данного примера, чекпоинты будут вызываться командой 

if(!
strcmp(cmdtext,"/checkmoney",true)) 

SetPlayerCheckpoint(playerid,826.5231,-1352.3420,13.5350,3.0);// Координаты взяты произвольно, только для примера. 
pCheckpoint[playerid]=CHECKPOINT_MONEY;// Т.е. мы скрипту даем понять, что чекпоинт должен давать деньги 
return 1

if(!
strcmp(cmdtext,"/checkhealth",true)) 

SetPlayerCheckpoint(playerid,826.5231,-1352.3420,13.5350,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
}  


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

Код: Выделить всё

forward inCheckpoint(); //Для создания public'a
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,826.5231,-1352.3420,13.5350,3.0);// Координаты взяты произвольно, только для примера. 
pCheckpoint[playerid]=CHECKPOINT_MONEY;// Т.е. мы скрипту даем понять, что чекпоинт должен давать деньги 
return 1

if(!
strcmp(cmdtext,"/checkhealth",true)) 

SetPlayerCheckpoint(playerid,826.5231,-1352.3420,13.5350,3.0);// Координаты взяты из головы, только для примера. 
pCheckpoint[playerid]=CHECKPOINT_HEALTH;// Т.е. мы скрипту даем понять, что чекпоинт должен давать здоровье 
return 1

return 
1
}
public 
inCheckpoint()  


Вот мы и разобрали чекпоинты для игроков. Скажи те ведь легко? А теперь рассмотрим гоночные чекпоинты.

Функции:

Код: Выделить всё

SetPlayerRaceCheckpoint(playeridtypeFloat:xFloat:yFloat:zFloat:nextxFloat:nextyFloat:nextzFloat:size) - Создает гоночный чекпоинт


Парамерты:
playerid - ID для которого чекпоинт длжен появиться
type - Тип чекпоинта.0-Обычный, 1-Финишный, 2-Пустой чекпоинт(без стрелок внутри), 3-Воздушный обычный, 4-Воздушный финишный
Float:x - X-Координата
Float:y - Y-Координата
Float:z - Z-Координата
Float:nextx - X-Координата следующего чекпоинта, т.е. куда будет показываться стрелка.
Float:nexty - Y-Координата следующего чекпоинта, т.е. куда будет показываться стрелка.
Float:nextz - Z-Координата следующего чекпоинта, т.е. куда будет показываться стрелка.
Float:size - размер(Диаметр чекпоинта)

Код: Выделить всё

DisablePlayerRaceCheckpoint(playerid); - деактивирует и скрывает гоночный чекпоинт


Колбэки:

Код: Выделить всё

IsPlayerInRaceCheckpoint(playerid) - Проверяетнаходится ли игрок в гоночном чекпоинте
OnPlayerEnterRaceCheckpoint
(playerid) - Срабатывает когда игрок входит в гоночный чекпоинт
OnPlayerLeaveRaceCheckpoint
(playerid) - Срабатывает когда игрок покидает гоночный чекпоинт


Код: Выделить всё

public OnPlayerSpawn(playerid

SetPlayerRaceCheckpoint(playerid,2,1233.1222,1456.7442,15.1244,0.0,0.0,0.0,5.0);// Координаты взяты из головы. Координаты следующего чекпоинта 0.0, потому что тип чекпоинта 2, стрелки все равно не будет. 
return 1

public 
OnPlayerEnterRaceCheckpoint(playerid

SendClientMessage(playerid,0xff0000ff,"Работает."); 
DisablePlayerRaceCheckpoint(playerid); Выключаем чекпоинт
return 1
}   


Данный скрипт будет выдавать текст ,"Работает.", для того чтобы убедиться что мы все сделали правильно. Сейчас мы попробуем написать простеший скрипт гонки:

Код: Выделить всё

new race[MAX_PLAYERS];// Массив будет отслеживать на каком этапе игрок. 
new Float:Race[3][6]= { 
{
12.1234,15.5112,20.2222,15.2122,9.2322,16.2322}, 
{
15.2122,9.2322,16.2322,18.1233,7.1222,14.0002}, 
{
18.1233,7.1222,14.0002,0.0,0.0,0.0
};
// Массив с этапами гонки, в данном примере всего 3 этапа(3 чекпинта), но вы можете сделать больше по своему желанию 
public OnPlayerCommandText(playeridcmdtext[]) 

if(!
strcmp(cmdtext,"/racestart",true)) //активируем по команде

race[playerid]=0
SetPlayerRaceCheckpoint(playerid,2,Race[race[playerid]][0],Race[race[playerid]][1],Race[race[playerid]][2],0.0,0.0,0.0,5.0);// Координаты следющего чекпоинта 0.0 потому что тип чекпонита 2. 
return 1

return 
1
}
public 
OnPlayerEnterRaceCheckpoint(playerid

race[playerid]++; 
if(
race[playerid]<sizeof(Race))SetPlayerRaceCheckpoint(playerid,0,Race[race[playerid]][0],Race[race[playerid]][1],Race[race[playerid]][2],Race[race[playerid]][3],Race[race[playerid]][4],Race[race[playerid]][5],5.0);// А тут присутствуют координаты следующего чекпоинта, потому что тип чекпоинта 0. 
else if(race[playerid]==sizeof(Race)) 
DisablePlayerRaceCheckpoint(playerid);//Выключаем чекпоинт 

return 1
}   
[center]i love you [s]mxIni[/s] Mysql[/center]


Вернуться в «Основы скриптинга»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 7 гостей