echo Executing Server Config... - строка просто выводит текст "Executing Server Config..." при загрузке сервера lanmode 0 - режим игры по локальный сети, рекомендуется ставить 1 для быстрых сетей, 0 - для медленных maxplayers 32 - максимальное число игроков, которые могут играть на сервере одновременно port 7777 - порт сервера, используется для подключения hostname Unnamed Server - название сервера gamemode0 lvdm 1 - игровые режимы (из папки gamemodes) gamemode1 rivershell 1 gamemode2 area51 1 gamemode4 sftdm 1 weburl www.sa-mp.com - адрес сайта сервера в интернете, отображается в клиенте сампа rcon_password changeme - пароль для админки, "changeme" нужно сменить на свой пароль (придумать)
Команды администратора. Команды можно писать как в окне сервера, так и из игры... Если писать в окне сервера то не нужно писать в начале /rcon А для того чтобы выполнять команды из игры, нужно сначало написать /rcon login PASS (где PASS ваш пароль из server.cfg)
/rcon changemode - сменить игровой мод (например /rcon changemode lvdm) /rcon exec - выполнить cfg файл /rcon cmdlist - показать список всех команд /rcon varlist - показать список всех переменных /rcon exit - завершить работу сервера /rcon kick - кикнуть игрока по id /rcon ban - забанить игрока по id /rcon gmx - перезапуск игрового режима /rcon say - напечатать в чате сообщение от имени admin /rcon echo - напечатать текст в окне сервера /rcon reloadbans - загрузить список банов из файла (samp.ban) /rcon password - изменить пароль сервера /rcon banip [IP] - заблокировать ip адрес /rcon unbanip - снять бан с ip адреса /rcon reloadlog - перезагрузить лог сервера из файла (server_log.txt) /rcon players - отобразить список игроков на сервере (id,nick,score,ping) /rcon gravity - изменить гравитацию в игре (по умолчанию 0.008) /rcon weather [ID] - изменить погоду в игре /rcon loadfs - загрузить фильтрскрипт (из папки filterscripts) /rcon unloadfs - выгрузить фильтрскрипт /rcon reloadfs - перезагрузить фильтрскрипт
Начнём скриптить в Pawno на примерах
Приведу некоторые пояснения. Здесь // - признак комментария в программе на C/C++. Комментарии игнорируются компилятором и служат только для разметки и пояснения к исходному коду программы, такой знак // ставится если текст комментария занимает одну строку. Если же ваш комментарий более длинный, то следует воспользоваться другой формой задания комментария - скобками /* */ . Весь текст между этими скобками можно располагать на многих строках;
//это однострочный комментарий
/*это многострочный комментарий*/
____________________________________ Давайте откроем Pawno и создами новый проект: File->New;
После этого вы увидите следующий код:
Цитировать #include <a_samp>
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 <a_samp>
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 <a_samp> #include - это оператор компилятора (программы, которая преобразует исходный код в готовый для использования файл, в данном случае из pwn в amx) он включает в текст программного модуля файл, который указан в угловых скобках - <a_samp>; Сам же файл содержит описание различных функций, которые нужны нам для создания скрипта; В Pawno Перед списком определённый функций указывается файл, в котором находится описание этох функций. (Правое окошко pawno) Например нам нужна функция gettime, мы видим, что её описание находится в файле time.inc ; следовательно, мы должны включить этот файл в проект строкой #include <gettime> либо #include <gettime.inc>;
Разберём следующий код:
Цитировать 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 <a_samp.inc> #include <core> 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 <a_samp.inc> #include <core> 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<MAX_PLAYERS;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<MAX_PLAYERS;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, если регистр игнорируется и false если требуется четкое сопоставление регистров; length - необязательный параметр максимальной длины проверяемых массивов. функция дает на выходе 0 в случае, если строки совпадают и не 0 если строки несовпадают.
Таким образом давайте добавим простую конструкцию проверки ввода команды "/tp airport" (if else):
Код: public OnPlayerCommandText(playerid, cmdtext[]) { if (strcmp(cmdtext, "/tp airport", true)==0) { //команда для телепортации return 1; //Возвращаем ОК (успешное завершение функции) } return 0; //Возвращаем нуль, чтобы хоть что-то вернуть в случае, если команда не определена... } итак, зная что все команды задаются именно внутри конструкции OnPlayerCommandText, давайте создадим скрипт телепортации по выбору в различные места:
Код: public OnPlayerCommandText(playerid, cmdtext[]) { if (strcmp(cmdtext, "/tp airport", true)==0) { SetPlayerPos(playerid, 1,1,1); //координаты аэропорта return 1; }
if (strcmp(cmdtext, "/tp seaport", true)==0) { SetPlayerPos(playerid, 2, 2, 2); //Координаты морского порта return 1; } return 0; } Естественно x y z ккординаты аэропорта и морского порта не равны 1,1,1 и 2,2,2 - здесь они приведены только для примера. подробнее о SetPlayerPos - MFS рассказывал в предыдущих главах!
после компиляции данного кода, когда игрок введет в чате "/tp airport" - он попадет в точку на карте с координатами 1,1,1, а если он наберет "/tp seaport" - он попадет в точку 2,2,2.
Соберем для вас по сети интернет базу данных потенциальных клиентов для Вашего Бизнеса (название,телефон,факс,e-mail,имена,адреса,рода деятельности, продукция,услуги) Собираем Много! Быстро! Недорого! Узнайте об этом более подробно: Телефон +79137936342 Email: prodawez@mixmail.com ICQ: 6288862 Skype: s....8
Продвижение статьями – самый эффективный и безопасный способ раскрутки сайта. Ссылка в статье окружена тематическим текстом, индексируется одновременно с появлением новой странички и размещается навсегда. Именно для обмена статьями в первую очередь и был создан наш SEOClub.
[b]Становясь участником нашего клуба вы получаете:[/b]
Возможность ежемесячного бесплатного обмена статьями с десятками проверенных сайтов. Даже имея один сайт вы можете размещать статьи на сайтах в Яндекс Каталоге. Обмен в клубе проходит через панель что значительно ускоряет как добавление статей, так и слежение за статистикой по уже размещенным статьям. Хороший способ поднять тИЦ
На заре образования клуба при 55 участниках в сетку сайтов было добавлено более 160 площадок. Число участников постоянно растет, соответсвенно растет колличество площадок для обмена статьями. Средниц тИЦ площадки – 30, максимальный – свыше 400. Собранная база сайтов позволяет за 1-2 АПа получить тИЦ 30-40.
[b]Условия:[/b]
Каждый участник должен предоставить одну или несколько площадок для публикации статей. Принимаются не только сайты в ЯК, но и сайты без тИЦ старше 3 месяцев и имеющие в индексе Яндекса более 100 страниц. Сайты на бесплатных хостингах и блоговых платформах не принимаются. Неактивные участники, не размещающие статьи на своих сайтах, а также злостные нарушители, исключаются посредством всеобщего голосования.
После регистрации вам будет необходимо ознакомится с [b]ПРАВИЛАМИ КЛУБА[/b] и [b]пройти тест[/b]. После этого можно добавлять свои площадки и получить класс, об этом можно узнать в F.A.Q.
[center][url=http://9-seo.ru]Добро пожаловать в наш клуб РЕГИСТРАЦИЯ[/url] 9-seo.ru [/center]
There are different fun baby toys designed for the beach. There are five different versions: Zoo Set , My House, Construction Set, Horse Ranch , and Airport. Whether putting out a fire together or learning a new song-and-dance routine, Smokey and your child will form a fun friendship and be ready for anything together.
[b][i][u][color=red][size=22]Новый кайфовый РП серв свободные лидерки при входе 5кк и 5лвл всем. HostName:.::[Rp]BkankWorld::. Address:178.170.164.75:1111 _________________________________ Все сюда мы всем рады!!!!![/size] [/color][/u][/i][/b]
Приглашаем вас на сайтhttp://sa-mpfun.ucoz.ru/ посвященый игре GTA San Andreas SAMP(0.3c) Заходите и спрашивайте все, не стесняйтесь. Приглашайте друзей и получайте подарки.Добрая Администрация! Мы ждем каждого из вас, и будем ждать с ни терпением!!! Находите друзей, общайтесь, знакомьтесь. У нас реально интересно. Наш сайт развивается с каждым днем!Администрация следит за ним. Удачи увидимся на сайте.