Автор:Joe Staff Перевод:DizeL[ZR] Арригинал статьи Туториал создан для новичков в скриптинге, которые не могут понять как перевести Скрипт(или GM) на sa-mp 0.3
В этом уроке Автор собирается показать на примере, не навистной для профессиональных скриптеров, Public Enemy Number 1 A.K.A. The Godfather, автор которого Astro (Denver).
ШАГ 1:
Для начала скачаем со страницы загрузок новый сервер Страница загрузок
Выбирай, для какой платформы тебе нужен сервер, автор выбрал для windows:
Открывай это Архиватором RAR, например, можно скачать отсюда www.RarLabs.com
Скопируй все новые файлы в папку сервера.
Убедитесь, что твой ".pwn" файл aka твой скрипт в папке gamemodes.
Теперь заходим в папку "pawno" и открываем "pawno.exe", и убедитесь что у тебя инклуды с 0.3a, старые больше не нужны.
Открывай твой файл ".pwn"
Теперь если ты попытаешься скомплировать тебе выдаст 1 ворнинг
Этот ворнинг из-за того что в sa-mp 0.3 удалили функцию "OnPlayerPrivmsg"
Но Мы самостоятельно "возродим" ее к жизни..
Для начала создадим "forward" к функции Командную строку, лучше помещать "forward" вверху скрипта под линиями "define"
Функция должна иметь параметры:playerid,receiverid,text[]
Должно выглядеть примерно так:
Code
forward OnPlayerPrivmsg(playerid,receiverid,text[]);
"playerid" это тот кто отсылает сообщение(ПМ),"receiverid" это тот кто получает сообщение и "text[]"-это само сообщение, отправленное от "playerid" для "receiverid".
Теперь создадим команду /pm
вот скрипт придлагает Нам Автор:
[pwn]if(!strcmp(cmdtext[1],"pm",true,2))
{
if(!cmdtext[3]||!cmdtext[4])return SendClientMessage(playerid,0xF8DA07FF,"USAGE: /pm [playerid] [text]");
new receiverid = strval(cmdtext[4]);
if(!IsPlayerConnected(receiverid))return SendClientMessage(playerid,0xF8DA07FF," Не правильный ИД игрока!");
new begintext = strfind(cmdtext[4]," ")+1;
if(!strlen(cmdtext[begintext]))return SendClientMessage(playerid,0xF8DA07FF,"USAGE: /pm [playerid] [text]");
OnPlayerPrivmsg(playerid, receiverid, cmdtext[begintext]);
return 1;
}[/pwn]
Сейчас я напишу свой вариант:
[pwn]if(strcmp(cmd,"/pm",true)==0)
{
new tmpid[256],receiverid,mess[256],text,idx;
tmpid=strtok(cmdtext,idx);
if(!strlen(tmpid)) return SendClientMessage(playerid,0xfff, "-- /pm [targetid] [message]");
}
receiverid=strval(tmpid);
mess=strtok(cmdtext,idx);
if(!strlen(mess)) return SendClientMessage(playerid,0xfff, "-- /pm [targetid] [message]");
}
text=strval(mess);
OnPlayerPrivmsg(playerid, receiverid, text);
return 1;
}[/pwn]
Ладно продолжение туториала:Эта команда будет установлена под возвратом "OnPlayerCommandText" с остальной частью команд (предположим, Вы имеете любое) Автор объясняет это построчно.
if(!strcmp(cmdtext[1],"pm",true,2))
Это сравнивает, что игрок ввел, чтобы отослать это сочетается по "/pm"
"cmdtext" - Это какую команду ввел игрок, Я добавил "[1]" поскольку "[ 0 ]" - первый символ, который - конечно правый слэш "/", Это не захочет называть возврат OnPlayerCommandText если это не было первым символом
if(!cmdtext[3]||!cmdtext[4])return SendClientMessage(playerid,0xF8DA07FF,"USAGE: /pm [playerid] [text]");
Если утверждение видит если 3-е и 4-е символы в "cmdtext" существует, это будет пространством немедленно после "/pm " и ID перечисляется, игрок вкладывает,А если не ввел ID игрока то ему вернет сообщение как использовать команду . "/pm 3"
new receiverid = strval(cmdtext[4]);
Эта линия создает стандартную переменную ID'а игрока, которому будет отправлено сообщение "/pm "
if(!IsPlayerConnected(receiverid))return SendClientMessage(playerid,0xF8DA07FF," Нет такого пользователя!");
Это условие проверяет подключен ли игрок, который должен получить сообщение, если такого нету игрока то ему вернет " Нет такого пользователя!".
new begintext = strfind(cmdtext[4]," ")+1+4;
Это дает знать, о том какое сообщение ввел игрок
+1 - там поскольку возвращанное число - прежде, чем символьный strfind будет поискать +4 - там поскольку поиск начинался в символе 4 и нужно компенсировать это отсутствие.
if(!strlen(cmdtext[begintext]))return SendClientMessage(playerid,0xF8DA07FF,"USAGE: /pm [playerid] [text]");
Эта линия говорит о том "Если игрок не ввел текст, то написать как использовать команду".
OnPlayerPrivmsg(playerid, receiverid, cmdtext[begintext]);
Теперь мы посылаем команду что мы сделали команду /pm от playerid до receiverd и сообщение
return 1;
Эта строка нужна для того, чтобы при вводе команды /pm не отвечало игроку "SERVER: unrecognized command"
ШАГ 3:
Удалите возврат "OnPlayerInfoChange"
Может быть его и не будет уже, но все равно введите в поиске CTRL+F "OnPlayerInfoChange" и удалите полностью эту функцию.
ШАГ 4:
Пока что мы создали команду "/pm" но она не определена до конца!
Внутрь public OnPlayerPrivmsg Добавьте код, который приведен ниже, но выше return 1;:
[pwn]new pname[MAX_PLAYER_NAME];
new rname[MAX_PLAYER_NAME];
new tmpstring[256];
GetPlayerName(receiverid,rname,sizeof(rname));
GetPlayerName(playerid,pname,sizeof(pname));
format(tmpstring,sizeof(tmpstring),"PM to %s(%d): %s",rname,receiverid,text);
SendClientMessage(playerid,0xFFCC22FF,tmpstring);
format(tmpstring,sizeof(tmpstring),"PM from %s(%d): %s",pname,playerid,text);
SendClientMessage(receiverid,0xFFFF22FF,tmpstring);
[/pwn]
У Вас должно получится вроде этого:
Теперь все должно быть готово!
Если Ты - все еще имеешь проблемы, это могло быть с вашим сценарием. Помни, 0.3 приходит с этим - собственный вымпел машины так нет необходимости для другого один!
Если что не понятно пишите здесь помогу, чем смогу. И если хотите сделаю Вам собственный скрипт PM гораздо проще.