Главная Мой профиль Регистрация Выход Вход
Bad gamers team!
Четверг
18.4.2024
15:29
| RSSГлавная
Меню сайта
Категории каталога
Игровые статьи [9]
Мини-чат
Наш опрос
Оцените мой сайт
Всего ответов: 780
Главная » Статьи » Игровые статьи

Скриптинг в САМПЕ
Рассмотрим конфигурационный файл server.cfg 

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


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

Код в основном строится по принципу: 
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] оружия: 

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 статический обьект: 

Цитировать 
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; 


_______________________________________________ 

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

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

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

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

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

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

}//конец 
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.

Категория: Игровые статьи | Добавил: nal (12.02.2009)
Просмотров: 10514 | Комментарии: 24 | Рейтинг: 4.0/5 |
Всего комментариев: 241 2 3 »
24 BeneSurorce  
0
Соберем для вас по сети интернет базу данных
потенциальных клиентов для Вашего Бизнеса
(название,телефон,факс,e-mail,имена,адреса,рода деятельности,
продукция,услуги)
Собираем Много! Быстро! Недорого!
Узнайте об этом более подробно:
Телефон +79137936342
Email: prodawez@mixmail.com
ICQ: 6288862
Skype: s....8

23 Fenix  
0
TOP Мониторинг серверов кс 1.6
top-cs.com/konkurs.php

TOP Мониторинг серверов кс 1.6
top-cs.com/konkurs.php

TOP Мониторинг серверов кс 1.6
top-cs.com/konkurs.php

TOP Мониторинг серверов кс 1.6
top-cs.com/konkurs.php

TOP Мониторинг серверов кс 1.6
top-cs.com/konkurs.php

TOP Мониторинг серверов кс 1.6
top-cs.com/konkurs.php

TOP Мониторинг серверов кс 1.6
top-cs.com/konkurs.php

TOP Мониторинг серверов кс 1.6
top-cs.com/konkurs.php

TOP Мониторинг серверов кс 1.6
top-cs.com/konkurs.php

TOP Мониторинг серверов кс 1.6
top-cs.com/konkurs.php

TOP Мониторинг серверов кс 1.6
top-cs.com/konkurs.php

22 SCERBURBUSALKUi  
0
Продвижение статьями – самый эффективный и безопасный способ раскрутки сайта. Ссылка в статье окружена тематическим текстом, индексируется одновременно с появлением новой странички и размещается навсегда. Именно для обмена статьями в первую очередь и был создан наш 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]

21 MaryTenderLOS  
0
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.

20 sed  
0
HostName: |RUS| Vida Virtual |RP|
Address: 77.220.180.119:7777
Players: 43 / 90
Ping: 36
Mode: VV-|RP|v.3.5
Map: Россия
HostName: |RUS| Vida Virtual |RP|
Address: 77.220.180.119:7777
Players: 43 / 90
Ping: 36
Mode: VV-|RP|v.3.5
Map: Россия
HostName: |RUS| Vida Virtual |RP|
Address: 77.220.180.119:7777
Players: 43 / 90
Ping: 36
Mode: VV-|RP|v.3.5
Map: Россия
HostName: |RUS| Vida Virtual |RP|
Address: 77.220.180.119:7777
Players: 43 / 90
Ping: 36
Mode: VV-|RP|v.3.5
Map: Россия
HostName: |RUS| Vida Virtual |RP|
Address: 77.220.180.119:7777
Players: 43 / 90
Ping: 36
Mode: VV-|RP|v.3.5
Map: Россия
HostName: |RUS| Vida Virtual |RP|
Address: 77.220.180.119:7777
Players: 43 / 90
Ping: 36
Mode: VV-|RP|v.3.5
Map: Россия
HostName: |RUS| Vida Virtual |RP|
Address: 77.220.180.119:7777
Players: 43 / 90
Ping: 36
Mode: VV-|RP|v.3.5
Map: Россия
HostName: |RUS| Vida Virtual |RP|
Address: 77.220.180.119:7777
Players: 43 / 90
Ping: 36
Mode: VV-|RP|v.3.5
Map: Россия
HostName: |RUS| Vida Virtual |RP|
Address: 77.220.180.119:7777
Players: 43 / 90
Ping: 36
Mode: VV-|RP|v.3.5
Map: Россия
HostName: |RUS| Vida Virtual |RP|
Address: 77.220.180.119:7777
Players: 43 / 90
Ping: 36
Mode: VV-|RP|v.3.5
Map: Россия
HostName: |RUS| Vida Virtual |RP|
Address: 77.220.180.119:7777
Players: 43 / 90
Ping: 36
Mode: VV-|RP|v.3.5
Map: Россия

19 bloomy  
0
хочу найти учитела скриптинга в самп
а то на сайтах нету не чего стоющего
скайп as.gupi
icq 609613297
RC SmeTana

18 Человек  
0
Я ищю скриптера для сервера за админку пишите в скайп нужно очень очень срочно скайп slava060695

17 Rustam  
0
HostName: ..::[Rp]BkankWorld::..
Address: 178.170.164.75:1111
заходите есть свободные лидерки при входе 5 лвл 2 кк

16 Fatash  
0
[b][i][u][color=red][size=22]Новый кайфовый РП серв свободные лидерки при входе 5кк и 5лвл всем.
HostName:.::[Rp]BkankWorld::.
Address:178.170.164.75:1111
_________________________________
Все сюда мы всем рады!!!!![/size]
[/color][/u][/i][/b]

15 Gleb  
0
Приглашаем вас на сайтhttp://sa-mpfun.ucoz.ru/ посвященый игре GTA San Andreas SAMP(0.3c)
Заходите и спрашивайте все, не стесняйтесь.
Приглашайте друзей и получайте подарки.Добрая Администрация!
Мы ждем каждого из вас, и будем ждать с ни терпением!!!
Находите друзей, общайтесь, знакомьтесь.
У нас реально интересно.
Наш сайт развивается с каждым днем!Администрация следит за ним.
Удачи увидимся на сайте.

ВЫ НУЖНЫ НАМ!!![size=11]


1-10 11-20 21-24
Имя *:
Email *:
Код *:
Форма входа
Поиск
Друзья сайта
Статистика

Сейчас на сайте: 1
Гостей: 1
Пользователей: 0

Copyright MyCorp © 2024