Скачаиваем готовый Серер SAMP с готовым WEB сервером сайтом и системой управления сайтом все одном пакете все зарегестрированые акаунты на сайте автоматически создаютса на игровом сервере системма myql SA-MP 0.1 игровой сервер связан с базой даных сайта. Скачать с deposit
Также для создания сайта скачать лубую из етих готоый PHP Apache Myql HTML Fttp Клиентов эта процедура долгая и нудная придлагаю следуйщее скачать уже готовый сязаный сервер
Из любого прилдложеного
Denver Windows server 2003 - 2008 или (2010 beta несоветую) Savant Cherokee KF Web Server Abyss Web Server Topserver И так далее и т.п... Вопщем арианто очень много различных на ваше у смотрение Далее нужно создать сою систему управления сайтом или же скачать ее.
Можете скачать из списка предложеных мной Drupal WordPress DLE Joomla Соетую этот вариант так как сущестует давно на нее много всего всякого можно найти в рунете но се же смотрим дальше. MODx NetCat Plone И так далее их очень много как и различных сереров.
И так скачали мы се это далее , установили , проверили тестоой страничкой localhost
!
шаг
Так, приступим к созданию мода. Спросите как создать мод? Я скажу: вот так!…………….
2 шаг
Когда вы устанавливали прогу для игры по интернету (ну SA-MP), там в той папке есть ярлык samp_debug.exe заходите в него и жмите первую надпись laungh_debug.Ну когда оно вас загрузит вы будите в пустом городе и будите ходить сиджеем но не пугайтесь это так и должно быть.Спросите вы у меня ‘’А как же я раставлю тачки?’‘, а я вам скажу очень просто,нажимаете F6 ну окно чата и вводите в него эту надпись /vsel, перед вами появится выбор машин,мотоциклов, лодок и так дальше вы выбираете клавишами пробелом и Shift’ом а штоб она появилась нажимайте Enter, потом подъезжайте в нужное место где бы вы хотели чтоб стояла машина и не вылазя из неё прописываете в чате /save так вы сохраняете кординаты машыны они сохраняются в папке с игрой в блокноте под названием savedpositions. А кстати, забыл, машин сохранять можно только 250 не больше.Так, когда вы сохранили координаты машин вы берёте прогу для создания мода и там есть вверху надпись машин 0 и рядом написано редактировать вы нажимаете эту надпись и перед вами стоит типа блокнота вы берёте копируете все что в savedpositions в эту прогу. Нажымаете окей. Всё, машины мы раставили.
3 шаг
Теперь надо раставить игроков чтобы они где-то появлялись, например вы хотите чтоб ваш скин игрока появился на Groove Street (грув стрит), вы бежите на грув стрит и когда прибежите выбираете персонажа F11,F12 когда выбрали скина надо же сохраниться! Просто когда выбрали место и игрока в чате прописываете /save и всё, координаты игроков у нас есть. Теперь также вкидывайте их в прогу для создания мода также вверху этой проги есть надпись игроки 0 и рядом редактировать вы жмёте редактировать и копируете из блокнота все надписи которые начинаются так: AddPlayerClass и нажимаете окей. Выйти у вас должно приблизительно так: AddPlayerClass(230,-2476.6250,1548.1544,55.4189,3.1364,0,0,0,0,0,0); Всё, игроков мы сделали, только теперь нам нужно оружие им дать, ну как это сделать? , очень легко.
4 шаг
Оружие раздать игроку очень просто, вот смотрите для этого вам нужно знать ID оружия (ID это идентификационный номер в игре) и куда его прописывать.
ID оружия: 0 Ничего 2 Гольф клюшка 3 Ментовская дубинка 4 нож 5 Бейсбольная бита 6 Лопата 7 Бильярдный кий 8 Катана 9 Бензопила 10 Фиолетовый фаллоимитатор 11 Белый фаллоимитатор 12 Длинный белый фаллоимитатор 13 Белый фаллоимитатор 2 14 Букет цветов 15 Трость 22 Пистолет 23 Пистолет с глушителем 24 Пустынный орёл (пистолет) 25 Ружьё 26 Обрезы 27 Боевое ружьё 28 Микро узи (Mac 10) 29 MP5 30 Калашников 31 M4 32 Tec9 33 Винтовка 41 Баллончик краски 42 Огнетушитель 44 Очки ночного видения 45 Инфракрасные очки 46 Парашют Все эти цифры что стоят перед названием пушек и есть ID… Чтобы дать оружие людям делаем следущее: В этих координатах вы видите, что в конце присутствуют шесть нулей, это и есть оружие и патроны: AddPlayerClass(230,-2476.6250,1548.1544,55.4189,3.1364,0,0,0,0,0,0); Первый нуль это ID первого оружия, Второй количество патронов к нему, Третий нуль это ID второго оружия, Четвёртый патроны к нему, Пятый нуль ID третьего, Шестой количество патронов к третьему… Тачки, людей расставили ,добавили оружие,теперь осталось совсем чуть-чуть………..
5 шаг
Вам теперь только надо поставить галочки напротив: показать имена игроков и показать игроков на радаре. Так, галочки поставили,теперь надо написать размеры камеры и игрока (ну это нужно для того, чтоб когда вы выбирали игрока он был не близко и не далеко). Так, камеры выставили, теперь пишем название вашего мода и нажимаем снизу кнопку ’’генерировать’’. Всё мод создан.
6 шаг
Теперь нам необходимо скачать архив для сервера.Теперь берёте создаете папку например: ‘’Мой сервак’’ и копируйте все файлы с того архива (который вы скачали для создания серва я имею ввиду).Так, когда мы уже скопировали в нашу папку, надо нам войти туда и посмотреть, там есть папка ’’pawno’’, заходите в неё. Видите там есть ярлык ‘’pawno.exe’‘, откройте его. А кстате, я забыл, когда вы создали мод вам надо его скопировать в папку ’’Мой сервак’’ открываете эту папку и видите там есть папка gamemodes копируйте туда свой мод.Так, продолжаем далее. Вы зашли в ярлык ‘’pawno.exe’’, теперь вы берёте открываете через нее свой мод. Когда открыли свой мод нажмите F5, теперь появился ваш мод только в другом формате. Этот мод лежит в папке gamemodes.Так, мод мы оформили и нам осталось совсем чуть-чуть.
7 шаг
Делаем так, видите в вашей папке есть файл под названием ‘’server.cfg’‘, откройте этот файл через блокнот и отредактируйте его вот так:
echo Executing Server Config lanmode 0 – 0 для игры по интернету, 1 для локальной сети maxplayers 32 – число игроков. port 7777 – порт (лучше оставить как есть) hostname Unnamed Server – ’’Unnamed Server’’ имя сервера, которое будет отображаться в списке серверов gamemode0 lvdm 1 – стартовый мод (не меняйте) weburl www.sa-mp.com – вместо ‘’www.sa-mp.com’’ ваш сайт
rcon_password changeme – ’’changeme’’ пароль от админки на сервер
Так, изменили файл, теперь надо открыть из вашей папки прогу samp-server.exe и пускай она будет открыта. Наконец-то серв создан!
Вы скажете ‘’а как же узнать мой адрес серва?’‘, просто узнайте свой IP и добавляйте к нему :7777 (порт, указанный в server.cfg) Например: 12.123.12.123:7777 Так, свой адрес вы знайте, только осталось записать его в SA-MP и шпилить с друзьями! )))) ВНИМАНИЕ!!!!!!!!!!!! Если вы хотите войти в свой серв, вы должны сначала открыть из папки ’’Мой сервак’’ прогу samp-server.exe , а потом с открытой прогой входить на сервак, поняли?
Смотрим дальше для тех кто понял написаное выше для тех кто не понял основы можно не читать....
Начнём скриптить в Pawno на примерах
Приведу некоторые пояснения. Здесь // - признак комментария в программе на C/C++. Комментарии игнорируются компилятором и служат только для разметки и пояснения к исходному коду программы, такой знак // ставится если текст комментария занимает одну строку. Если же ваш комментарий более длинный, то следует воспользоваться другой формой задания комментария - скобками /* */ . Весь текст между этими скобками можно располагать на многих строках;
//это однострочный комментарий
/*это многострочный комментарий*/
____________________________________ Давайте откроем Pawno и создами новый проект: File->New;
После этого вы увидите следующий код:
Цитировать #include
main() { print("\n----------------------------------"); print(" This is a nk GameModeScript"); print("----------------------------------\n"); }
public OnPlayerEnterCheckpoint(playerid) { printf("OnPlayerEnterCheckpoint(%d)", playerid); return 1; }
public OnPlayerLeaveCheckpoint(playerid) { printf("OnPlayerLeaveCheckpoint(%d)", playerid); return 1; }
___________________________________________ Приведу некоторые расшифровки:
Код в основном строится по принципу: public Событие() {
действие
return 1; }
__________________________________________ В оригинале мы видим:
Цитировать #include
main() { print("\n----------------------------------"); print(" This is a nk GameModeScript"); print("----------------------------------\n"); }
_________________________________________ Поясняю: Главная функция - это функция, с которой запускается сама программа. В консольном приложении (а сервер Sa-Mp консольное приложение) её имя - main() __________
Цитировать { print("\n----------------------------------"); print(" This is a nk GameModeScript"); /*здесь вы можете написать название вашего сервера вместо " This is a nk GameModeScript"*/ print("----------------------------------\n"); } _________ #include #include - это оператор компилятора (программы, которая преобразует исходный код в готовый для использования файл, в данном случае из pwn в amx) он включает в текст программного модуля файл, который указан в угловых скобках - ; Сам же файл содержит описание различных функций, которые нужны нам для создания скрипта; В Pawno Перед списком определённый функций указывается файл, в котором находится описание этох функций. (Правое окошко pawno) Например нам нужна функция gettime, мы видим, что её описание находится в файле time.inc ; следовательно, мы должны включить этот файл в проект строкой #include либо #include ;
Разберём следующий код:
Цитировать public OnGameModeInit() { print("GameModeInit()"); SetGameModeText("Blnk Script"); AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0); return 1; } ___________________________________ OnGameModeInit() - Событие: При старте игры делать : print("GameModeInit()"); - эта функция выводит инфу об игре; SetGameModeText("nk Script"); - это выводит информацию о моде игры - его вы называете сами, в данном случае - nk Script. ____ AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0); Добавить скин в игру где (по порядку):
0 -номер (ID) скина; 1958.3783 - расположение спавна по в 3х мерной плоскости по координате X; 1343.1572 - расположение по координате Y; 15.3746 - расположение по координате Z; 269.1425 - угол поворота обьекта (всего соответственно 365 градусов) 0, 0, 0, 0, 0, 0 - оружие и патроны где: 0 - ID оружия №1 0 - количество патронов к оружию №1 0 - ID оружия №2 0 - количество патронов к оружию №2 0 - ID оружия №3 0 - количество патронов к оружию №3 ___________ В общем схематичном виде это выглядит так: AddPlayerClass(Player ID, X, Y, Z,Rotation, ID weapon1, Patrons to the weapon 1, ID weapon2, Patrons to the weapon 2, ID weapon 3, Patrons to the weapon 3); ___________________________ Типы и номера [ID] оружия:
__________________________ Помимо этого в этом же разделе добавляются Машины - AddStaticVehicle, и статические обьекты AddStaticPickup; Вид строки для добавления машины: AddStaticVehicle(445,2650.7654,-1998.9688,13.1893,270.4203,11,11); Где: AddStaticVehicle(ID машины,координата X,Y,Z,Rotation,цвет машины 1,цвет машины 2); _________________________ AddStaticPickup(342, 2, 2498.0862,-1683.8715,13.3885); Где: 342 - ID обьекта, в данном случае - граната; AddStaticPickup(ID model,type/тип,X,Y,Z); _________________________ Создадим строки, содержащие 2 скина, 3 машины, и 1 статический обьект:
Цитировать public OnPlayerRequestClass(playerid, classid) { printf("OnPlayerRequestClass(%d, %d)", playerid, classid); SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746); SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746); SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746); return 1; } ________________ OnPlayerRequestClass Событие - если игрок выбирает класс скина;
Действия: SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746); Здесь указывается место, где находится (пролистываются) классы скинов; *playerid ВЕЗДЕ обозначает номер [ID] игрока в игре , это может быть любой номер - 3,45,80,99..., если же мы хотим задействовать данного, действующего (активного) игрока, вместо номера пишется слово playerid ____________________________ SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746); SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746); Здесь указывается положение камеры при выборе класса скина; ________________________________________________________
Цитировать public OnGameModeExit() { print("GameModeExit()"); return 1; } _______________ OnGameModeExit - Событие - Если игрок входит из игры; ___________________________________________________________
Цитировать public OnPlayerConnect(playerid) { printf("OnPlayerConnect(%d)", playerid); return 1; } ___________________ OnPlayerConnect - Событие - Если игрок подключается к серверу игры ___________________________________________________________
Цитировать public OnPlayerDisconnect(playerid) { printf("OnPlayerDisconnect(%d)", playerid); return 1; } ___________________ OnPlayerDisconnect - Событие - Если игрок разьединился ___________________________________________________________
А также: OnPlayerSpawn - если игрок находится (появился) на респауне; OnPlayerDeath - если игрок убил другого игрока; OnVehicleSpawn - автомобиль на спавне; OnVehicleDeath - если испортилась машина; OnPlayerEnterCheckpoint - вход на чекпоинт; OnPlayerLeaveCheckpoint - выход с чекпоинта; и.др... __________________________________________________________________
Рассмотрим некоторые функции.
SendClientMessage - отправить сообщение в чате игроку;
Вид: SendClientMessage(playerid, color, const message[]); SendClientMessage(ID игрока, цвет сообщения,"сообщение");
Пример: SendClientMessage(playerid, 0xAA3333AA, "Здавайся, террорист!"); _______________________________________________________ SendClientMessageToAll - отправить сообщение всем игрокам в чате;
Вид: SendClientMessageToAll(color, const message[]); _______________________________________________________ GameTextForPlayer - отправить сообщение на экран (только латинские быквы!)
Вид: GameTextForPlayer(playerid,const string[],time,style); GameTextForPlayer(ID игрока,"сообщение",время показа сообщения (мс),стиль сообщения);
Пример: GameTextForPlayer(playerid, "W E L C O M E !", 4000, 3); ______________________________________________________ GameTextForAll - отправить сообщение на экран всем игрокам
Вид: GameTextForAll(const string[],time,style); ______________________________________________________ Kick(playerid);//кикнуть игрока с сервера, без комментариев Ban(playerid);//забанить игрока на сервере, без комментариев ______________________________________________________ *Далее могут попадаться приставки Get и Set; Get - получить (какое-то значение), Set - установить данное значение; ______________________________________________________ SpawnPlayer - переместить игрока на спавн (приравнивается к функции /kill)
Вид: SpawnPlayer(playerid); ______________________________________________________ SetPlayerSkin - установить данному игроку данный скин;
Вид: SetPlayerSkin(playerid, skinid); ______________________________________________________ SetPlayerScore - установить данному игроку заданное количество очков (фрагов)
Вид: SetPlayerScore(playerid,score); _____________________________________________________ GetPlayerPos - получить текущее месторасположение игрока в трёхмерном пространстве;
posx,posy,posz - этотак называемые "переменные". Компилятор соотнесёт с этими именами определённые адреса в оперативной памяти компьютера, и начиная с этих адресов, выделит участки памяти (в байтах) в соответствии с тем, какого типа обьявлены переменные; В нашем случае переменные должны иметь тип Float, что значит дословно с плавающей точкой, не целое число.
Чтобы можно было испольовать переменную её нужно обьявить, и дать ей имя.
К примеру, нам нужно создать переменную типа Float с названием "coordinata"; Мы пишем (обьявляем) её после списка операторов #include, пример:
Цитировать #include #include new Float: coordinata;
_____ Где new Float: coordinata; - обьявление пременной (дословно: Новая_переменная С_плавающей_точкой: <с названием> coordinata; ___________________________________________________ SetPlayerPos - переместить данного игрока на данную позицию;
Вид: SetPlayerPos(playerid, Float:x, Float:y, Float:z); ___________________________________________________ GetPlayerHealth - Получить (прочесть) данные о количестве жизней в переменную
Вид: GetPlayerHealth(playerid, &Float:health);
Где &Float:health - переменная, пример:
GetPlayerHealth(playerid, health); __________________________________________________ SetPlayerHealth - Дать данному игроку заданное количество жизней;
Вид: SetPlayerHealth(playerid, Float:health);
Пример: SetPlayerHealth(playerid, 2000); :446: _________________________________________________ SetPlayerColor - установить заданный цвет данному игроку;
Вид: SetPlayerColor(playerid,color);
Пример: SetPlayerColor(playerid,0xDDDD2357); ________________________________________________ SetPlayerInterior - переключить игрока на заданный интерьер;
Вид: SetPlayerInterior(playerid,interiorid);
Пример: SetPlayerInterior(playerid,6); ________________________________________________ PlayerPlaySound - воспроизвести у игрока определённый звук;
Где X,Y,Z - координаты "Происхождения" звука, 1053 - Id звука; ________________________________________________ GivePlayerMoney - дать игроку определённое количество денег;
Вид: GivePlayerMoney(playerid,money);
В pawno нет функции "Забрать деньги", для того чтобы отнять деньги нужно просто написать число в отрицательном виде;
-Школьная математика: сто плюс минус пятьдесят равно пятьдесят :1_011-2: ________________________________________________ ResetPlayerMoney - отнять у игрока (сбросить) все деньги;
Вид: ResetPlayerMoney(playerid); ________________________________________________ GivePlayerWeapon - дать игроку оружие;
Вид: GivePlayerWeapon(playerid, weaponid, ammo);
Расшифровка: GivePlayerWeapon(ID игрока,ID оружия,Количество патронов к даваемому оружию);
Пример: GivePlayerWeapon(10, 12, 5000); -Дать игроку под номером 10, оружие под номером 12, с количеством патронов равным 5000'ам; ________________________________________________
Итак, рабочая область редактора скриптов pawno имеет 2 окна, в левом непосредственно сам программный код, в правом доступные для использования функции; ------------------------------------------------ *Для быстрой вставки функции в основное окно исходного кода, нужно нажать быстро 2 раза на нужную функцию при этом предварительно установив курсор мышки в нужное место, если выделить какую то функцию, то в строке состояния высвечиваются аргументы, необходимые для использования данной функции. ------------------------------------------------ Разберём на примерах внедрение различных функций; ___________ Например, зделаем так, чтобы при коннекте игрока ему выдавалось приветственное сообщение, для этого ищем строку (Создайте новый файл):
Цитировать public OnPlayerConnect(playerid) Пишем: SendClientMessage(playerid, 0xFF0000AA, "Добро пожаловать на сервер!"); Получаеся слудующее:
Цитировать public OnPlayerConnect(playerid) { printf("OnPlayerConnect(%d)", playerid); //Пишем: SendClientMessage(playerid, 0xFF0000AA, "Добро пожаловать на сервер!"); return 1; } При коннекте игроку выдаётся сообщение - <Добро пожаловать на сервер!> ___________________________________ Для старта добавим игроку немного денег для старта, и получим следующий код:
Цитировать public OnPlayerConnect(playerid) { printf("OnPlayerConnect(%d)", playerid); SendClientMessage(playerid, 0xFF0000AA, "Добро пожаловать на сервер!"); GivePlayerMoney(playerid, 5000);//даём 5000 $ игроку сразу после его коннекта return 1; } При коннекте игроку выдаётся сообщение - "Добро пожаловать на сервер!", а также выдаётся 5000$; ___________________________________ Зделаем награду за убийство игрока: Ищем строку:
Цитировать public OnPlayerDeath(playerid, killerid, reason) Пишем:
GivePlayerMoney(killerid, 2200);//добавить игроку 2200$ за убийство SetPlayerScore(killerid, GetPlayerScore(killerid) + 1);//добавить 1 очко (фраг)
В итоге выходит:
Цитировать public OnPlayerDeath(playerid, killerid, reason) { GivePlayerMoney(killerid, 2200);//добавить игроку 2200$ за убийство SetPlayerScore(killerid, GetPlayerScore(killerid) + 1);//добавить 1 очко (фраг) printf("OnPlayerDeath(%d, %d, %d)", playerid, killerid, reason); return 1; } ___________________________________________ По подобному принципу вы можете попробовать к примеру использовать функцию выдачи оружия за убийство, для этого в разделе :
Цитировать public OnPlayerDeath(playerid, killerid, reason) Воспользуемся функцией GivePlayerWeapon;
Получаем:
Цитировать public OnPlayerDeath(playerid, killerid, reason) { GivePlayerMoney(killerid, 2200);//добавить игроку 2200$ за убийство SetPlayerScore(killerid, GetPlayerScore(killerid) + 1);//добавить 1 очко (фраг) GivePlayerWeapon(10, 12, 5000);//даём оружие printf("OnPlayerDeath(%d, %d, %d)", playerid, killerid, reason); return 1; } Теперь сохраните этот скрипт, дальше мы продолжим с ним работать; _______________________________________________ Думаю, что на основе этих примеров, и предыдущим статьям вы поняли основной смысл связки События и Действия. :396: :404: В следующей главе рассмотрим как создавать команды а навязывать на них какие либодействия. :sm_razz: :14:
Напишим скрипт телепорта игрока; Для этого нам нужно будет использовать функцию SetPlayerPos; Пусть команда будет называться /tp (Цифры условные);
Пишем:
Цитировать if (strcmp(cmdtext, "/tp", true)==0)//Если игрок наберёт /tp, то {
SetPlayerPos(playerid, 100, 200,300);//переместится по координатам: x-100;y-200;z-300;
return 1; } Вот вам и есть простой телепорт :pardon: ; Необходимые координаты вы указываете сами; __ Теперь давайте проверим, будет ли работать скрипт; В павно есть синяя кнопочка, похожая на Play; Жмём её, и если Pawno ещё небыла настроена, то выведется на экран окошко с 3мя полями для заполнения.
Поле Copy Script to directory заполняем следующим обрзом: Задаём путь к папке сервера \gamemodes\, у меня например: D:\SA-MP\gamemodes\ Так и пишется; ------------------- Поле Execute this file: пишем my.amx ------------------ Поле With these parameters заполняем этим: pawncc.exe _ Жмём Save; Если всё правильно, то произведётся компилляция скрипта в папку gamemodes\ ; В файле server.cfg делаем необходимые настройки, и запускаем сервер. ____________________________________________________________ Проверили? Работает? Ура!!! :sty00: Но, попробуйте сесть в машину и зделать телепорт, игрок перемещается, а машина - Нет!:sm_cry: :396: =================== Для того, чтобы машина перемещалась, её нужно перемещать вместе с игроком.
Приведу в пример следующий код:
Цитировать if(strcmp(cmdtext, "/tp",true) == 0) { //если игрок наберёт /tp, то
if(IsPlayerInAnyVehicle(playerid)) { //(начало условия) Условие: если игрок сидит в автомобиле,то
new VehicleID; //создаём переменную с названием VehicleID;
VehicleID = GetPlayerVehicleID(playerid); //узнаём ID машины, в которой сидит игрок и записываем его (ID) в переменную VehicleID;
SetVehiclePos(VehicleID,1358.3634,-1279.1521,13.3285);//перемещаем данный автомобиль в назначенную точку (вместе с игроком естесстенно); } else { //ИНАЧЕ (а иначе может быть только - если игрок не сидит в машине)
SetPlayerPos(playerid,1358.3634,-1279.1521,13.3285);//перемещаем только игрока на указанные координаты (без машины=) )
= - это не знак равно, а операция присваивания, мы присваиваем какой либо переменной готовое значение, или итоговое значения функции (либо логических/математических формул) после знака присваивания, в данном случае: Переменной VehicleID, присваивается то, что стоит после операции присваивания, а именно значение функции GetPlayerVehicleID(playerid), которая возвращает значение ID (номер) автомобиля в игре. Следователно, в переменную VehicleID, записывается значение, расчитанное функцией GetPlayerVehicleID(playerid), а именно Id марки автомобиля, в котором сидит игрок. __________________________ Итак переменную можно создать 1разовую, (как в предыдущем примере) и использовать её только в пределах данного условия, она какраз в этом условии "Внутри его" и была создана, либо как я уже говорил в предыдущих статьях, обьявляем её после списка операторов #include, пример:
Цитировать #include #include new Float: VehicleID; Такую переменную можно использовать в совокупности с любыми командами; __________________________ Теперь напишем код, который даст игроку возможность сохранять и восстанавливать своё текущее месторасположение;
Для этого нужно обьявить 4 "общих" переменных, после операторов #include, назавём их к примеру: ax , ay , az; 4 ую переменную можно создать уже в теле условия, и будет её название VehicleID; __ Создаём переменные:
Цитировать new Float: ax; new Float: ay; new Float: az; __ Пишем следующий код:
Цитировать //начало команды /savepos;
if (strcmp(cmdtext, "/savepos", false)==0) //если игрок наберёт /savepos,то {
GetPlayerPos(playerid,ax,ay,az);//Узнаём координаты игрока, и записываем эти данные в переменные ax,ay,az;
PlayerPlaySound(playerid,1053,ax,ay,az); //проигрываем мелодию под номером 1053, по координатам, записанным в переменных ax,ay,az;
return 1; }
//конец команды /savepos;
//начало команды /loadpos;
if(strcmp(cmdtext, "/loadpos", false) == 0) { //если игрок наберёт /loadpos, то
if(IsPlayerInAnyVehicle(playerid)) { //Условие: если игрок сидит в автомобиле,то
new VehicleID; //создаём переменную VehicleID;
VehicleID = GetPlayerVehicleID(playerid); //узнаём ID машины, в которой сидит игрок;
SetVehiclePos(VehicleID,ax,ay,az); //перемещаем данный автомобиль в назначенные (вместе с игроком естесстенно) на координаты, сохранённые в переменных ax,ay,az;
} else //ИНАЧЕ {
SetPlayerPos(playerid,ax,ay,az);//перемещаем только игрока на координаты, сохранённые в переменных ax,ay,az
PlayerPlaySound(playerid,1053,ax,ay,az); //проигрываем мелодию под номером 1053, по координатам, записанным в переменных ax,ay,az;
} return 1; }
//конец команды /loadpos
__________________________________________________ Условия создаются по принципу: начало
Цитировать if () { } else { }
конец ____________ if - если (условие) выполняется то { делается то, что заключено этими { } скобками } else - иначе, если условие первое не выполняется { делается то, что заключено этими { } скобками }
Кстати, чтобы можно было не писать цвета двоичном виде, их для удобства можно сопоставить двоичному виду; Пишется это так:
Цитировать #define COLOR_VIOLET 0x9955DEEE Теперь вместо 0x9955DEEE можно употреб*ять COLOR_VIOLET; Обьявляются цвета после списка операторов #include, подобно так-же, как и переменные:
Команды создаются в разделе public OnPlayerCommandText(playerid, cmdtext[]);
Полностью это выглядит так:
Цитировать public OnPlayerCommandText(playerid, cmdtext[]) { if (strcmp(cmdtext, "/mycommand", true)==0) { /* Do something here */ return 1; } return 0; } Это делается так:
Цитировать public OnPlayerCommandText(playerid, cmdtext[])// функция - ввод игроком текстовых команд { //--------------начало раздела обьявления и присваивания действий командам
if (strcmp(cmdtext, "/mycommand", true)==0)//пример команды { /* Do something here - этот комментарий можно удалить */ return 1; }
//-------------завершение return 0; }
__________________ И строится по принципу:
Цитировать if (strcmp(cmdtext, "/mycommand", true)==0)//если игрок ввёл команду /mycommand, то { //выпольняется действие, описанное здесь;
return 1; } ______________________________________________________ Например, зделаем команду, по которой игрок может восстанавливать свои жизни: :pleasantry:
Цитировать if (strcmp(cmdtext, "/hp", true)==0)//если игрок наберёт /hp, то { SetPlayerHealth(playerid,100);// Выдаётся 100 жизней return 1; } Всё очень просто; На основе выше изложенного материала, и ранее написанных статей можно создать много интересных команд; Можно добавить текст о том, что игрок получил жизни:
Цитировать if (strcmp(cmdtext, "/hp", true)==0)//если игрок наберёт /hp, то { SetPlayerHealth(playerid,100);// Выдаётся 100 жизней SendClientMessage(playerid, 0xAA3333AA, "Вы получили 100 жизней!");//Сообщение о том, что игрок получил 100 жизней; return 1; } ________________________________________________________ Дадим игроку по команде /weapon оружие:
Цитировать if (strcmp(cmdtext, "/weapon", true)==0)//если игрок набрал /weapon, то {
GivePlayerWeapon(playerid, 17, 300);//выдаётся оружие текущему игроку, ID оружия 17, с 300стами патронами; return 1; } ___ Также можете написать с помощью команды SendClientMessage о том, что игрок получил оружие; Например: SendClientMessage(playerid, 0xAA3333AA, "Вы получили оружие!"); __ Зделаем команду, если которую игрок наберёт, поменяется цвет игрока;
Цитировать if (strcmp(cmdtext, "/red", true)==0)//если игрок набирает команду /red,то { SetPlayerColor(playerid,0xAA3333AA);//цвет устанавливается активному игроку - 0xAA3333AA (в двоичном виде) - красный return 1; } ____________________________________________________________________ Перещение игрока на спавн:
Цитировать if (strcmp(cmdtext, "/spawn", true)==0)//если игрок набирает команду /spawn то... { SpawnPlayer(playerid);//перемещается на спавн; return 1; } ________________________________________________________________
Вот код закрытия/открытия дверей у автомобиля, ничего тут нового или сложного не вижу, поэтому без подробных объяснений
Цитировать //начало /lock команды if (strcmp(cmdtext, "/lock", false)==0) //если игрок набирёи /lock, то { if(IsPlayerInAnyVehicle(playerid)) //условие- если игрок в автомобиле { new State=GetPlayerState(playerid); if(State!=PLAYER_STATE_DRIVER) { SendClientMessage(playerid,0xFFFF00AA,"Только водитель может закрыть двери!"); //сообщение return 1; } new i; for(i=0;i { if(i != playerid) { SetVehicleParamsForPlayer(GetPlayerVehicleID(playerid),i, 0, 1); } } SendClientMessage(playerid, 0xFFFF00AA, "Двери закрыты"); //сообщение new Float:pX, Float:pY, Float:pZ; //создание переменных GetPlayerPos(playerid,pX,pY,pZ); //определение положения игрока PlayerPlaySound(playerid,1056,pX,pY,pZ); //играем музыку } else //иначе { SendClientMessage(playerid, 0xFFFF00AA, "Сначало залезь в машину, потом закрывай двери, лол=)"); //сообщение } return 1; } //конец /lock команды
//начало /unlock команды if (strcmp(cmdtext, "/unlock", true)==0)//если игрок набирёи/unlock, то { if(IsPlayerInAnyVehicle(playerid)) //условие- если игрок в автомобиле { new State=GetPlayerState(playerid); if(State!=PLAYER_STATE_DRIVER) { SendClientMessage(playerid,0xFFFF00AA,"Только водитель может открыть двери!"); //сообщение return 1; } new i; for(i=0;i { SetVehicleParamsForPlayer(GetPlayerVehicleID(playerid),i, 0, 0); } SendClientMessage(playerid, 0xFFFF00AA, "Машина открыта!"); //сообщение new Float:pX, Float:pY, Float:pZ; //переменные GetPlayerPos(playerid,pX,pY,pZ); //положение игрока PlayerPlaySound(playerid,1057,pX,pY,pZ); //музыка } else //иначе { SendClientMessage(playerid, 0xFFFF00AA, "Сначало залезь в тачку, чтобы открыть двери=)"); //сообщение } return 1; } //конец /unlock команды
Рассмотрим оператор - "while";
Оператор While;
Определение: Оператор while, это оператор цикла, подобные операторы цикла "охватывают" участок расчёта и "прокручивают" его необходимое количество раз;
Структура: Тело этого оператора ограничивается парой фигурных скобок: начинается с открывающейся фигурной скобки, а заканчивается закрывающей фигурной скобкой. В это то тело и помещается прокручиваемый участок, а сколько раз повторять, определяется условием цикла.
Суть: Есть определённый параметр (переменная), а потом, изменяя этот параметр, заставляют участок расчёта снова выполняться до тех пор, пока параметр не примет определённого значения, после которого повторение расчётов прекращают;
Вид оператора:
Цитировать while (условие окончания цикла) { //тело }
Например напишем следующий код:
Переменная "а" имеет установленное значение 0.
Цитировать while (a<2) //пока переменная "а" меньше 2, делай: { a = a+1; //к переменной "а" прибавляем 1 и возвращаем переменной "а" расчитанное значение } Условный цикл будет продолжаться до тех пор. пока переменная а не примет значение 2, а продолжаться (количество повторений) он будет ровно 2 цикла, именно после этих 2х циклов переменная примет итоговое значение для прекращения повторений.
добавка от Diablus: Одна из распространеннейших ошибок при использовании while - ввождение бесконечного цикла... эта ошибка присуща многим, как начинающим так и профессиональным программистам. Чтобы избежать ввода бесконечных циклов проверяйте: Будут ли происходить какие либо изменения с переменной условия прекращения цикла в теле цикла. Есди будут, то могут ли они привести к тому результату, при котором цикл прекращается. В приведенном примере, если бы был использован не оператор инкремента (a=a+1; a=++) а оператор декремента (a=a-1; a=--) то цикл бы стал бесконечным, так как условие прекращения цикла (a>=2) не наступит никогда... Будьте пожалуйста внимательны! добавка от De[M]oN: Пока идёт обработка цикла while жизнь в игре останавливается, это так же отностится и к обработке других функций, поэтому чтобы небыло лагов (как были у меня раньше) старайтесь сделать код оптимизированным.
Еще раз об OnPlayerCommandText()!
Рассмотрим всю эту фунцию более детально:
В общем виде функция выглядит так:
Код: public OnPlayerCommandText(playerid, cmdtext[]) { /*--------какой то исполняемый код, в случае, если---------------- -----------в чате набрана команда с префиксом "/"----------------*/ } Функция принимает два параметра: playerid - в данном случае самообъявленная переменная указывающая идентификационный номер(ID) игрока, вызвавшего функцию; cmdtext[] - строковый массив, в который заносится та самая команда, которую игрок набрал, вызвав эту функцию.
Однако, Вам необходимо знать, что данная функция является обработчиком событий и может быть вызвана в рамках одного скрипта всего один раз!!! Будьте внимательны!
Дабы лучше сопоставить что именно игрок набрал, и каким образом обработать эту команду, используем оператор strcmp, который сравнивает все ключи массива с определенным параметром. В общем виде оператор выглядит так:
Код: strcmp(const string1[], const string2[], bool:ignorecase=false, length=cellmax); где const string1[] и const string[2] - строковые массивы, сравниваемые между собой; bool:ignorecase - булевая команда игнорирования регистра букв (большие или маленькие) - принимает параметр true, есл