Всё о сервере, форум!
Основы программирования
ИНФОРМАЦИОННО-РАЗВЛЕКАТЕЛЬНЫЙ ПОРТАЛ

PrR[ Проект SAMP - Romashka [0.3e] ™18+™

Pawn :: Основы скриптинга
Построение сложных команд

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

Функция strtok - это функция, используется, чтобы определить пробел между командой и параметром.

Рассмотрим команду передачи денег.

Для начала нужно, чтобы в начале автовызываемой функции OnPlayerCommandText были объявлены все перечисленные
переменные:

new string[255];
new cmd[256];
new playermoney;
new sendername[MAX_PLAYER_NAME];
new giveplayer[MAX_PLAYER_NAME];
new giveplayerid, moneys, idx;
cmd = strtok(cmdtext, idx);


Переменная string у нас будет хранить текст сообщения о передачи денег между игроками, cmd будет хранить весь текст команды. Sendername будет хранить имя игрока передающего деньги, giveplayer – имя получающего деньги.
Переменная giveplayerid будет хранить ID игрока  получающего деньги, money – будет хранить количество передаваемых денег, а idx будет хранить параметры команды.

Теперь собственно приступаем к разбору самой команды.
После переменных в переменной cmd определяем пробел между командой и параметром . Все начинается с
простейшей команды:

if(strcmp(cmd, "/givemoney", true) == 0)
{
return 0;
}


Внутрь этой команды пишем следующее:

new tmp[256];
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid, COLOR_WHITE, "Введите: /givemoney [id игрока] [сумма]");
return 1;
}
giveplayerid = strval(tmp);
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid, COLOR_WHITE, " Введите: /givemoney [id игрока] [сумма]");
return 1;
}
moneys = strval(tmp);


Создаем переменную tmp, которая будет хранить параметры команды, это текст, который будет после пробела.
Определяем функцией strtok, проблем между командой и параметром .
Ставим условие, если параметр не введен, отправляем в чат сообщение.
Присваиваем переменной giveplayerid, значение первого параметра, которой мы ввели.
Снова определяем пробел, но уже между двумя параметрами. Поскольку в команде  вводится 2 параметра: ID игрока и сумма денег.
Также проверяем, что параметр введен и присваиваем переменной money, значение 2 параметра, которое мы ввели в команде.

Вот пример:
Ввели вы команду: /givemoney 1 400.
Переменная giveplayerid получает значение 1 параметра, то есть будет равно 1, переменная money получает значение 2 параметра и будет равна 400.

Дальше мы пишем проверку, подключен ли игрок, получающий деньги к серверу.

if (IsPlayerConnected(giveplayerid))
{
GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer));
GetPlayerName(playerid, sendername, sizeof(sendername));
playermoney = GetPlayerMoney(playerid);


Внутри проверки функцией GetPlayerName мы получаем имена обоих игроков.
Переменной playermoney мы присваиваем количество денег игрока передающего деньги.
Итак, мы знаем текущее количество денег игрока и количество денег, которое игрок хочет передать, теперь нам нужно поставить условие, что игрок передает сумму денег не больше той суммы, которая у него с собой есть, пишем такое условие:

if (moneys > 0 && playermoney >= moneys)
{
GivePlayerMoney(playerid, (0 - moneys));
GivePlayerMoney(giveplayerid, moneys);
format(string, sizeof(string), "Вы передали %s (id: %d), $%d.", giveplayer,giveplayerid, moneys);
SendClientMessage(playerid, COLOR_YELLOW, string);
format(string, sizeof(string), "Вы получили $%d от %s (id: %d).", moneys, sendername, playerid);
SendClientMessage(giveplayerid, COLOR_YELLOW, string);
}
else
{
SendClientMessage(playerid, COLOR_YELLOW, "Вы не можете передать столько денег.");
}


Читаю условие:
если количество денег, которые игрок хочет передать другому игроку (moneys) больше 0 и количество денег, которое у него есть (playermoney) больше или равно тому количеству, которое он хочет передать (moneys), то мы передаем деньги игроку функцией
GivePlayerMoney. Отнимаем у игрока передающего количество передаваемых денег, и даем их  игроку получающему деньги.
Ну и не забудьте для проверки на подключение игрока получающего деньги поставить else, действие, если игрок не подключен к серверу.

}
else
{
format(string, sizeof(string), "%d не подключен к серверу.", giveplayerid);
SendClientMessage(playerid, COLOR_YELLOW, string);
}


Если все же при компиляции скрипта pawno будет ругаться на strtok, то добавьте в скрипт эту функцию:

strtok(const string[], &index)
{
new length = strlen(string);
while ((index < length) && (string[index] <= ' '))
{
index++;
}
new offset = index;
new result[20];
while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
{
result[index - offset] = string[index];
index++;
}
result[index - offset] = EOS;
return result;
}




Логин: Пароль:
Забыли пароль?Регистрация
При копировании материала с сайта активная ссылка обязательна!
Сайт управляется SiNG cms © 2010-2015