А теперь попробуем создать команду для передачи денег от одного игрока к другому с помощью stock. Сначала создадим stock с тремя аргументами, в которые запишем ID обоих игроков и сумму передачи денег
PHP код:
stock PlayerMoneyToPlayer(player1, player2, money)//Опять же, имена аргументов выбираете только Вы. Я создаю такие только для того, чтобы Вы чётко видели что и где менять
{
new string[71];//57 символов занимает весь текст. Максимальная сумма денег на руках игрока не может превышать 11 символов, поэтому к 57 прибавляем 11 и выделяем 3 ячейки для хранения трёхзначного ID игрока (не видел онлайн в 1000 человек ещё, так что 3 символа хватит). 57 + 11 + 3 = 71
GivePlayerMoney(player1,-=money);//Отнимем сумму у игрока, который решил передать деньги
GivePlayerMoney(player2,+=money);//Выдадим деньги игроку, которому первый игрок решил передать деньги
format(string,sizeof(string),"Вы передали %d$ игроку с ID %d", money, player2);
SendClientMessage(player1,0xFFFFFFFF,string);//Оповестим первого игрока о успешной передаче денег
format(string,sizeof(string),"Вам передали %d$. ID игрока, передавшего вам деньги - %d", money, player2);
SendClientMessage(player2,0xFFFFFFFF,string);//Оповестим второго игрока о успешном получении денег
return 1;//Отсылаем серверу сигнал о том, что всё прошло успешно и можно продолжать выполнять код после stock.
}
И теперь создадим команду, в которой и присвоим нужные значения для аргументов stock
Код, требуемый для правильной работы strtok Этот код нужно вставлять в самое начало паблика OnPlayerCommandText, если его нет. Без него функция srtok работать не будет
PHP код:
new cmd[128], idx[128], tmp[128];//Создадим переменные, которые нам понадобятся для дальнейшей работы с функцией strtok
cmd = strtok(cmdtext, idx);//Приравняем нашу переменную к значению strtok и теперь, при создании команду, будем использовать не cmdtext, а cmd (иначе strtok работать не будет).
PHP код:
if (strcmp("/pay", cmd, true, 10) == 0)
{
tmp = strtok(cmdtext, idx);//strtok начнёт искать символы после пробела, которые игрок введёт при использовании команды
if(!strlen(tmp)) return SendClientMessage(playerid,0xFF0000AA,"Вы не ввели ID игрока");//Если игрок не написал ничего после первого пробела - оповестим его об этом и оборвём выполнение команды
new giveplayerid = strval(tmp);//strval преобразует введённые игроком данные в число. Если игрок введёт текст, strval выдаст значение 0. Запишем в giveplayerid ID игрока, которому надо передать деньги
if(playerid == giveplayerid) return SendClientMessage(playerid,0xFF0000AA,"Вы ввели свой ID. Себе деньги передать нельзя");//Если игрок ввёл свой ID, оповестим его об этом и не дадим перевести деньги (это делает return)
if(!IsPlayerConnected(giveplayerid)) return SendClientMessage(playerid,0xFF0000AA,"Данного игрока нет в сети");//Если игрок ввёл ID игрока, которого нет на сервере, оповестим его об этом и не дадим перевести деньги
tmp = strtok(cmdtext, idx);//Дадим сигнал моду для поиска ещё одного пробела
if(!strlen(tmp)) return SendClientMessage(playerid,0xFF0000AA,"Вы не ввели сумму для передачи");//Если игрок не написал ничего после второго пробела - оповестим его об этом и оборвём выполнение команды
new pmoney = strval(tmp);//Запишем сумму, которую игрок введёт после ввода IP
if(pmoney < GetPlayerMoney(playerid)) return SendClientMessage(playerid,0xFF0000AA,"У вас недостаточно денег на руках для передачи");//Если денег у игрока меньше чем он ввёл в команду, оповестим его об этом и прервём выполнение кода
//Теперь пора вызывать наш stock. После команды будет объяснение именно этого кода
PlayerMoneyToPlayer(playerid, giveplayerid, pmoney);//Передаём деньги с помощью stock
return 1;
}
"
playerid" хранит значение ID игрока, который ввёл команду и передаст это значение аргументу "
player1" из нашего stock
"
giveplayerid" имеет значение ID игрока, которому надо передать деньги и передаст это значение аргументу "
player2" из нашего stock
"
pmoney" имеет значение суммы денег для передачи и передаст это значение аргументу "
money" из нашего stock
Если кто-то не понял то, как я определил это всё, объясню по другому. Ниже будет предоставлен сам stock (таким, каким мы его создали) и способ вызова этого stock. Одинаковым цветом я выделю те аргументы, значения которых передаются от вызова stock к самому stock
stock PlayerMoneyToPlayer(
player1,
player2,
money)
PlayerMoneyToPlayer(
playerid,
giveplayerid,
pmoney);
То есть, аргументы отделяют друг от друга запятыми. Следовательно, при вызове stock, нам нужно расположить аргументы с данными в таком порядке, чтобы нужные данные присвоились нужному аргументу в stock