Текущая версия SA-MP: 0.3.7


IP: 77.220.180.96:7777
  Новые сообщения · Поиск
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: KaTacTpOqpa  
Как создать мод DM для SAMP?
Polcar Сообщение # 1  | 18:34:55
Руководитель проекта SM
Администраторы
Сообщений: 788
Репутация: 323
Для начала, Как создать дефматч
Нет ничего проще. Открываем Pawno и нажимаем New. Вот он, Ваш первый скрипт. Чтобы запустить его, надо сначала его сохранить (большинство людей сохраняют в директорию "/samp/gamemodes/src/", но будет проще (для локального тестирования) сохранить его в "/samp/gamemodes/"). Затем кликните по кнопке с изображением синей стрелочки. Это действие компилирует Ваш файл .pwn в файл .amx, который появится в том же каталоге, однако чтобы запустить его в игре, этот файл должен лежать в "/samp/gamemodes/" (теперь понятно, зачем было сохранять Ваш скрипт в этом каталоге - теперь не придется ничего никуда переносить в ручную, все уже на своих местах после компиляции). Теперь, чтобы опробовать свой новый мод, Вы должны настроить локальный сервер и сменить игровой режим (наберите "changemode " в окне сервера).

Если все прошло удачно, когда подключитесь к своему серверу через клиент sa-mp, в игре Вы окажетесь снаружи казино в Las Venturas. К сожалению Вы не сможете выбрать себе персонажа, так как на данный момент доступен только один, но это можно будет легко исправить в будущем. Кроме того это не очень уж и интересный ДМ – из оружия у Вас только кулаки а вокруг ни души. Но это локальный сервер и по поводу второй проблемы на данный момент ничего нельзя поделать.
Начнём скриптить в Pawno на примерах

Приведу некоторые пояснения.
Здесь // - признак комментария в программе на C/C++.
Комментарии игнорируются компилятором и служат только для разметки и пояснения к исходному коду программы, такой знак // ставится если текст комментария занимает одну строку. Если же ваш комментарий более длинный, то следует воспользоваться другой формой задания комментария - скобками
/* */ . Весь текст между этими скобками можно располагать на многих строках;

//это однострочный комментарий

/*это многострочный
комментарий*/

____________________________________
Давайте откроем Pawno и создами новый проект:
File->New;

После этого вы увидите следующий код:

Code
#include <a_samp>

main()
{
print("\n----------------------------------");
print(" This is a nk GameModeScript");
print("----------------------------------\n");
}

public OnGameModeInit()
{
print("GameModeInit()");
SetGameModeText("nk Script");
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
return 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;
}

public OnGameModeExit()
{
print("GameModeExit()");
return 1;
}

public OnPlayerConnect(playerid)
{
printf("OnPlayerConnect(%d)", playerid);
return 1;
}

public OnPlayerDisconnect(playerid)
{
printf("OnPlayerDisconnect(%d)", playerid);
return 1;
}

public OnPlayerSpawn(playerid)
{
printf("OnPlayerSpawn(%d)", playerid);
return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
printf("OnPlayerDeath(%d, %d, %d)", playerid, killerid, reason);
return 1;
}

public OnVehicleSpawn(vehicleid)
{
printf("OnVehicleSpawn(%d)", vehicleid);
return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
printf("OnVehicleDeath(%d, %d)", vehicleid, killerid);
return 1;
}

public OnPlayerText(playerid)
{
printf("OnPlayerText(%d)", playerid);
return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp(cmdtext, "/mycommand", true)==0)
{
/* Do something here */
return 1;
}
return 0;
}

public OnPlayerInfoChange(playerid)
{
printf("OnPlayerInfoChange(%d)");
return 1;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
printf("OnPlayerEnterVehicle(%d, %d, %d)", playerid, vehicleid, ispassenger);
return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
printf("OnPlayerExitVehicle(%d, %d)", playerid, vehicleid);
return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
printf("OnPlayerStateChange(%d, %d, %d)", playerid, newstate, oldstate);
return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
printf("OnPlayerEnterCheckpoint(%d)", playerid);
return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
printf("OnPlayerLeaveCheckpoint(%d)", playerid);
return 1;
}

___________________________________________
Приведу некоторые расшифровки:

Код в основном строится по принципу:

Code
public Событие()
{

действие

return 1;
}

__________________________________________
В оригинале мы видим:

Code
#include <a_samp>

main()
{
print("\n----------------------------------");
print(" This is a nk GameModeScript");
print("----------------------------------\n");
}

_________________________________________
Поясняю:
Главная функция - это функция, с которой запускается сама программа.
В консольном приложении (а сервер Sa-Mp консольное приложение) её имя
- main()
__________

Code
{
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 ;

Разберём следующий код:

Code
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] оружия:

Code
ID оружия:
0 Ничего
2 Гольф клюшка
3 Night Stick
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 Парашют
38 Миниган

__________________________
Помимо этого в этом же разделе добавляются Машины - 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 статический обьект:

Code
public OnGameModeInit()
{
print("GameModeInit()");
SetGameModeText("My Script");
//скины
AddPlayerClass(52,2784.1335,-1814.6799,11.5077,195.3232,31,100,25,50,10,0);
AddPlayerClass(181,1536.9807,-1478.1770,9.5000,172.4549,28,2000,5,0,22,50);
//автомобили
AddStaticVehicle(445,1584.4043,-1668.0411,6.0816,270.7025,0,1);
AddStaticVehicle(510,874.2382,-1017.4599,31.9577,143.6482,39,39);
AddStaticVehicle(416,1177.4802,-1308.7390,14.0072,269.3701,1,3);
//стат. обьект
AddStaticPickup(342, 2, 2784.1335,-1814.6799,11.5077);
return 1;
}



Polcar Сообщение # 2  | 18:40:24
Руководитель проекта SM
Администраторы
Сообщений: 788
Репутация: 323
_______________________________________________

Code
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);
Здесь указывается положение камеры при выборе класса скина;
________________________________________________________

Code
public OnGameModeExit()
{
print("GameModeExit()");
return 1;
}

_______________
OnGameModeExit - Событие - Если игрок входит из игры;
___________________________________________________________

Code
public OnPlayerConnect(playerid)
{
printf("OnPlayerConnect(%d)", playerid);
return 1;
}

___________________
OnPlayerConnect - Событие - Если игрок подключается к серверу игры
___________________________________________________________

Code
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 - получить текущее месторасположение игрока в трёхмерном пространстве;

Вид:
GetPlayerPos(playerid, &Float:x, &Float:y, &Float:z);

Пример:
GetPlayerPos(playerid, posx, posy, posz);

posx,posy,posz - этотак называемые "переменные".
Компилятор соотнесёт с этими именами определённые адреса в оперативной памяти компьютера, и начиная с этих адресов, выделит участки памяти (в байтах) в соответствии с тем, какого типа обьявлены переменные;
В нашем случае переменные должны иметь тип Float, что значит дословно с плавающей точкой, не целое число.

Чтобы можно было испольовать переменную её нужно обьявить, и дать ей имя.

К примеру, нам нужно создать переменную типа Float с названием "coordinata";
Мы пишем (обьявляем) её после списка операторов #include, пример:

Code
#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 - воспроизвести у игрока определённый звук;

Вид:
PlayerPlaySound(playerid, soundid, Float:x, Float:y, Float:z);

Пример:
PlayerPlaySound(playerid, 1053,100, 100,100);

Где 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, "Добро пожаловать на сервер!");
Получаеся слудующее:

Code
public OnPlayerConnect(playerid)
{
printf("OnPlayerConnect(%d)", playerid);
//Пишем:
SendClientMessage(playerid, 0xFF0000AA, "Добро пожаловать на сервер!");
return 1;
}

При коннекте игроку выдаётся сообщение - <Добро пожаловать на сервер!>
___________________________________
Для старта добавим игроку немного денег для старта, и получим следующий код:

Code
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 очко (фраг)

В итоге выходит:

Code
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;
}



Polcar Сообщение # 3  | 18:41:36
Руководитель проекта SM
Администраторы
Сообщений: 788
Репутация: 323
___________________________________________
По подобному принципу вы можете попробовать к примеру использовать функцию выдачи оружия за убийство, для этого в разделе :

Цитировать
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);//перемещаем только игрока на указанные координаты (без машины=) )

}//конец
return 1;
}
___
*Разберём строку : VehicleID = GetPlayerVehicleID(playerid)

VehicleID - наша переменная

= - это не знак равно, а операция присваивания, мы присваиваем какой либо переменной готовое значение, или итоговое
значения функции (либо логических/математических формул) после знака присваивания, в данном случае:
Переменной 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;

SendClientMessage(playerid, COLOR_MEDIUMBLUE, "Ваши координаты сохранены!"); //выдаём сообщение игроку Ваши координаты сохранены!;

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

SendClientMessage(playerid, COLOR_MEDIUMBLUE, "Ваши координаты восстановлены!"); //выдаём сообщение игроку Ваши координаты восстановлены!

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, подобно так-же, как и переменные:

Цитировать
#include <a_samp.inc> //операторы #include
#include <core> //операторы #include
#include <datagram> //операторы #include
#include <float> //операторы #include

new Float: ax; // Обьявление переменных
new Float: ay; // Обьявление переменных
new Float: az; // Обьявление переменных

#define COLOR_YELLOW 0xFFFF00AA //задание цветов
#define COLOR_WHITE 0xFFFFFFAA //задание цветов
#define COLOR_PURPLE 0x800080AA //задание цветов

Теперь мы к примеру можем написать вместо:

Цитировать
SendClientMessage(playerid,0xFFFF00AA,"Привет!");
Так:

Цитировать
SendClientMessage(playerid,COLOR_YELLOW,"Привет!");
_______________________
Вот списочег уже готовых цветов:

Цитировать
#define COLOR_VIOLET 0x9955DEEE
#define COLOR_LIGHTRED 0xFF99AADD
#define COLOR_SEAGREEN 0x00EEADDF
#define COLOR_GRAYWHITE 0xEEEEFFC4
#define COLOR_LIGHTNEUTRALBLUE 0xabcdef66
#define COLOR_GREENISHGOLD 0xCCFFDD56
#define COLOR_LIGHTBLUEGREEN 0x0FFDD349
#define COLOR_NEUTRALBLUE 0xABCDEF01
#define COLOR_LIGHTCYAN 0xAAFFCC33
#define COLOR_LEMON 0xDDDD2357
#define COLOR_MEDIUMBLUE 0x63AFF00A
#define COLOR_NEUTRAL 0xABCDEF97
#define COLOR_CK 0x00000000
#define COLOR_NEUTRALGREEN 0x81CFAB00
#define COLOR_DARKGREEN 0x12900BBF
#define COLOR_LIGHTGREEN 0x24FF0AB9
#define COLOR_DARKBLUE 0x300FFAAB
#define COLOR_BLUEGREEN 0x46BBAA00
#define COLOR_PINK 0xFF66FFAA
#define COLOR_BLUE 0x0000BBAA
#define COLOR_LIGHTBLUE 0x33CCFFAA
#define COLOR_DARKRED 0x660000AA
#define COLOR_ORANGE 0xFF9900AA
#define COLOR_GREY 0xAFAFAFAA
#define COLOR_GREEN 0x33AA33AA
#define COLOR_RED 0xAA3333AA
#define COLOR_YELLOW 0xFFFF00AA
#define COLOR_WHITE 0xFFFFFFAA
#define COLOR_PURPLE 0x800080AA

Команды создаются в разделе 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.

Оставляйте комментарии к теме, и задавайте вопросы если непонятно




Demetrius Сообщение # 4  | 11:22:01
VIP-пользователи
Сообщений: 1192
Репутация: 158
афигеть surprised

Добавлено (07.06.2010, 11:22)
---------------------------------------------
я даже знаю откуда это)) smile


Sweet >>> Armin >>> Demetrius

SA:MP >> MTA:SA >> IRL
Polcar Сообщение # 5  | 13:02:44
Руководитель проекта SM
Администраторы
Сообщений: 788
Репутация: 323
хех, просто неохото долго самому писать, кстате я тут многое добавил новое, тут много ошибок исправлено и более понятно в некоторых абзацах, читайте и юзайте основы скриптинга!!! smile



Demetrius Сообщение # 6  | 19:27:45
VIP-пользователи
Сообщений: 1192
Репутация: 158
Ага, эти основы самые понятные, если кому то не понятно то скорее это уже с самим человеком что-то wacko .
А тут все понятно, так что каждый поймет.

Добавлено (24.06.2010, 19:27)
---------------------------------------------
Вот одно понять не могу: зачем использовать оператор while, зачем онг ваще нужен wacko


Sweet >>> Armin >>> Demetrius

SA:MP >> MTA:SA >> IRL
Polcar Сообщение # 7  | 06:37:55
Руководитель проекта SM
Администраторы
Сообщений: 788
Репутация: 323
ну для простых модов тдм и дм он ненужен, это оператор цикла какбы, цикилрует чтонибудь, годится для рп модов, но вам проще бы дм и тдм делать, они лёгкие по созданию и интересные.



Demetrius Сообщение # 8  | 12:35:01
VIP-пользователи
Сообщений: 1192
Репутация: 158
а ну тогда ладно

Sweet >>> Armin >>> Demetrius

SA:MP >> MTA:SA >> IRL
ANGEL Сообщение # 9  | 22:23:45
Глав. Модераторы
Сообщений: 503
Репутация: 228
Типа если я это все прочитаю, то смогу сам серваки себе писать?



Можете задавать вопросы в личку на сайте...
Demetrius Сообщение # 10  | 11:25:04
VIP-пользователи
Сообщений: 1192
Репутация: 158
не серваки, а моды на серваки, читай я вот еще до конца не прочитал, щас читать буду)))

Sweet >>> Armin >>> Demetrius

SA:MP >> MTA:SA >> IRL
ANGEL Сообщение # 11  | 11:26:08
Глав. Модераторы
Сообщений: 503
Репутация: 228
Если б, я понимал что нить в этом...[off] Мне паскаля на 1 курсе хватило...



Можете задавать вопросы в личку на сайте...
Demetrius Сообщение # 12  | 11:27:26
VIP-пользователи
Сообщений: 1192
Репутация: 158
[off]ну паскаль гораздо сложнее, а это гораздо проше, и прикольней smile

Sweet >>> Armin >>> Demetrius

SA:MP >> MTA:SA >> IRL
ANGEL Сообщение # 13  | 11:29:03
Глав. Модераторы
Сообщений: 503
Репутация: 228
[off]У меня все под одну гребенку...



Можете задавать вопросы в личку на сайте...
Demetrius Сообщение # 14  | 11:32:34
VIP-пользователи
Сообщений: 1192
Репутация: 158
хех, ладно, тема всеж не про паскаль)

Sweet >>> Armin >>> Demetrius

SA:MP >> MTA:SA >> IRL
ANGEL Сообщение # 15  | 11:33:28
Глав. Модераторы
Сообщений: 503
Репутация: 228
А кто нам мешает ее таковой сделать? Все одно программирование...

Пишите сообщения по теме!!! [NPSS]Armin




Можете задавать вопросы в личку на сайте...
Jin Сообщение # 16  | 19:13:47
Забаненые
Сообщений: 84
Репутация: -23
Полкар а кинь весь код дм*а
nikitka1 Сообщение # 17  | 21:26:01
Пользователи
Сообщений: 10
Репутация: 0
Полкар, а где ты этому всему научился??
BJIADOKC Сообщение # 18  | 19:24:37
Скриптеры
Сообщений: 601
Репутация: 161
Quote (nikitka1)
Полкар, а где ты этому всему научился??

ыы, ну от части он у меня этому научился xD


тут больше не сижу... открыл свой проект
nikitka1 Сообщение # 19  | 00:34:49
Пользователи
Сообщений: 10
Репутация: 0
Я уже что-то понямаю в скриптинге уже мод создал перый по этой инструкции)))))))
VIRUS8308 Сообщение # 20  | 20:56:31
Пользователи
Сообщений: 4
Репутация: 0
public SetPlayerPos (а тут что писать??)
Всё нашёл )))

Добавлено (09.08.2011, 20:56)
---------------------------------------------
GivePlayerWeapon(10, 12, 5000);//даём оружие а для чкго тут ид (10)? если его оставить оружие будет довать игроку под этим идом?


Редактировано VIRUS8308 - Вторник, 09 Авг 2011, 19:28:29
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: