Перейти к содержанию

Поиск сообщества

Показаны результаты для тегов 'tutorial'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип контента


Форумы

  • Информационный раздел
    • Новости портала
    • Техническая поддержка
    • Приватный форум
  • CRMP 0.3е
    • Помощь по Скриптингу
    • Ошибки
    • Готовые сервера
    • Дополнительные скрипты
    • Мануалы/Уроки
    • Модификации
    • Поиск
    • Архив Вопросов/Проблем/Ошибок
    • Файловый архив
    • Другое
  • SAMP/CRMP 0.3.7
    • Помощь по Скриптингу
    • Ошибки
    • Готовые сервера
    • Плагины
    • Поиск
    • Документация
  • Другое
    • Флейм

Поиск результатов в...

Поиск результатов, которые содержат...


Дата создания

  • Начало

    Конец


Дата обновления

  • Начало

    Конец


Фильтр по количеству...

Найдено: 10 результатов

  1. Что нам нужно: 1. Alci`s IMG Editor или любой другой IMG-редактор. 2. Программа "Блокнот" 3. Любые модели. Что делать: 1. Открываем Alci`s IMG Editor и создаем новый файл. Называем его так: mp_идентификатор-pack.img Вместо идентификатора пишем свое название латинским алфавитом, также можно использовать цифры. Закидываем этот файл в папку custom, которая находится в папке с мультиплеером. 2. В папке servers создаем Блокнотом txt файл со следующим названием: ip.port.txt. Открываем файл и записываем название IMG файла 3. Чтобы игроку выводило сообщение клиенту при запуске мультиплеера делаем следующее: В папке custom создаем Блокнотом txt файл с названием файла IMG. Открываем txt и пишем: en: сообщение - для английского текста ru: сообщение - для русского текста Можно использовать цветовые модификаторы. Для того, чтобы заменить модель необходимо: 1. В созданный IMG файл закинуть dff и txd файлы модели.
  2. И снова здравствуйте! Эта тема для тех, кто не знает как перевести сервер с SAMP на CRMP. 1) Скачиваем стандартный мод с офф.сайта адаптации SAMP. [*]Windows Server [*]Linux Server 2) Разархивируем архив на рабочий стол и откроем папку. 3) В папке видим 3 файла: adap-npc, announcr, samp-server-cr.
  3. Всем привет. Попытаюсь разжевать новичкам как создать авто для фракций. Вообщем, перейдем к делу. В нашем туториале мы будем добавлять машины для милиции. Первым делом нам нужно создать глобальную переменную. new Militia[2]; Далее идем в public OnGameModeinit и вставляем наши машины. Пример: AddStaticVehicleEx(411,1788.7271,1352.2760,10.7370,3.0671,55,55,60000);AddStaticVehicleEx(411,1788.7271,1352.2760,10.7370,3.0671,55,55,60000);AddStaticVehicleEx(411,1788.7271,1352.2760,10.7370,3.0671,55,55,60000);AddStaticVehicleEx(411,1788.7271,1352.2760,10.7370,3.0671,55,55,60000); К первой машине добавляем Militia[0] =, а к последней машине Militia[1] = Пример: Militia[0] = AddStaticVehicleEx(411,1788.7271,1352.2760,10.7370,3.0671,55,55,60000);AddStaticVehicleEx(411,1788.7271,1352.2760,10.7370,3.0671,55,55,60000);AddStaticVehicleEx(411,1788.7271,1352.2760,10.7370,3.0671,55,55,60000);Militia[1] = AddStaticVehicleEx(411,1788.7271,1352.2760,10.7370,3.0671,55,55,60000); Машины между Militia[0] и Militia[1] автоматически становятся милиции. А это значит, если в дальнейшим надо будет добавлять машины милиции, добавляем их между Militia[1] и Militia[2] Далее идем в public OnPlayerStateChange и вставляем следующий код: if(newstate == PLAYER_STATE_DRIVER)//Игрок сидит за рулем автомобиля{new carid = GetPlayerVehicleID(playerid);//Узнаем в какой машине сидит игрокif(carid >= Militia[0] && carid <= Militia[1])//Если игрок сидит в машине которая больше или равна Militia[0] и меньша или равна Militia[1]{if((PlayerInfo[playerid][pMember] & PlayerInfo[playerid][pLeader]) != 1)//Проверка на игроков из фракции номер 1.{SendClientMessage(playerid, -1, "У вас нет ключей от этого транспорта.");//Если игрок не состоит в 1-ой фракции пишем этот текст.RemovePlayerFromVehicle(playerid);//Выкидываем с машины}}} Если PLAYER_STATE_DRIVER уже существует в данном колбэке, ещё создавать необязательно. Можно просто вставить в уже существующий. P.S Если возникнут вопросы, пишите в данной теме. P.S PlayerInfo, pLeader, pMember при необходимости нужно сменить. Автор: Amfy
  4. Здравствуйте, уважаемые пользователи портала! Сейчас хотелось бы разобрать принцип работы часов на тексдравах. Для начала выложу скриншот того, что получится(нажмите для увеличения): Итак, приступим!С самого начала логично было бы создать сам тексдрав. Объявляем переменную: new Text:Clock;//часы Далее создадим тексдрав. Добавляем в public OnGameModeInit следующее: Clock = TextDrawCreate(549.000000, 25.000000, "00:00"); TextDrawAlignment(Clock,0); TextDrawBackgroundColor(Clock, 255); TextDrawFont(Clock, 3); TextDrawTextSize(Clock, 0.599999, 2.200000); TextDrawLetterSize(Clock,0.599999, 2.200000); TextDrawSetOutline(Clock, 1); TextDrawSetShadow(Clock, 0); TextDrawUseBox(Clock, 0); TextDrawColor(Clock, 0x33AA33AA); А теперь что? Ведь нужно сделать так, чтобы текстдрав был виден игрокам, верно? Верно. Добавляем в public OnPlayerConnect показ текстдрава: TextDrawShowForPlayer(playerid, Clock); Есть. Все отображается. Все как на картинке. НО - тексдрав будет постоянно показывать лишь 00:00 Как это исправить? Как сделать обновление? Ровно об этом принципе работы рассказать и хочется. Создадим паблик и таймер, ссылающийся на этот паблик. Повтор функции? Конечно. А иначе как будет обновляться тексдрав? Приступим. forward UpdateTime(); public UpdateTime() { new string[32]; new hour,minute,second; gettime(hour,minute,second); format(string, sizeof(string), "%02d:%02d", hour, minute); SetWorldTime( hour ); TextDrawSetString(Clock,string); } Все? Нет, не все. Ведь нету вызова функции. Сделаем его по стандарту, в public OnGameModeInit: SetTimer("UpdateTime", 1000, 1); И что у нас получится? Паблик UpdateTime будет вызываться каждую секунду и обновлять часы.Спасибо за внимание.
  5. Всем доброго времени суток. Сегодня я попробую помочь людям которые не понимают этот командный процессор. ZCMD - это быстрый и простой командный процессор сделанный Zeex поэтому я научу Вас, ребята, которые не знают как с ним работать. sscanf - является строкой расщепления рутинной сделанный Y_Less. Что нам нужно? 1) Нам необходим include ZCMD. Скачать - http://rghost.ru/48159848 2) Нам необходим include Sscanf. Скачать - http://rghost.ru/48159900 Ok, Вы скачали? Good. Теперь идем в папку pawno, открываем папку include и вставляем туда то, что Вы скачали. Шаг №1. Если Вы используете Windows Server, то Вам необходим plugins sscanf.dll - есть в архиве. Ok, Вы скачали? Good. Теперь идём в папку с Вашим сервером, открываем папку plugins и вставляем туда то, что скачали. Потом нажимаем стрелочку "Назад" и находим файл server.cfg и в самый конец вставляем строку: plugins sscanf. Если Вы используете Linux Server, то тогда Вам необходим plugins sscanf.so - есть в архиве. Ok, Вы скачали? Good. Теперь идём в папку с Вашим сервером, открываем папку plugins и вставляем туда то, что скачали. Потом нажимаем стрелочку "Назад" и находим файл server.cfg и в самый конец вставляем строку: plugins sscanf.so. Шаг №2. Использование. Последний шаг. Итак, все нужные файлы мы скачали. Перейдем к их использованию. Открываем свой мод, и в самое начало мода вставляем (ко всем include): #include <sscanf2> #include <zcmd> Ok, Вставили? Good. Идем дальше, команды не нужно делать в: public OnPlayerCommandText(playerid, cmdtext[]) Команды, мы будем делать не в начале, не в середине, а в конце мода! И вообще, если Вы решили перейти на ZCMD, отключите его, в местo: return 1; поставьте: return 0; Так он нам больше не понадобится. Итак, давайте начнем делать основную команду, вставляем в конец мода: CMD:pawno(playerid, params[]) { // Здесь будет наш код. return 1; } Что такое playerid? И params[]? playerid - это игрок который будет использовать нашу команду, а params[] - это действие, которое будет выполняться при вводе команды. Давайте попробуем добавить сообщение в команду? Итак: CMD:pawno(playerid, params[]) { SendClientMessage(playerid, 0xFFFFFFF, "Пацаны, у меня команда работает! Yeah!"); return 1; } Компилируем... Good. Заходим, тестим. Отлично! Примечание: я добавил цвет "0xFFFFFFF" по умолчанию, можно добавить туда цвет какой вы хотите. Теперь, давайте использовать sscanf, команда будет посложнее... CMD:heal(playerid, params[]) { if(sscanf(params, "u", params[0])) return SendClientMessage(playerid, 0xFFFFFFF, "Используй: /heal [id/name]"); if(!IsPlayerConnected(params[0])) return SendClientMessage(playerid, 0xFFFFFFF, "Игрок не найден!"); SetPlayerHealth(params[0], 100); return 1; } "u" - спецификатор, который выступает за Ник / ID игрока. А также, sscanf будет проверять, если отправитель использует не правильное использование команды, выведет сообщение: Используй: /heal [id/name] Другие спецификаторы: i, d - используются при целых числах. !IsPlayerConnected - проверка на подключение игрока, если игрока нет на сервере, то Вам выведет сообщение: Игрок не найден! SetPlayerHealth - и собственно самa функция выдачи здоровья, 100 - это кол-во жизней. Компилируем... Good. Заходим, тестим. Отлично! На этом я думаю закончить свой урок. Всем спасибо за внимание. Автор урока: lovely
  6. Доброго времени суток, уважаемые пользователи портала! Сегодня мы с вами разберем, как сделать лог убийств с сохранением ников обоих игроков и времени убийств. Итак, начнем!Перед началом проверьте у себя в моде присутствие следующей строки: #include <file> В public OnPlayerDeath закинем код следующего вида: new year, month,day;//переменные даты new hour,minute,second;//переменные времени new nick1[24];//ник убитого new nick2[24];//ник убийцы new string[256]; getdate(year,month,day); //вычисление даты gettime (hour,minute,second);//вычисление времени GetPlayerName(playerid, nick1, sizeof(nick1));//Получаем ник убитого GetPlayerName(killerid, nick2, sizeof(nick2));//Получаем ник убийцы. format(string, sizeof(string), "[%d.%d.%d][%d:%d:%d]%s ubil igroka %s", year, month, day, hour, minute, second, nick2, nick1);//Собираем весь пазл KillLog(string);//Обращаемся к паблику записи лога Далее в любое место: forward KillLog([string]); public KillLog([string]) { new entry[256]; format(entry, sizeof(entry), "%sn",string);//Подготавливаем к записи new File:hFile;//переменная под файл hFile = fopen("logkill.log", io_append);//открываем файл fwrite(hFile, entry);//записываем! fclose(hFile);//закрываем ФАЙЛ! } В папке scriptfiles создайте папку log и в ней файл kill.log Удачи! Спасибо за внимание! Ах да, скрины:
  7. Здравствуйте, уважаемые пользователи портала! У меня появился небольшой кусочек времени, поэтому я решил написать карсивооформленную команду /kick В чем преимущества? 1. Вывод всем игрокам сообщения о действии, вывод ника администратора, причины. 2. Текстдрав об успешном выполнении действия. 3. Запись в лог. Для корректной работы нам потребуется инклуд MxINI, а так же следующий дефайн: #define COLOR_DARK 0xBBBBBBAA Итак, начнем с самой команды: if(strcmp(cmdtext, "/kick", true) == 0) { if(IsPlayerConnected(playerid)) { tmp = strtok(cmdtext, idx); if(!strlen(tmp)) { SendClientMessage(playerid, COLOR_DARK, "/kick [Ид игрока] [Причина]"); return 1; } giveplayerid = strval(tmp); if (PlayerInfo[playerid][pAdmin] >= 1) { if(IsPlayerConnected(giveplayerid)) { if(giveplayerid != INVALID_PLAYER_ID) { GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer)); GetPlayerName(playerid, sendername, sizeof(sendername)); new length = strlen(cmdtext); while ((idx < length) && (cmdtext[idx] <= ' ')) { idx++; } new offset = idx; new result[64]; while ((idx < length) && ((idx - offset) < (sizeof(result) - 1))) { result[idx - offset] = cmdtext[idx]; idx++; } result[idx - offset] = EOS; if(!strlen(result)) { SendClientMessage(playerid, COLOR_DARK, "/kick [id игрока] [Причина]"); return 1; } new year, month,day; new hour, minute, second; getdate(year, month, day); gettime(hour, minute, second); format(string, sizeof(string), "[%d.%d.%d.][%d:%d:%d]%s кикнул %s, причина: %s",month,day,year,hour,minute,second,giveplayer, sendername, (result)); KickLog(string); format(string, sizeof(string), "%s кикнул %s, причина: %s ", giveplayer, sendername, (result)); SendClientMessageToAll(COLOR_RED, string); format(string, sizeof(string), "YCЊEЋмO!!!"); GameTextForPlayer(playerid, string, 900, 1); Kick(giveplayerid); return 1; } } } else { SendClientMessage(playerid, COLOR_DARK, "Неверный ИД."); } } return 1; } Далее требуется функция записи в лог. В любое место мода: stock KickLog(string[]) { new entry[256]; new iniFile = ini_openFile("log/kick.ini"); format(entry, sizeof(entry), "%sn",string); ini_setString(iniFile, entry, "true"); ini_closeFile(iniFile); } Вот и все! Удачи. Спасибо за внимание. Скрины:
  8. Доброго времени суток, господа.Cегодня мы разберем проверку на пользовательский модпак у игрока средствами сервера.Как писал на форумах самп.ком DimonML, существуют несколько специальных команд, отсылаемых сервером клиенту. Одна из них позволяет получить хэш установленного модпака.Для того, чтобы отослать эту команду, необходимо использовать следующее выражение: SendClientMessage(playerid,0x01010101, "$cmd get_custom_hash"); В принципе, отослать его можно где угодно (естественно, в том коллбэке, где используется playerid), но я рекомендую отправлять непосредственно в OnPlayerConnect.Далее, от клиента в коллбэк OnPlayerCommandText должен поступить ответ следующего вида: $response get_custom_hash ХэшМодпака Его мы проверять и будем. В шапке OnPlayerCommandText используем функцию strfind. if(strfind(cmdtext, "$response get_custom_hash", true) != -1) //Если ответ получен и искомая строка найдена{new packhash[64]; //Создадим массив, в котором будет находится этот хэшstrmid(packhash, cmdtext, 26, strlen(cmdtext)); //Разделяем строку cmdtext и результат разделения - искомый хэш - запишем в массив packhashSendClientMessage (playerid, 0xFFFFFFFF, packhash); //И, к примеру, выведем текущий хэш в чат игроку.return 1;} Далее все необходимые действия мы будем проводить уже после получения хэша в packhash.К примеру, если нужно кикнуть игрока в случае, если хэш модпака не соответствует эталонному: if(strfind(cmdtext, "$response get_custom_hash", true) != -1) //Если ответ получен и искомая строка найдена{new packhash[64]; //Создадим массив, в котором будет находится этот хэшstrmid(packhash, cmdtext, 26, strlen(cmdtext)); //Разделяем строку cmdtext и результат разделения - искомый хэш - запишем в массив packhashif (strcmp(packhash, "ЗначениеЭталонногоХэша", false)) //Если строки различны{SendClientMessage (playerid, 0xFFFFFFFF, "У Вас не установлен или установлен неверный пакет модификаций."); //Выведем игроку сообщение о несоответствииKick (playerid); //и кикнем его с сервера.}return 1;} Как видите, ничего сложного.Что делать с игроком при несоответствии - решать уже программисту. Основную логику проверки и скрипт-пример я привел.Надеюсь, урок окажется полезным. Если возникнут вопросы - задавайте, постараюсь ответить.
  9. Итак начнём. Находим public OnPlayerConnect(playerid) И после скобок вставляем вот это : GameTextForPlayer(playerid, "~n~Welcome~n~ ~n~To ~r~ ~r~]RP]Ваш сервер]", 18000, 4); Вот скрин с приветсвием. Автор:Alvaro
  10. Доброго времени суток, уважаемые пользователи. Я знаю, что было уже очень много решений по установке неоновых огней на автомобиль, но толкового туториала с подробным объяснением, как и почему все работает, я не видел. Что же, нужно исправить эту досадную оплошность. Итак, вначале разберем принцип работы. Как многие знают, в SAMP разрешено прикреплять объекты к автомобилям. А поскольку в наличии есть объекты галогеновых ламп, задача становится простейшей - при установке неона создаем объект-лампу и крепим его к автомобилю, при демонтаже - удаляем. Объекты ламп имеют ID с 18647 по 18651 (в данном примере - красный, синий, зеленый, желтый и розовый соответственно). Как ни странно, но - с теорией все, пора переходить к практике. Создаем new.pwn, подключаем библиотеку a_samp. Для желающих - можно подключить и стример, в туториале будут использоваться стандартные функции для работы с объектами. #include Объявляем массив для хранения информации об автомобилях и неоновых огнях. В нулевом элементе будет храниться информация о наличии и цвете лампы (-1 - не установлен, от 0 до 4 - соответственно красный, синий, зеленый, желтый и розовый), первый и второй будут использоваться для хранения в них указателей на объекты, последний - для сохранения текущего состояния лампы (включена или выключена). new neon[MAX_VEHICLES][4]; Теперь приступим к основным функциям. Первой из них будет установка неона на автомобиль. Параметрами функции будут ID автомобиля в игре и цвет от 0 до 4 - при создании объекта 18647 будет сдвигаться на значение цвета (18647 - объект красной лампы). Алгоритм таков: нулевому элементу присваиваем значение цвета, третьему - единицу (лампа после установки включена), создаются два объекта (первый и второй элементы) и прикрепляются к автомобилю. forward PlaceNeon (vehicle, color); public PlaceNeon (vehicle, color) { neon[vehicle][0] = color; neon[vehicle][3] = 1; DestroyObject(neon[vehicle][1]); DestroyObject(neon[vehicle][2]); neon[vehicle][1] = CreateObject(18647+color,0,0,0,0,0,0,100.0); neon[vehicle][2] = CreateObject(18647+color,0,0,0,0,0,0,100.0); AttachObjectToVehicle(neon[vehicle][1], vehicle, -0.8, 0.0, -0.70, 0.0, 0.0, 0.0); AttachObjectToVehicle(neon[vehicle][2], vehicle, 0.8, 0.0, -0.70, 0.0, 0.0, 0.0); return 1; } Далее идет удаление неона. Функция принимает как параметр только ID авто. Ставим в нулевой элемент -1 (отсутствие неона), лампу выключаем (третий элемент в ноль), объекты удаляем. forward RemoveNeon (vehicle); public RemoveNeon (vehicle) { neon[vehicle][0] = -1; neon[vehicle][3] = 0; DestroyObject(neon[vehicle][1]); DestroyObject(neon[vehicle][2]); return 1; } Последняя функция - включение-выключение установленной лампы. Тут алгоритм посложнее. Если лампа установлена (первый элемент массива - не -1), начинает свою работу триггер. Если лампа была выключена - создаем два объекта нужного цвета. Если включена - удаляем их. Естественно, не забывая ставить нужные метки в состояние лампы. forward TurnNeon (vehicle); public TurnNeon (vehicle) { if (neon[vehicle][0] != -1) { switch (neon[vehicle][3]) { case 0: { neon[vehicle][3] = 1; neon[vehicle][1] = CreateObject(18647+neon[vehicle][0],0,0,0,0,0,0,100.0); neon[vehicle][2] = CreateObject(18647+neon[vehicle][0],0,0,0,0,0,0,100.0); AttachObjectToVehicle(neon[vehicle][1], vehicle, -0.8, 0.0, -0.70, 0.0, 0.0, 0.0); AttachObjectToVehicle(neon[vehicle][2], vehicle, 0.8, 0.0, -0.70, 0.0, 0.0, 0.0); } case 1: { neon[vehicle][3] = 0; DestroyObject(neon[vehicle][1]); DestroyObject(neon[vehicle][2]); } } } return 1; } Собственно, основные функции у нас есть. Как с ними работать - уже как подскажет фантазия, но я разберу конкретные примеры. Итак, установка будет проходить по команде /neon. Создаем диалоговое окно со списком. Прошу не пинать за то, что в первом меню всего один пункт - писалось с запасом, так как будет дополняться мишурой типа установки мигалок и так далее. public OnPlayerCommandText(playerid, cmdtext[]) { if(!strcmp("/neon", cmdtext, true)) { if(IsPlayerInAnyVehicle(playerid)) { if(GetPlayerState(playerid)!=PLAYER_STATE_DRIVER) SendClientMessage(playerid,0xAFAFAFAA,"Вы должны сидеть за рулем автомобиля"); else ShowPlayerDialog(playerid,6000,DIALOG_STYLE_LIST,"Меню","Неон","Выбрать","Отмена"); } return 1; } return 0; } public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == 6000) { if(response) { if(listitem==0) ShowPlayerDialog(playerid,6001,DIALOG_STYLE_LIST,"Неон", "Красный\nСиний\nЗеленый\nЖелтый\nРозовый\nУбрать неон","Дальше","Отмена"); } return 1; } if(dialogid == 6001) { if(response) { if(listitem==5) { RemoveNeon (GetPlayerVehicleID(playerid)); SendClientMessage (playerid, 0xff440000, "Неон удален"); } else if (listitem >=0 && listitem { PlaceNeon (GetPlayerVehicleID(playerid), listitem); SendClientMessage (playerid, 0xff440000, "Неон установлен"); } } return 1; } return 0; } Включение-выключение забьем на кнопку подмиссии (стандартно - 2 на алфавитной части клавиатуры). Используем старый-добрый дефайн PRESSED: #define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0))) И, собственно, описываем действия по кнопке: public OnPlayerKeyStateChange(playerid, newkeys,oldkeys) { if (PRESSED(512) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER) TurnNeon (GetPlayerVehicleID(playerid)); return 1; } А что делать, если машина уничтожится? Объекты надо удалить. Используем OnVehicleDeath: public OnVehicleDeath (vehicleid, killerid) { DestroyObject(neon[vehicleid][1]); DestroyObject(neon[vehicleid][2]); return 1; } И для грамотной загрузки и выгрузки объектов - вычищаем массивы при старте и при остановке скрипта. public OnFilterScriptInit() { for (new i=0; i return 1; } public OnFilterScriptExit() { for (new i=0; i return 1; } Собственно, все! Я не рассматривал в данном примере сохранение параметров неона после выгрузки сервера в файле или БД, проверку на то, в авто ли игрок или в мотоцикле/вертолете/etc. и тому подобные вещи. Как видно из кода, за установку даже деньги не снимаются. В этом и заключается универсальность - можно заточить исходник под собственные нужды.
×

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.