|
Внимание! Теперь для входа на форум необходимо вводить единый пароль регистрации сервисов sibnet.ru!
Здравствуйте, гость ( Вход | Регистрация )
Сейчас обсуждают
 
| |
Всё для SA:MP, Программы, скрипты, модификации |
|
|
ZerOOm |
8.6.2008, 4:11
|
Зоро летящий на крыльяхночи
Группа: Sibnet-club
Сообщений: 1 520
Регистрация: 19.5.2008
Пользователь №: 33 511
Репутация: 728
|
Данная тема создана для размещения здесь программ и модификаций для SAMP. Допускается выкладывание программ, не имеющих прямого отношения к SAMP, но важных, по вашему мнению, для игроков и общающихся на этом форуме (как пример грабер экрана, обработчик скриншотов). Последняя версия SA:MP 0.3.7Grand Theft Auto San AndreasРусификатор для GTA-SAQuickBinder 1.7 для SA:MPNOCD для GTA:SAМоды Сибнета ТОЛЬКО у администраторов мода!!!!!Вы их не получите!!!!!!
С модификациями для СИНГОЛЬНОЙ ВЕРСИИ ИГРЫ вам =>СЮДА<= (там-же находятся модели машин!!!)В дальнейшем запрещено выкладывание моделей заменяющих оригинальные!Выкладывание модификаций для GTA SA (сингольной версии) возможно. (Но не приветствуется!!!) В том случае если это 100% не мешает работе SAMP клиента и SAMP сервера. (На данный момент это только замена ТЕКСТУР!) Просьба не задавайте вопросов таких как " Как установить моды ?" , "Куда пихать файлы ?" За это устный пред с занесением в логи. Для особо буйных - бан.Сообщение отредактировал Оxxxy - 3.9.2016, 9:35
» Спасибо сказали: « 3gar5r, 4k_Forward_, Adik228, ALkAeRoK, C.H.I.B.I.S., Dragon485, fenix_97, Garynych_sg, jiexa08, KEHTOK, minaeva, Ranckos, RedWings, serega456, SonG 42RUS, Stas.Strish1995, volk03, Volt96, xxx_alexrush_xxx, zheka777, Zhekman, Лёха-mAKAr, Оxxxy, _DaRtVeYdEr_, _Headshot_GTO_, _MaJest1k_, _Tuman_,
|
|
|
|
HELKERN |
8.6.2008, 12:00
|
Ближе бандерлоги. Ближе.
Группа: Sibnet-club
Сообщений: 3 460
Регистрация: 22.2.2008
Из: Улан-Удэ
Пользователь №: 21 789
Репутация: 745
|
Итак к вашему сведенью довожу о полезных программках от моего оч хорошего знакомого DarkByte SA-MP Anti-Cheat System v1.0.6 by DarkByte » Спойлер (нажмите, чтобы прочесть) « Уже наверное год, неспешно, веду разработку античита для SA-MP'a (не amx скрипт) Античит успешно защищает от читов мой сервер (gta.is74.ru), но этот сервер находится в локальный сети (внешки нету) на нём играет в среднем 50-60 игроков и ни одного читера или игрока с модами влияющими на мультиплеер.
Сегодня решил что настало время выводить свой античит на другой уровень, не останавливаться на локальный сети. Но т.к. пока времени мало, в связи с сессией, да и учёбой в общем, делать версию для других серверов некогда, поэтому пока выкладываю локальную версию программы, которая обладает почти полным функционалом, за исключением графических модификация, защиты от модификация карты и автоматического восстановления файлов.
В данной версии реализовано: * Защита важных файлов из папки data (handling.cfg и тд + script.img и main.scm) * Защита от внедрения чужого кода\изменения памяти процесса gta_sa * Защита от большинства тренеров, которые работают в одиночной игре и в SA-MP'e * Защита от модельных модификаций (dff, col) в файле gta3.img * Защита от s0beit hack, V0gelz mod (reborn), NaWaR mod (reborn), Artmoney * Защита от использование геймпада (autoaim) * Блокировка игроков по MAC адресу и некоторым другим параметрам железа
SA-MP Anti-Cheat System v1.0.5 by DarkByte
Если античит пишет чтото типа: Загрузка файла "handling.cfg"... ERROR (0): Socket Error # 10061 Connection refused. Значит нужно из архива с оригинальными файлами в папку с игрой в папку data скопировать файл handling.cfg Либо поднять http сервер (можно HFS) на порту 5464 и расшарить в него папку files и папку gtasa из архива
P.S. античит может обнаруживаться\подозреваться некоторыми антивирусами как вирус, это не так =) В версии v1.0.6 очень много добавлений подробнее тутклиентсерверскрипторигинальные фаилы игрыклиент sampТеперь подробнее: SA-MP by DarkByte » Спойлер (нажмите, чтобы прочесть) « SA-MP v0.2.2 by DarkByte mod v0.1b - ссылку ищите ниже
Сегодня немного доделал клинет, итого получилось: 1) Добавлены закладки серверов (Избранное, Интернет, Официальные) 2) Добавлены фильтры (и панель инфо о сервере), в т.ч. по IP 3) Добавлена возможность импортирования списка избранных серверов с URL 4) Возможно исправлена проблема с кривым отображением фрагов у некоторых игроков
-Закладки серверов могут работать не корректно, поэтому пожалуйста сообщайте о всех проблемах с отображением списка серверов. Список интернет серверов может обновляться довольно долго, это зависит от вашего интернет соединения, к сожалению мне пока не удалось сделать данную обработку многопоточной, если нужно, то в следующей версии могу добавить настройку клиента: "не обновлять автоматически инфо серверов"
-Фильтр по IP пока умеет только отсеивать по части айпи адреса, т.е. например введя в окно фильтр "88.", клиент отобразит все сервера, чьи айпи содержат "88." В новой версии исправил проблему с долгим сканированием интернет серверов и подвисанием проги при этом Добавил автоматическое определение языка при первом запуске Добавил возможность самому выбирать максимальное время, в течении которого самп будет ждать ответа от сервера При сворачивании самп отправляется в трей, который рядом с часами Добавил About Box =) Все ошибки программы (runtime errors) будут записываться в файл samp.errlog 1) Исправил глюк, при котором на медленных компах не закрывалось окно About 2) Исправил глюк с медленным обновлением списка серверов (применением фильтра в т.ч.) 3) Добавил возможность отключать чередование цветов в таблицах 4) Добавил возможность отключения автоматического обновления инфо о серверах при загрузке с мастер сервера 5) Убрал ненужную кнопку Помощь =) 6) Если инфо у сервера не обновилось (его нет), то вместо имени серва пишется его айпи адрес в [ ] скобках 1) Оптимизирован алгоритм сканирования серверов, скан переведён на потоки, теперь список обновляется быстрее 2) Оптимизирован алгоритм отрисовки списка серверов 3) Оптимизирован алгоритм обновления айпи адреса по хосту 4) В настройках добавлена возможность отключения обновления адресов при запуске 5) Цвет серых полосок в списках изменён на более яркий 6) Добавлена возможность обновления основного инфы всех серверов из списка (ctrl-alt+r) 7) Добавлены горячие клавиши для меню 8) Добавлена возможность сортировки списка серверов
Наверное это предпоследняя версия с какими либо изменениями сампа, следующая версия будет фикс для этой, если конечно будут найдены баги =) А дальше уже начну встраивать античит в самп Новая версия почти полностью писалась с нуля, в следствии потери исходных кодов... Вроде реализовал все функции доступные в предыдущих версиях и добавил несколько новых: 1) В списке игроков сервера отображается ID и Пинг игроков (можно отключить в опциях) 2) Можно самому задать максимальное количество потоков сканирования серверов (под свою пропускную способность инета) 3) Возможность выбора момента обновления IP адресов серверов (при запуске проги, при обновлении инфо сервера или никогда) 4) Быстрее стало работать обновление списка серверов 5) Исправил багу с интернет серверами 6) Добавил пункт меню "Обновить все" 7) Добавил сочетания горячих клавиш в главное меню 8) Добавил возможность запуска debug режима игры 9) Добавил RCON модуль 10) Добавил в контекстном меню сервера "Добавить в избранное" 11) Сделал опциональное копирование инфы сервера 12) Исправил баг с подключением к серверам с паролем 13) Сделал возможность сортировки в окне списка игроков сервера 14) Если 2 раза кликнуть по списку игроков или списку правил сервера, то они обновятся 15) Исправил баг с пустым окошком (при подключении к серверу) 16) Исправил баг с подвисанием окна при обновлении инфы сервера 17) Исправил баг с кривым отображением расширенной инфы о игроках, если сервер этого не поддерживает
Думаю багов будет достаточно много, поэтому не стесняйтесь и пишите обо всех багах в ICQ или в эту тему
P.S. ID и пинг отображаются только для серверов 0.2.2, если версия сервера ниже, то отображаться они не будут, вне зависимости от галочки в настройках. Далее: SA-MP Super Ban (Более эффективные баны в SA-MP'e) » Спойлер (нажмите, чтобы прочесть) « SA-MP SuperBan [DarkByte ICQ #5072866] - ссылку ищите ниже Программа позволяет ставить более эффективные баны в SA-MP'e В архиве: клиент, сервер, скрипт для SA-MP сервера и его исходник
Можно банить по: 1) IP и MAC адресу 2) Серийным номерам жёстких дисков 3) Серийному номеру Windows 4) Имени пользователя и компа 5) По месту расположения программы
Для того чтобы активировать систему бана на сервере, нужно: 1) Скопировать файл SBServer.exe в папку с сервером и запустить его Если сервер запускается из другого места, то нужно вручную указать папку scriptfiles 2) Подгрузить на сервер фильтр-скрипт SBFS.amx 3) Сказать всем игрокам что для игры на сервере требуется SBClient.exe
Для того, чтобы подключиться к серверу с данной системой, нужно: 1) Скачать и запустить программу SBClient.exe 2) В поле ввести IP адрес сервера и нажать кнопку Подключиться 3) В SA-MP'e выбрать этот сервер и подключиться к нему
Цвет лампочки у клиента означает: Белая - не подключен к серверу Зелёная - подключен Красная - подключен, стоит бан Чёрная - не предвиденная ситуация
Баны на сервере можно ставить на любой из параметров отображаемых в логах, но не нужно в строку бана добавлять пометки типа "IP:" или "MAC:", только сами данные и только по одному в одну строку... т.е. если хотите поставить бан на 2 параметра то нужно будет поставить 2 бана 1) Добавил сворачивание в трей сервера 2) Добавил отображение ника игрока и возможность бана по нему 3) Добавил возможность подключения по хосту сервера (полезно для no-ip.ru) 4) Добавил всплывающее сообщение о бане, если стоит бан
Если щёлкнуть 2 по окну лога на сервере то он очистится и сохранится в файл логов Если версия старая, то так же как при бане, загорится красный индикатор Спасибо APTEM за сообщения о багах и предложение идей В данной версии появилась возможность использовать один сервер супер бана для нескольких самп серверов Для этого в строке файла нужно ввести несколько путей (для каждого сервера) и на каждом сервере подгрузить FS Например если структура файлов на диске: C:\ |-Serv1\ | |-scriptfiles\ | |....... |-Serv2\ | |-scriptfiles\ | |....... |-Serv3\ | |-scriptfiles\ | |....... То следует разместить прогу сервер на диске C:\ а в качестве пути файла указать: Serv1\scriptfiles\sb_players.ini;Serv2\scriptfiles\sb_players.ini;Serv3\scriptfiles\sb_players.ini; т.е. все нужные имена файлов через ";" Исправил проблему с банами, криво ставились во многих случаях, теперь если ставить бан то он применяется к игрокам сразу Для исправления проблемы требуется обновить только сервер скачать супер бан от DBВот самая главная вещь которую я вам хотел представить: SA-MP Anti-DDOS tool (Защита сервера от атак) наверное все помнят SuperMan'a ну дак вот! Эта прога защити полностью сервер от таких атак которые совершал Superman качать всем и ставить! Защитите свой серв(особенно в таки дни когда ддосят официальныесервы сампа) Подробнее: » Спойлер (нажмите, чтобы прочесть) « Заметил что многие сервера подвергаются флуд (DoS) атакам, в следствии широкого распространения программы для флуда Как то давно, когда первый раз увидел прогу для флуда сразу начал придумывать способы защиты, придумал много, реализовал - 0 А сейчас чтото осенило, сел и написал... главное оно ещё и работает и довольно не плохо работает... Единственная проблема, программа работает только под виндой, ибо кодить под никсы я пока не умею.
Для активации защиты достаточно просто запустить программу (и не выключать её) если программа обнаружит что сервер атакуется, то она отправит команду "banip IP_атакующего" в консоль сервера, в следствии чего атака прекратится. Если серверов несколько, то команда будет отправлена всем... да и не только SA-MP серверам, всем консольным окнам
Скачать можно тут: ссылку ищите ниже (12.5кб) Отзывы и вопросы пишите в топик, предложения в аську: 507-28-66
P.S. вы используете программу на свой страх и риск и всё что она сделает с вашим компом остаётся на вашей совести Добавил возможность ручного выбора сетевого интерфейса на котором установлен сервер Его можно выбрать как в окне программы (при запуске) так и указать в командной строке Например чтобы установить защиту на интерфейс 1, нужно запустить "AntiFlood.exe 1" и тд Добавлена защита от взлома RCON пароля методом брута (подбора) Добавлена возможность сворачивания в трей (кликайте по иконке в трее)
Разрешается неверно вводить RCON пароль только 10 раз в минуту, при превышении лимита - бан
Известна проблема со сворачиванием 2х одновременно запущенных прог и проблема с иконкой-призраком, остающейся после закрытия программы (исчезает при наведении мышки) Исправил баг с банилкой, теперь адреса с парными цифрами банятся нормально (айпи 10.10.111.111 банило как 10.10.1.1) Исправил баг с возможность выбора сетевого интерфейса за пределами допустимых значений По просьбам трудящихся бан теперь ставится через RCON, поэтому теперь при запуске программы нужно указывать дополнительные параметры, а именно перечислить все порты серверов на которых нужно будет ставить бан и их RCON пароли
Максимальное количество серверов 100, максимальная длинна RCON пароля 255, думаю хватит crazy Пример запуска программы (можно это записать в файл AntiFlood.bat и запускать его, либо создать ярлык с такими параметрами): Код: AntiFlood.exe 2 7777 adminpass 7778 password 7779 toor При таком запуске защита установится на интерфейс с номером 2, и 3 сервера с портами 7777, 7778, 7779 и RCON паролями adminpass, password, toor
Если на этом интерфейсе есть ещё сервера, но они не указаны в списке антифлуда, то при атаке на них автоматически поставится бан на других серверах на атакующего
Для просмотра списка интерфейсов и их номеров нужно запустить программу без параметров Добавил защиту от ещё одного вида (D)DoS атак Всё остальное осталось также Скачать защиту для сервераПользуйтесь наздоровье! HELKERN & DarkByte специально для SibNet Сообщение отредактировал HELKERN - 9.6.2008, 10:01
» Спасибо сказали: «
|
|
|
|
Pirate Rat |
8.6.2008, 16:49
|
GTO Reunion
Группа: Пользователи
Сообщений: 974
Регистрация: 28.4.2008
Из: Петербург
Пользователь №: 30 990
Репутация: 400
|
Зеруму спасибо за тему! Очень полезная. (Хоть мне пока и не нужны выше перечисленные программы! ) Но... раз уж пошли разговоры про программирование не могли бы вы мне помочь чуть чуть. Так как занялся сам пробой пера в PAWNO (а точнее в написании не больших дополнений к GTO (увы пользуюсь для испытаний GTO 0.6.0 )). (В планах на данный момент - создать гонку на рустерах (почти готово), сделать супер гонку "Безбашенное Ядро!" (по всей карте) и самое главное желание наваять вело-паркур во втором городе (столько народу этим занимается, а для них так ни чего и не сделано!)) Сообщение отредактировал Pirate Rat - 24.6.2008, 14:29
Прикрепленные файлы
GTO_0.6.0.FULL.rar ( 366.42 килобайт )
Кол-во скачиваний: 907
|
|
|
|
Pirate Rat |
8.6.2008, 22:36
|
GTO Reunion
Группа: Пользователи
Сообщений: 974
Регистрация: 28.4.2008
Из: Петербург
Пользователь №: 30 990
Репутация: 400
|
Попробую по порядку: Зерум - ави - это КОНТЕЙНЕР! И сжимать в ави - тоже самое что запихивать в бумажную коробку свинец! Сжимается кодеком. Кодеки бывают разные. Наиболее популярны сейчас DivX и XviD. Наиболее удачные не момент написания H.264 и X.264 (как халявная версия H.264 Core). По поводу своего сервера кто-то спросил. Надо с офф сайта SAMP скачать сервер для операционной которой вы будете пользоваться (подозреваю что для виндовс). Положить туда тот мод который вы собираетесь использовать и все! (Ну там поднастроить и задать пароль, создать свой акаунт) (Выше кстати опубликован и сервер тоже!) Кстати мод GTO 0.6.0 - выложен у мя в посте! Сообщение отредактировал Pirate Rat - 8.6.2008, 22:37
|
|
|
|
HELKERN |
9.6.2008, 10:09
|
Ближе бандерлоги. Ближе.
Группа: Sibnet-club
Сообщений: 3 460
Регистрация: 22.2.2008
Из: Улан-Удэ
Пользователь №: 21 789
Репутация: 745
|
Щас я поведаю вам о создании своего первого сервера для SA:MP это все делается легко и просто. Скриптинг несильно тяжкое дело и каждый может его освоить! Итак изучаем азы скриптинга. » Спойлер (нажмите, чтобы прочесть) « Рассмотрим конфигурационный файл 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. и так это все, удачного вам скриптинга » Спойлер (нажмите, чтобы прочесть) « информация взята с www.wog74.ru (не рекламма, просто не нарушаю авторские прова)
|
|
|
|
Pirate Rat |
9.6.2008, 14:45
|
GTO Reunion
Группа: Пользователи
Сообщений: 974
Регистрация: 28.4.2008
Из: Петербург
Пользователь №: 30 990
Репутация: 400
|
Полностью протестировал. На скринах вывешены все чекпоинты (чуть чуть перемещены 2 чекпоинта). Скриншоты» Спойлер (нажмите, чтобы прочесть) « прикрепленный GTO.amx (скомпилированный скрипт в работе) и race_rustler.inc
new2.rar ( 108.84 килобайт )
Кол-во скачиваний: 421Уважаемый Азарник (ну и если кто другой из кодеров нашего GTO сервера увидит), не могли бы вы глянуть, и при возможности увеличить точки старта и чекпоинтов (пока еле еле в двоем можно разместится). Гонку отлетал и не один раз. С данными настройками очень трудная! Сообщение отредактировал Pirate Rat - 24.6.2008, 15:17
|
|
|
|
Pirate Rat |
10.6.2008, 2:54
|
GTO Reunion
Группа: Пользователи
Сообщений: 974
Регистрация: 28.4.2008
Из: Петербург
Пользователь №: 30 990
Репутация: 400
|
Обещанная гонка. Название "The Madball run" (возможно что кто-то помнит фильм "The Cannonball run". "Гонка пушечное ядро". Я обыграл название и получилось что-то на подобии "Гонка сумашедшее ядро" ). Гонка длинная (не без сверх фанатизма) и очень быстрая. Далее все чекпоинты и карта обоих гонок. » Спойлер (нажмите, чтобы прочесть) « Гонка спонсировалось компанией Сюбару, производителем замечательной машины Sultan! Цитата "Одомашненная" версия раллийного монстра. Однако от прототипа остались не только отличное ускорение и хорошие тормоза, но и, кроме того, привод на все четыре колеса, что дает автомобилю, пусть и небольшое, но все же преимущество над остальными гоночными машинами. В салоне тюнинга Sultan можно сделать похожим на оригинальную Subaru, есть фирменная расцветка, антикрыло и даже знаменитые колеса золотистого цвета.
Sultan прототип: Subaru WRX STi `91 (с) гта.аг.ру
Синим гонка "RUSTLER BIG RACE" Красным "The Madball run" Гонка в виде .inc и GTO.amx (гонка первая - Rustler, гонка вторая Madball)
end_race.rar ( 108.71 килобайт )
Кол-во скачиваний: 422Сообщение отредактировал Pirate Rat - 24.6.2008, 15:20
|
|
|
|
Pirate Rat |
13.6.2008, 21:46
|
GTO Reunion
Группа: Пользователи
Сообщений: 974
Регистрация: 28.4.2008
Из: Петербург
Пользователь №: 30 990
Репутация: 400
|
вот еще удобная прога "Ingame object Creator" (bread_oed) - тоже filterscripts-овая зная ID объектов разместить их 5 сек! В том числе можно оттащить объект перед собой и поставть куда удобно! cmdlist: * /oadd [modelid] [name] - Adds a new object next to the player and selects it * /ocopy [name] - Creates a copy of currently selected object* * /odel - Deletes currently selected object and clears selection* * /omode [m_xy|m_z|r_xy|r_z] - Selects editing mode of currently selected object (move on map-X/Y Axis, move on map-Z-Axis, rotate on object-X/Y-Axis, rotate on object-Z-AXis* * /onext - List the objects next to player (broken for some reason, i fix it in next version) * /osel [object name] - Select object by name (the name you enterd for creating/copying an object) * /ostick <distance> - Stick currently selected object to player to place it via player movement* * /orelease - Detach an object sticked to the player* * /ofaktor [faktor] - Set movement/rotation speed multiplier* Commands marked with a * can also be accessed via a menu, you open it with the "Walk" key (Shift for me) сори что без перевода. Сам пока не до конца разобрался видео на чужом сайтеСообщение отредактировал Pirate Rat - 13.6.2008, 22:11
Прикрепленные файлы
_FS_IngameObjectEditor.rar ( 14.57 килобайт )
Кол-во скачиваний: 411
|
|
|
|
Pirate Rat |
13.6.2008, 22:11
|
GTO Reunion
Группа: Пользователи
Сообщений: 974
Регистрация: 28.4.2008
Из: Петербург
Пользователь №: 30 990
Репутация: 400
|
Дополнения и изменения в нем-же (копи паст с самп-рус.ком) Объясняю последний раз как пользоваться этой штукой. Вот специальный сервер для создания объектов. (Настроенный и с id Объектов) http://ifolder.ru/5569499 Он точно настроен,проверено 5 людьми у которых сначала ничё не сохранялось!!! Чтобы сохранялись кординаты в директории scriptfiles создайте Текстовый документ с названием BREAD_OED там будут сохранятся кардинаты.(P.S.Они сохраняются только на серверах 0.2.2) Скрипт работает только когда войдёш в rcon /rcon login пароль Список команд: /oadd [id модели] [имя] - Добавляет новый следующий обьект к игроку и позволяет выбрать его.(Имя нужно чтобы использовать команду /osel например я делаю забор /oadd 971 1 Я создал забор с ID 971 и именем 1.(Не когда не создавайте объекты с одинаковым именем.) Дальше обясню потом времени нет......... /ocopy [name] - Создаёт копию выбранного обьекта* /odel - Удаляет текущий обьект и снимает с него выделение* /omode m_xy - Двигать объект вправо, влево, вперёд, назад. /omode m_z - Двигать объект вверх, вниз. /omode r_xy - Крутить объект вверх, вниз, вперёд, назад. /omode r_z - Крутить объект влево, вправо. /ostick <дистанция> - Прикрепить текущий выделенный обьект к игроку чтобы расположить его двигая через игрока* /orelease - Отцепить прикрепленный обьект к игрокуr* /ofaktor [faktor] - Установить движимое/вращаемое скорость действия* (добавлю что так-же можно с большинством объектов работать через меню. Которое у меня вылезает после добавления объекта левым альтом. Поставить объект "С".) Координаты не сохраняются если вместе с Object Editor на одном сервере использовать filterscripts или gamemodes на которых уже добавляются объекты. По этому эффективно использовать Object Editor на "чистом сервере" и переносить сохранённые координаты из BREAD_OED.txt на свой gamemodes или filterscriptsт, который стоит на другом сервере. Или просто когда пользуешся Object Editor убрать из загрузки в server.cfg все filterscripts и gamemodes котрые добавляют какиенибудь объекты. Если выполнять эти простые рекомендации то координаты будут сохранятся. Проверено опытным путём. Добавлено (10.03.2008, 14:34) --------------------------------------------- Также в Object Editor ошибка координат по Y на +1. То есть когда поставил в эдиторе объект нужно из его координаты по Y вычесть единицу прежде чем переносить координаты в скипт. Сообщение отредактировал Pirate Rat - 24.6.2008, 14:47
|
|
|
|
Pirate Rat |
16.6.2008, 20:00
|
GTO Reunion
Группа: Пользователи
Сообщений: 974
Регистрация: 28.4.2008
Из: Петербург
Пользователь №: 30 990
Репутация: 400
|
Так сегодня раздача слоников из подвида filterscripts. Миссии по доставке транспорта (ну чтото вроде того)
towtruck.rar ( 2.47 килобайт )
Кол-во скачиваний: 271Тюрьма Алькатрас (жаль без бота охранника. Как добавить ума не приложу. Существует скрипт когда Военная база начинает отстреливаться сама от самолетов. Но скачать не смог!!!!)
1209799645_158_alkatras_v0.rar ( 146.83 килобайт )
Кол-во скачиваний: 270Вот после ДМ-а вы стоите в поле один одинешенек... и думаете прописать килл или пол часа бежать до ближайшей машины. Вот выход. Закажите себе автомобиль! Быстро и надежно.
1209747955_30_buycar_by_hackera.zip ( 2.95 килобайт )
Кол-во скачиваний: 257Кто-то хотел Контру на ГТА... вот МОД. Если над ним поколдавать... может и получится подключить к ГТО! (Азарник - это НЕ для тебя! )
1209576138_166_island_by_hackera.rar ( 125.65 килобайт )
Кол-во скачиваний: 225По поводу трамвая... дык из него можно все то-же метро делать. Просто сам же знаешь что это не просто и не до это-го сейчас. Так что... закрыти тему про АвтоБОТов! ))) (Хотя... какнить потом поковыряю эту тему! Но... как я знаю и об эту тему многие зубы обламали!!!!)
|
|
|
|
svin007 |
16.6.2008, 23:25
|
Барнаул сталица мира!
Группа: Sibnet-club
Сообщений: 120
Регистрация: 4.1.2008
Пользователь №: 15 657
Репутация: 17
|
Вот скрипты:
157_56_38_Area51.zip ( 6.21 килобайт )
Кол-во скачиваний: 212Вас будут обстреливать у Area51
218_101_62_debug_05.zip ( 23.34 килобайт )
Кол-во скачиваний: 282Во время игры мона растовлять тачки
214_121_Bots0.2.5Be.rar ( 4.02 килобайт )
Кол-во скачиваний: 356Боты!!!!!!Мод в котором тупо месить ботов можно сделать скриптом !
165_100_65_superrca.rar ( 1.13 килобайт )
Кол-во скачиваний: 192При сталкновении у вас отнимается здоровие!
245_121_CELL.zip ( 19 килобайт )
Кол-во скачиваний: 210Телефон
180_8_MSR_v1.0.rar ( 4.35 килобайт )
Кол-во скачиваний: 192Это или зомби атакуют вас,или скрипт при нажатии на кнопку огонь в машине перед вами появляется трамплин!
332_30_55_XCTS.zip ( 9.44 килобайт )
Кол-во скачиваний: 182Это или зомби атакуют вас,или скрипт при нажатии на кнопку огонь в машине перед вами появляется трамплин!
327_40_141_Ramps.rar ( 1.67 килобайт )
Кол-во скачиваний: 192Тыкаем правой кнопкой мыши в машини и тадм впереди вас появится трамплин! Кому помог ставте +! Сообщение отредактировал svin007 - 16.6.2008, 23:36
|
|
|
|
svin007 |
17.6.2008, 14:09
|
Барнаул сталица мира!
Группа: Sibnet-club
Сообщений: 120
Регистрация: 4.1.2008
Пользователь №: 15 657
Репутация: 17
|
Вот ещё скрипты:
335_24_29_cars.rar ( 11.3 килобайт )
Кол-во скачиваний: 297Просто пишем /carshelp или /название машины и она у вас!
342_28_246_portland.rar ( 7.18 килобайт )
Кол-во скачиваний: 193Добовляет в порт мосты рекламные вывески и т.д впрочим рай для гонок!
248_27_weapons_menu.rar ( 3.8 килобайт )
Кол-во скачиваний: 260Вот..... Те надоело ездить в аммо магазины?... вот решение товоей проблемы просто пишим /weaponsmenu,а дальши выбераем оружие!
213_217_zombie.rar ( 6.83 килобайт )
Кол-во скачиваний: 301Вобше весёлый скрипт.... Добовляет в игру зомби которые любым способом могут убить тебя Вот комманды:/zo (создать зомби похожего на вас) /zstart (делает последнего зомби для охоты на вас) /zstop Заставить зомби остановиться /zspeed (изменить его скорость) (умолчание = 5) /ztimerspeed (изменить скорость таймера) /vaiven (изменить угол направления зомби, сделать его будто "прогуливающимся", пробуем /vaiven 30)(только для v1.2) П.с. если хотите повеселиться, просто сядьте в машину по мощнее и по больше и разогнавшись, вьезжайте в толпу зомби, давите столько сколько сможете, мясо, кишки, кости, это ведь то что вы любите не так ли?! Жду +
» Спасибо сказали: «
|
|
|
|
1 чел. просматривают этот форум (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|