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

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

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

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

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

Тип контента


Форумы

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

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

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


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

  • Начало

    Конец


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

  • Начало

    Конец


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

Найдено: 2,041 результат

  1. Какой лучши мод этат http://forum.gs-games.ru/topic/4245/ или этат http://forum.gs-games.ru/topic/3937/
  2. Помогите плиз не могу узнать пароль от адм панели,с меня +!!!!!!!!!!!!!!1
  3. Подскажите как у фракций поменять скины просто искал не могу найти смог заменить скины токо в /makeleader
  4. m0k

    Гараж

    CreateObject(5248,2417.19995117,-2476.30004883,-28.39999962,0.00000000,0.00000000,0.00000000); //object(lod_mexcrnershp) (1) CreateObject(5248,2431.80004883,-2473.00000000,-28.39999962,0.00000000,0.00000000,0.00000000); //object(lod_mexcrnershp) (2) CreateObject(3095,2425.00000000,-2475.60009766,-28.70000076,0.00000000,0.00000000,0.00000000); //object(a51_jetdoor) (1) CreateObject(3095,2425.00000000,-2484.60009766,-28.70000076,0.00000000,0.00000000,0.00000000); //object(a51_jetdoor) (2) CreateObject(5248,2417.19995117,-2486.00000000,-28.39999962,0.00000000,0.00000000,0.00000000); //object(lod_mexcrnershp) (3) CreateObject(5248,2424.60009766,-2494.19995117,-28.39999962,0.00000000,0.00000000,180.00000000); //object(lod_mexcrnershp) (4) CreateObject(5248,2431.80004883,-2483.60009766,-28.39999962,0.00000000,0.00000000,0.00000000); //object(lod_mexcrnershp) (5) CreateObject(5248,2424.80004883,-2471.80004883,-28.39999962,0.00000000,0.00000000,90.00000000); //object(lod_mexcrnershp) (6) CreateObject(3095,2425.10009766,-2486.19995117,-24.20000076,0.00000000,0.00000000,0.00000000); //object(a51_jetdoor) (3) CreateObject(3095,2424.30004883,-2478.19995117,-24.20000076,0.00000000,0.00000000,0.00000000); //object(a51_jetdoor) (4) CreateObject(1441,2426.39990234,-2476.30004883,-27.50000000,0.00000000,0.00000000,0.00000000); //object(dyn_box_pile_4) (1) CreateObject(1235,2424.69995117,-2476.00000000,-27.60000038,0.00000000,0.00000000,0.00000000); //object(wastebin) (1) CreateObject(2028,2423.00000000,-2476.00000000,-27.70000076,0.00000000,0.00000000,90.00000000); //object(swank_console) (1)
  5. Господа, Вашему вниманию предлагается скрипт тюнинг-ателье "ГопКар". Реализованы следующие возможности: [*]Ремонт автомобиля; [*]Перекраска автомобиля (с выбором цвета практически как в сингл-плеере); [*]Установка баллонов с закисью азота; [*]Установка колесных дисков; [*]Установка неоновой подсветки; [*]Установка сабвуфера и гидравлической подвески. Скрипт полностью отлажен и работает. Сохранение тюнинга не реализовано ввиду того, что систем авто - очень много, однако могу предложить свои услуги по встраиванию скрипта в Ваш мод. Также ввиду индивидуальных особенностей моделей автомобилей не реализована установка корпусных деталей, дабы не вызывало крэшей у игроков. Автор скрипта - SHOROOP (Alexander Gordon), автор выбора цвета - OKStyle (огромное спасибо за его работу и за скрипт, послуживший частичной основой для выбора цвета). GopCar.rar
  6. Новая команда выглядит таким образом: public OnPlayerCommandText(playerid, cmdtext[]) { if (strcmp("/mycommand", cmdtext, true, 10) == 0) { return 1; } return 0; }strcmp – сравнивает два значения, в данном случае «/mycommand» с командой, которойигрок вводит в чат (cmdtext), cmdtext – это параметр в котором хранится текст команды, которую игрок ввел в чат. Значение true означает нечувствительность к регистру. Если мы напишем false, игрок должен будет соблюдать регистр букв при написании команды. Приведу пример простой команды с использованием оператора format из прошлого урока. if (strcmp("/afk", cmdtext, true, 10) == 0) { new pname[24],string[50]; GetPlayerName(playerid, pname, 24); format(string, sizeof(string), "-- %s Отошел от компьютера... ", pname); SendClientMessageToAll(0xFFFF00AA,string); return 1; }Тут все просто. Переходим к следующему уроку.. Автор Cloud
  7. ByMeR_OK

    Система Квартир

    Сегодня я расскажу как зделать систему квартир на сервере ищем в моде enum pInfoи выше вставляем enum fInfo { fOwned, fOwner[MAX_PLAYER_NAME], Float:fEntrancex, Float:fEntrancey, Float:fEntrancez, Float:fExitx, Float:fExity, Float:fExitz, fInt, fVirtWorld, fValue, fLock, fRent, fRentabil, fTakings, fDate, fLevel }; new FlatsInfo[27][fInfo]; new FlatPickup[sizeof(FlatsInfo)]; new Text3D: Flat3D[sizeof(FlatsInfo)]; new flathouse1[2]; new flathouse2[2]; new flathouse3[2];Потом идём в public SetPlayerSpawn и ищем там new house = PlayerInfo[playerid][pPhousekey];после этого вставляем new flat = PlayerInfo[playerid][pFlatKey];в этомже паблике немного ниже вставляем if(flat != 255) { if(SpawnChange[playerid]) //If 1, then you get to your house, else spawn somewhere else { SetPlayerToTeamColor(playerid); SetPlayerInterior(playerid,FlatsInfo[flat][fInt]); SetPlayerPos(playerid, FlatsInfo[flat][fExitx], FlatsInfo[flat][fExity],FlatsInfo[flat][fExitz]); // Warp the player SetPlayerVirtualWorld(playerid,flat+9999); return 1; } }теперь создадим stock stock UpdateFlat(idx) { new text[600]; if(FlatsInfo[idx][fOwned] == 0) { format(text,sizeof(text),"{FF6347} * Квартира * {FFFFFF}\nНомер: {7CFC00}%d{FFFFFF}\nЦена: {7CFC00}%d{FFFFFF}\nУровень: {7CFC00}%d{FFFFFF}\n\nЧтобы купить квартиру, введите {7CFC00}/buyflat{FFFFFF}",idx,FlatsInfo[idx][fValue],FlatsInfo[idx][fLevel]); Update3DTextLabelText(Flat3D[idx], 0xFFFFFFFF, text); DestroyPickup(FlatPickup[idx]); FlatPickup[idx] = CreatePickup(1273, 23, FlatsInfo[idx][fEntrancex], FlatsInfo[idx][fEntrancey], FlatsInfo[idx][fEntrancez], FlatsInfo[idx][fVirtWorld]); } else if(FlatsInfo[idx][fOwned] == 1) { format(text,sizeof(text),"{FF6347} * Квартира * {FFFFFF}\nНомер: {7CFC00}%d{FFFFFF}\nВладелец: {7CFC00}%s",idx,FlatsInfo[idx][fOwner]); Update3DTextLabelText(Flat3D[idx], 0xFFFFFFFF, text); DestroyPickup(FlatPickup[idx]); FlatPickup[idx] = CreatePickup(1272, 23, FlatsInfo[idx][fEntrancex], FlatsInfo[idx][fEntrancey], FlatsInfo[idx][fEntrancez], FlatsInfo[idx][fVirtWorld]); } }теперь ищем public LoadPropertyи после встовляем public LoadFlats() { new arrCoords[17][64]; new strFromFile2[256]; new File: file = fopen("flats.cfg", io_read); if (file) { new idx; while (idx < sizeof(FlatsInfo)) { fread(file, strFromFile2); split(strFromFile2, arrCoords, ','); FlatsInfo[idx][fOwned] = strval(arrCoords[0]); strmid(FlatsInfo[idx][fOwner], arrCoords[1], 0, strlen(arrCoords[1]), 255); FlatsInfo[idx][fEntrancex] = floatstr(arrCoords[2]); FlatsInfo[idx][fEntrancey] = floatstr(arrCoords[3]); FlatsInfo[idx][fEntrancez] = floatstr(arrCoords[4]); FlatsInfo[idx][fExitx] = floatstr(arrCoords[5]); FlatsInfo[idx][fExity] = floatstr(arrCoords[6]); FlatsInfo[idx][fExitz] = floatstr(arrCoords[7]); FlatsInfo[idx][fInt] = strval(arrCoords[8]); FlatsInfo[idx][fVirtWorld] = strval(arrCoords[9]); FlatsInfo[idx][fValue] = strval(arrCoords[10]); FlatsInfo[idx][fLock] = strval(arrCoords[11]); FlatsInfo[idx][fRent] = strval(arrCoords[12]); FlatsInfo[idx][fRentabil] = strval(arrCoords[13]); FlatsInfo[idx][fTakings] = strval(arrCoords[14]); FlatsInfo[idx][fDate] = strval(arrCoords[15]); FlatsInfo[idx][fLevel] = strval(arrCoords[16]); printf("Квартира: [%d] | Владелец: [%s]",idx,FlatsInfo[idx][fOwner]); idx++; } fclose(file); } return 1; }После,в public OnGameModeInit после всех машин и т.д вы увидите вот такую надпись Дом продаётсяу всех по разному,ну что в этом духе,ну так вот после этого встовляем for(new f = 0; f < sizeof(FlatsInfo); f++) { new text[600]; if(FlatsInfo[f][fOwned] == 0) { format(text,sizeof(text),"{FF6347} * Квартира * {FFFFFF}\nНомер: {7CFC00}%d{FFFFFF}\nЦена: {7CFC00}%d{FFFFFF}\nУровень: {7CFC00}%d{FFFFFF}\n\nЧтобы купить квартиру, введите {7CFC00}/buyflat{FFFFFF}",f,FlatsInfo[f][fValue],FlatsInfo[f][fLevel]); Flat3D[f] = Create3DTextLabel(text,0xFFFFFFFF,FlatsInfo[f][fEntrancex], FlatsInfo[f][fEntrancey], FlatsInfo[f][fEntrancez]+1,10,FlatsInfo[f][fVirtWorld],1); FlatPickup[f] = CreatePickup(1272, 23, FlatsInfo[f][fEntrancex], FlatsInfo[f][fEntrancey], FlatsInfo[f][fEntrancez], FlatsInfo[f][fVirtWorld]); pickups++; } else if(FlatsInfo[f][fOwned] == 1) { format(text,sizeof(text),"{FF6347} * Квартира * {FFFFFF}\nНомер: {7CFC00}%d{FFFFFF}\nВладелец: {7CFC00}%s",f,FlatsInfo[f][fOwner]); Flat3D[f] = Create3DTextLabel(text,0xFFFFFFFF,FlatsInfo[f][fEntrancex], FlatsInfo[f][fEntrancey], FlatsInfo[f][fEntrancez]+1,10,FlatsInfo[f][fVirtWorld],1); FlatPickup[f] = CreatePickup(1272, 23, FlatsInfo[f][fEntrancex], FlatsInfo[f][fEntrancey], FlatsInfo[f][fEntrancez], FlatsInfo[f][fVirtWorld]); pickups++; } }в public DateProp добавить сразу после } for(new h = 0; h < sizeof(FlatsInfo); h++) { if (strcmp(playername, FlatsInfo[h][fOwner], true) == 0) { FlatsInfo[h][fDate] = curdate; OnPropUpdate(); } }потом идём в public OnPropUpdate()и в конце будет Sbizz.cfg или Bizz.cfg у всех по разному,после этого встовляем idx = 0; while (idx < sizeof(FlatsInfo)) { new coordsstring[256]; format(coordsstring, sizeof(coordsstring), "%d,%s,%f,%f,%f,%f,%f,%f,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", FlatsInfo[idx][fOwned], FlatsInfo[idx][fOwner], FlatsInfo[idx][fEntrancex], FlatsInfo[idx][fEntrancey], FlatsInfo[idx][fEntrancez], FlatsInfo[idx][fExitx], FlatsInfo[idx][fExity], FlatsInfo[idx][fExitz], FlatsInfo[idx][fInt], FlatsInfo[idx][fVirtWorld], FlatsInfo[idx][fValue], FlatsInfo[idx][fLock], FlatsInfo[idx][fRent], FlatsInfo[idx][fRentabil], FlatsInfo[idx][fTakings], FlatsInfo[idx][fDate], FlatsInfo[idx][fLevel]); if(idx == 0) { file2 = fopen("flats.cfg", io_write); } else { file2 = fopen("flats.cfg", io_append); } fwrite(file2, coordsstring); idx++; fclose(file2); }Далее добавим команды в public OnPlayerCommandText: if(strcmp(cmd, "/flat", true) == 0) { GetPlayerName(playerid, playername, sizeof(playername)); if(PlayerInfo[playerid][pFlatKey] != 255 && strcmp(playername, FlatsInfo[PlayerInfo[playerid][pFlatKey]][fOwner], true) == 0) { ShowPlayerDialog(playerid,50,DIALOG_STYLE_LIST,"Квартира"," - Открыть/Закрыть\n - Продать","Далее","Выход"); } else { SendClientMessage(playerid,COLOR_GREY, "Ошибка: У вас нет квартиры."); return 1; } } if(strcmp(cmd, "/sellflat", true) == 0) { if(IsPlayerConnected(playerid)) { GetPlayerName(playerid, playername, sizeof(playername)); if(PlayerInfo[playerid][pFlatKey] == 255) { SendClientMessage(playerid, COLOR_WHITE, "Ошибка: У вас нет квартиры."); return 1; } if(PlayerInfo[playerid][pFlatKey] != 255 && strcmp(playername, FlatsInfo[PlayerInfo[playerid][pFlatKey]][fOwner], true) == 0) { new flat = PlayerInfo[playerid][pFlatKey]; FlatsInfo[flat][fLock] = 1; FlatsInfo[flat][fOwned] = 0; GetPlayerName(playerid, sendername, sizeof(sendername)); strmid(FlatsInfo[flat][fOwner], "-", 0, strlen("-"), 255); GivePlayerMoney(playerid,FlatsInfo[flat][fValue]); PlayerPlaySound(playerid, 1052, 0.0, 0.0, 0.0); format(string, sizeof(string), "~w~Congratulations~n~ You have sold your property for ~n~~g~$%d", FlatsInfo[flat][fValue]); GameTextForPlayer(playerid, string, 10000, 3); PlayerInfo[playerid][pFlatKey] = 255; //OnPlayerSave(playerid); UpdateFlat(flat); return 1; } else { SendClientMessage(playerid, COLOR_WHITE, "Ошибка: У вас нет квартиры."); return 1; } } return 1; } if(strcmp(cmd, "/buyflat", true) == 0) { if(IsPlayerConnected(playerid)) { new Float:oldposx, Float:oldposy, Float:oldposz; GetPlayerName(playerid, playername, sizeof(playername)); GetPlayerPos(playerid, oldposx, oldposy, oldposz); for(new h = 0; h < sizeof(FlatsInfo); h++) { if(PlayerToPoint(2.0, playerid, FlatsInfo[h][fEntrancex], FlatsInfo[h][fEntrancey], FlatsInfo[h][fEntrancez]) && FlatsInfo[h][fOwned] == 0 && GetPlayerVirtualWorld(playerid) == FlatsInfo[h][fVirtWorld]) { if(PlayerInfo[playerid][pLevel] < FlatsInfo[h][fLevel]) { format(string, sizeof(string), "Ошибка: Вам нужен %d уровень, чтобы купить эту квартиру.", FlatsInfo[h][fLevel]); SendClientMessage(playerid, COLOR_GRAD5, string); return 1; } if((PlayerInfo[playerid][pPhousekey] != 255 && strcmp(playername, HouseInfo[PlayerInfo[playerid][pPhousekey]][hOwner], true) == 0) || (PlayerInfo[playerid][pFlatKey] != 255 && strcmp(playername, FlatsInfo[PlayerInfo[playerid][pFlatKey]][fOwner], true) == 0)) { SendClientMessage(playerid, COLOR_WHITE, "Ошибка: У вас уже есть дом / квартира."); return 1; } if(GetPlayerMoney(playerid) > FlatsInfo[h][fValue]) { PlayerInfo[playerid][pFlatKey] = h; FlatsInfo[h][fOwned] = 1; GetPlayerName(playerid, sendername, sizeof(sendername)); strmid(FlatsInfo[h][fOwner], sendername, 0, strlen(sendername), 255); GivePlayerMoney(playerid,-FlatsInfo[h][fValue]); PlayerPlayMusic(playerid); SetPlayerInterior(playerid,FlatsInfo[h][fInt]); SetPlayerVirtualWorld(playerid,h+9999); SetPlayerPos(playerid,FlatsInfo[h][fExitx],FlatsInfo[h][fExity],FlatsInfo[h][fExitz]); GameTextForPlayer(playerid, "~w~Welcome Flat~n~You can exit at any time by moving to this door and typing /exit", 5000, 3); PlayerInfo[playerid][pInt] = FlatsInfo[h][fInt]; SendClientMessage(playerid, COLOR_WHITE, "Вы купили квартиру!"); SendClientMessage(playerid, COLOR_WHITE, "Используйте /flat для управления ею!"); DateProp(playerid); //OnPlayerSave(playerid); UpdateFlat(h); return 1; } else { SendClientMessage(playerid, COLOR_WHITE, "Ошибка: У вас не хватает денег!"); return 1; } } } } return 1; }После ищем команду /enter и встовляем в неё for(new i = 0; i < sizeof(FlatsInfo); i++) { if (PlayerToPoint(3, playerid,FlatsInfo[i][fEntrancex], FlatsInfo[i][fEntrancey], FlatsInfo[i][fEntrancez]) && GetPlayerVirtualWorld(playerid) == FlatsInfo[i][fVirtWorld]) { //printf("Found House :%d",i); if(PlayerInfo[playerid][pFlatKey] == i || FlatsInfo[i][fLock] == 0) { SetPlayerVirtualWorld(playerid,i+9999); SetPlayerInterior(playerid,FlatsInfo[i][fInt]); SetPlayerPos(playerid,FlatsInfo[i][fExitx],FlatsInfo[i][fExity],FlatsInfo[i][fExitz]); GameTextForPlayer(playerid, "~w~Welcome Kvartira", 5000, 1); PlayerInfo[playerid][pInt] = FlatsInfo[i][fInt]; } else { GameTextForPlayer(playerid, "~r~Locked", 5000, 1); } } }После ищем команду /exit и встовляем туда for(new i = 0; i < sizeof(FlatsInfo); i++) { if(GetPlayerVirtualWorld(playerid) == i+9999) { if (PlayerToPoint(3, playerid,FlatsInfo[i][fExitx], FlatsInfo[i][fExity], FlatsInfo[i][fExitz])) { SetPlayerInterior(playerid,3); SetPlayerVirtualWorld(playerid,FlatsInfo[i][fVirtWorld]); SetPlayerPos(playerid,FlatsInfo[i][fEntrancex],FlatsInfo[i][fEntrancey],FlatsInfo[i][fEntrancez]); } } }Потом в public OnDialogResponse добавим if(dialogid == 50) { if(response) { if(listitem == 0) { for(new i = 0; i < sizeof(FlatsInfo); i++) { if ((PlayerToPoint(3, playerid,FlatsInfo[i][fEntrancex], FlatsInfo[i][fEntrancey], FlatsInfo[i][fEntrancez]) && GetPlayerVirtualWorld(playerid) == FlatsInfo[i][fVirtWorld]) || (PlayerToPoint(3, playerid,FlatsInfo[i][fExitx], FlatsInfo[i][fExity], FlatsInfo[i][fExitz]) && GetPlayerVirtualWorld(playerid) == i+9999)) { if(PlayerInfo[playerid][pFlatKey] == i) { if(FlatsInfo[i][fLock] == 1) { FlatsInfo[i][fLock] = 0; SendClientMessage(playerid, COLOR_WHITE, "Квартира открыта"); PlayerPlaySound(playerid, 1145, 0.0, 0.0, 0.0); return 1; } if(FlatsInfo[i][fLock] == 0) { FlatsInfo[i][fLock] = 1; SendClientMessage(playerid, COLOR_WHITE, "Квартира закрыта"); PlayerPlaySound(playerid, 1145, 0.0, 0.0, 0.0); return 1; } } else { SendClientMessage(playerid, COLOR_GREY, "Это не ваша квартира."); return 1; } } } } else if(listitem == 1) { OnPlayerCommandText(playerid, "/sellflat"); } } else { return 1; } }Потом в public OnPlayerPickUpPickup(playerid, pickupid) добавить if(pickupid == flathouse1[0]) // Квартирный Дом напротив Репортеров (Вход) { SetPlayerPos(playerid, 972.3107,-8.6146,1001.1484); SetPlayerInterior(playerid, 3); PlayerInfo[playerid][pInt] = 3; SetPlayerVirtualWorld(playerid,1); } else if(pickupid == flathouse1[1]) // Квартирный Дом напротив Репортеров (Выход) { SetPlayerPos(playerid, -1966.0192,434.3174,35.1719); SetPlayerInterior(playerid, 0); PlayerInfo[playerid][pInt] = 0; SetPlayerVirtualWorld(playerid,0); } else if(pickupid == flathouse2[0]) // Квартирный Дом напротив Небоскрёпа ЛС (Вход) { SetPlayerPos(playerid, 972.3107,-8.6146,1001.1484); SetPlayerInterior(playerid, 3); PlayerInfo[playerid][pInt] = 3; SetPlayerVirtualWorld(playerid,2); } else if(pickupid == flathouse2[1]) // Квартирный Дом напротив Небоскрёпа ЛС (Выход) { SetPlayerPos(playerid, 329.7834,-1513.7047,36.0391); SetPlayerInterior(playerid, 0); PlayerInfo[playerid][pInt] = 0; SetPlayerVirtualWorld(playerid,0); } else if(pickupid == flathouse3[0]) // Квартирный Дом у Банка ЛС (Вход) { SetPlayerPos(playerid, 972.3107,-8.6146,1001.1484); SetPlayerInterior(playerid, 3); PlayerInfo[playerid][pInt] = 3; SetPlayerVirtualWorld(playerid,3); } else if(pickupid == flathouse3[1]) // Квартирный Дом у Банка ЛС (Выход) { SetPlayerPos(playerid, 1378.8137,-1088.7667,27.0466); SetPlayerInterior(playerid, 0); PlayerInfo[playerid][pInt] = 0; SetPlayerVirtualWorld(playerid,0); }Потом добавим пикапы: flathouse1[0] = CreatePickup(1318, 2, -1962.0586,434.1953,35.1719, 0); pickups++; // Квартирный Дом напротив Репортеров (Вход) flathouse1[1] = CreatePickup(1318, 2, 975.1188,-8.6426,1001.1484, 1); pickups++; // Квартирный Дом напротив Репортеров (Выход) flathouse2[0] = CreatePickup(1318, 2, 328.1443,-1512.3280,36.0325, 0); pickups++; // Квартирный Дом напротив Небоскрёпа ЛС (Вход) flathouse2[1] = CreatePickup(1318, 2, 975.1188,-8.6426,1001.1484, 2); pickups++; // Квартирный Дом напротив Небоскрёпа ЛС (Выход) flathouse3[0] = CreatePickup(1318, 2, 1382.1489,-1088.8043,28.2124, 0); pickups++; // Квартирный Дом у Банка ЛС (Вход) flathouse3[1] = CreatePickup(1318, 2, 975.1188,-8.6426,1001.1484, 3); pickups++; // Квартирный Дом у Банка ЛС (Выход)Чуть не забыл ко всем форвардам добавить forward LoadFlats();и в Public OnGameModeInit добавить LoadFlats();После в enum pInfo добавить pFlatKey,Потом в public OnPlayerRegister(playerid, password[]) dini_IntSet(string, "Flatkey", PlayerInfo[playerid][pFlatKey]);После в public OnPlayerLogin PlayerInfo[playerid][pFlatKey] = dini_Int(string2,"Flatkey");немного ниже в этомже паблике добавить PlayerInfo[playerid][pFlatKey] = 255;и под конец в public OnPlayerConnect добавить PlayerInfo[playerid][pFlatKey] = 255;вот и всё ))Автор Вырезки: Mr_Dave Вырезано из мода Diamond_City Может кому пригодится И вот сам файл с квартирками =) flats.cfg
  8. Итак, в этом уроке вы научитесь делать карты в MTA. Для начала скачаем саму MTA и установим: http://zebra.og-serv...mtasa-1.0.5.exe В установке MTA нет ничего сложного. После установки запускаем её и ждём окончания загрузки. Может выскочить окошко, что нужно обновление, отказываемся. Слева видим пункты меню и тыкаем на "Map Editor". Ждём когда загрузится. После загрузки появится окошко с предложением обучения. Нажимаем "Skip" (то есть пропустить). Начнём работу. Управляем камерой мышкой + кнопки W, A, S, D. Чтобы быстро лететь, удерживая пробел и кнопки полёта. Чтобы медленно лететь Alt и кнопки полёта. Устанавливаем камеру на какое-нибудь положение и нажимаем кнопку F. Сверху по-середине и слева внизу появились кнопки. Чтобы поставить объект, кликаем мышкой на кнопку и рисунком коробки. Мы переключимся в режим выбирания объекта. Слева список объектов. Всех объектов! Так дело не пойдёт, вверху открываем список категорий и выбираем нужную. Чтобы посмотреть на объект, кликаем один раз по названию объекта. Чтобы его выбрать - два раза. Если вы передумали ставить объект, внизу есть кнопка "Canel". А теперь, попробуем поставить какой-нибудь объект. Кликаем два раза на название и видем, что мышка взяла объект, как собачка свою косточку и таскает за собой. Мышкой точное положение объекта врядли с первого раза поставишь. Так вот, выбираем примерное положение на кликаем левой кнопкой мыши один раз. Теперь можно двигать объект клавишами-стрелками. Чтобы быстро его двигать пробел + стрелки. Чтобы медленно Alt + стрелки. Чтобы повернуть объект, Ctrl + стрелки влево-вправо. Чтобы изменить другой угол Ctrl + стрелки вверх вниз. А вот чтобы изменить высоту, в MTA сочитания клавиш нет, так что кликаем два раза на объект и сами подбираем нужную высоту (координата Z). Чтобы клонировать объект Ctrl + клик по объекту. Чтобы удалить - клавиша Delete. После установки первого объекта, ставим второй. Опять открываем список, выбираем нужный объект, подгоняем координаты. Может вы поставили такой маленький объект, что курсор его не видет? Нажимаем на клавишу E (русск. "у"). Выключается так же. Теперь как ставить тачки. Ответ: почти так же, как и объекты, просто выбираем другой пунк в меню (который внизу слева) на которой нарисована машина. И так же выбираем категорию, потом так же ставим. Мышкой ставить тачку проще, чем объект. Но координату угла Y советую не менять, так как в сампе её нету. Чтобы перейти в режим теста, нажмите на клавишу F5. После того, как вы на грув (я так думаю ) поставили объекты и транспорт, сохраняем нашу первую созданную карту. Для этого переходим в фиксированное положение камеры и нажимаем на верхней панели кнопку с дискетой. Набираем название, сохраняем. А теперь самое интересное. Конвентирование объектов в самп. Заходим в папку с МТА в папки: \server\mods\deathmatch\resources\"название вашей сохранённой карты". Теперь открываем файл с расширением ".map", который там находится, блокнотом. Выделяем всё (Ctrl+a) и копируем (Ctrl+C). Заходим на сайт http://www.convertffs.com/ и в "Paste here" вставляем то что вы скопировали из файла map. Настройки input установятся автоматически, а вот Output надо немножко поднастроить. Это зависит от стримера. Если никого нет - CreateObject. Для машин AddStaticVehicle. Потом нажимаем на кнопку "Convert" и получившийся код вставляем в мод/фильтскрипт (паблик OnGameModeInit). Вот и весь урок. Желаю удачи в создании карт! Автор урока -EvgeN 1137. Если будут вопросы - задавайте сюда.
  9. Mr.Brain

    Создание Бинда В Pawno

    Здравствуйте, в этом уроке будет описано, как сделать бинд с помощью павн скриптинга. Для начала откроем любой мод. После нажмём CTRL+F и в появившееся окно вставляем public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)После этого идём в конец паблика и вставляем: if (newkeys == KEY_CROUCH) { OnPlayerCommandText(playerid,"/comanda"); }Теперь разберем все по порядку.KEY_CROUCH - Это кнопка H(р), на это кнопку часто назначают открытие ворот Какая клавиша как обозначается можно узнать здесь: Быстрое и лёгкое нахождение клавиш /comanda - Это ваша любая команда которую вы хотите назначит на эту кнопку Так же есть второй вариант. Так же находим паблик, только теперь вставляем: if (newkeys == KEY_CROUCH) { SendAllClientMessage(playerid,COLOR_GREEEN, "Всем привет!"); }То есть теперь при нажатии клавиши H(р), будет всем игрокам писаться сообщение "Всем привет!"
  10. Всё естественно, что идеальной антирекламы нету как и нету идеального ничего в жизни, всё относительно. Вот пример хорошей антирекламы всех чатов. Ставим данную проверку в паблики OnPlayerCommandText и в OnPlayerText PHP код: new word[256],Index;while(Index < strlen(cmdtext)){word = strtok(cmdtext,Index);if(checkbanan(word)==1 && тут_ваша_проверка_на_админа){banan(playerid,cmdtext);return 0;}} дальше идём в любое свободное место в моде, и объявляем нашу проверку стоками: PHP код: stock checkbanan(word[]) { if( strlen(word)>21) return 0; if( strfind(word,".", true)==-1) return 0; new ip[5][256],index; ip[0] = strtok2(word,index,'.'); ip[1] = strtok2(word,index,'.'); ip[2] = strtok2(word,index,'.'); if(strfind(word,":",true)>0){ ip[3] = strtok2(word,index,':'); ip[4] = strtok2(word,index); } else { ip[3] = strtok2(word,index); valstr(ip[4],0); } if(!IsNumeric2(ip[0])||!IsNumeric2(ip[1])||!IsNumeric2(ip[2])||!IsNumeric2(ip[3])||!IsNumeric2(ip[4]) ||!strlen(ip[0])||!strlen(ip[1])||!strlen(ip[2])||!strlen(ip[3])||!strlen(ip[4]) ||(strval(ip[0])==192&&strval(ip[1])==168) ||(strval(ip[0])==172&&strval(ip[1])>=16&&strval(ip[1])<=31) ||strval(ip[0])==10||(strval(ip[0])==127&&strval(ip[1])==0&&strval(ip[2])==0&&strval(ip[3])==1)) return 0; return 1; } strtok2(string[],&idx,seperator = ' ') { new ret[128], i = 0, len = strlen(string); while(string[idx] == seperator && idx < len) idx++; while(string[idx] != seperator && idx < len) { ret[i] = string[idx]; i++; idx++; } while(string[idx] == seperator && idx < len) idx++; return ret; } stock IsNumeric2(string[]) { for (new i = 0, j = strlen(string); i < j; i++) if (string[i] > '9' || string[i] < '0') return 0; return 1; } stock banan(playerid,bantext[]) { new name[MAX_PLAYER_NAME],string[256];GetPlayerName(playerid,name,24); format(string, 256, "[%d]%s рекламит сервер и забанен за рекламу, введёный им IP: %s",playerid,name,bantext); SendClientMessageToAll(COLOR_YELLOW,string);//это уже сами измените как хотите, зависит от вашего мода и фантазии Ban(playerid); } Вот и всё, очень просто и защита неплохая впринципе!
  11. serega1111

    [Урок] Создание радио на 0.3D

    Приветствую вас пользователи форума, на днях задался вопросом, как урасиво реализовать функции радио в sa-mp 0.3D, и у меня получилось следующее: В начало мода ко всем #define надо добавить PHP код: #define RADIO 3000//Где 3000 это ID диалога Далее мы находим паблик public OnPlayerStateChange(playerid, newstate, oldstate) и вствляем в него: PHP код: if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER) PlayAudioStreamForPlayer(playerid, "http://somafm.com/tags.pls");//если человек в авто то начинает играть радио сюда свое радио, у меня стоит стандатрное if(oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER) StopAudioStreamForPlayer(playerid);//если человек вышел из транспорта, то радио выключается // Добавляем команду /radio PHP код: //Добавляем команду "/radio" if(!strcmp(cmdtext, "/radio", true)) return ShowPlayerDialog(playerid, RADIO, DIALOG_STYLE_LIST, "Выбирите Радио волну:","0-Зайцев FM\n1-Европа +\n2-Maks FM\n3-MeGa Radio\n4-Love Radio\n5-ICE FM\n6-D-FM\n7-Record FM\nОтключить радио", "Ok", "Выход"); Находим паблик public OnPlayerKeyStateChange(playerid, newkeys,oldkeys) и вставляем в него: PHP код: if (newkeys == 262144) OnPlayerCommandText(playerid,"/radio"); //262144 - это id клавиши R Находим паблик public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) и внего вписываеш: PHP код: if(dialogid == RADIO) { if( response) { switch( listitem) { case 0: PlayAudioStreamForPlayer(playerid,"http://www.zaycev.fm:9001/rnb/ZaycevFM(128)"); case 1: PlayAudioStreamForPlayer(playerid,"http://webcast.emg.fm:55655/europaplus128.mp3"); case 2: PlayAudioStreamForPlayer(playerid,"http://radio.maks-fm.ru:8000/maksfm128.m3u"); case 3: PlayAudioStreamForPlayer(playerid,"http://megaradio.radiotelek.ru/megaradio.m3u"); case 4: PlayAudioStreamForPlayer(playerid,"http://stream01.rambler.ru/love64.mp3"); case 5: PlayAudioStreamForPlayer(playerid,"http://icefm.ru/etc/live.m3u"); case 6: PlayAudioStreamForPlayer(playerid,"http://w02-cn01.akadostream.ru:8000/dinamitfm48.mp3"); case 7: PlayAudioStreamForPlayer(playerid,"http://w02-cn01.akadostream.ru:8000/radiorecord128.mp3"); case 8: StopAudioStreamForPlayer(playerid); } } } На счет багов, ошибках пишите в этой теме.
  12. serega1111

    [Урок]Создание статуса

    Здраствуйте хочю поведать новичкам(чаще всего)как же всётаки привезать машину не к фракции не по порядковому номеру а по переменным,и так начнём,рассмотрим пример на машинах грув стрита(покажу как добавить машины и привезать их по переменной к фракции) 1)к forward'ам добавить: PHP код: forward IsAGrooveCar(carid); к new добавить PHP код: new GroveCar[2]; теперь добавляем машины в public OnGameModeInit(скину из своего мода) PHP код: AddStaticVehicleEx(600,2487.8506,-1681.2094,13.0448,2.8373,86,86, 60000); AddStaticVehicleEx(600,2491.5459,-1681.2618,13.0490,359.6013,86,86, 60000); AddStaticVehicleEx(492,2516.4478,-1671.8979,13.6814,62.0043,86,86, 60000); AddStaticVehicleEx(492,2510.7803,-1687.7375,13.3418,45.3245,86,86, 60000); AddStaticVehicleEx(492,2506.0259,-1694.2249,13.3317,0.0002,86,86, 60000); AddStaticVehicleEx(492,2506.6377,-1651.8461,13.4621,317.3195,86,86, 60000); AddStaticVehicleEx(500,2467.2190,-1655.0046,13.4315,90.4295,86,86, 60000); AddStaticVehicleEx(487,2529.4441,-1678.7546,20.1231,5.9486,86,86, 60000); AddStaticVehicleEx(500,2473.1929,-1655.0105,13.4399,91.4332,86,86, 60000); машины мы добавили,но они не привязаны к фракции,перед первой машиной пишим GroveCar[0] = ,перед последней GroveCar[1],получится вот так PHP код: GroveCar[0] = AddStaticVehicleEx(600,2487.8506,-1681.2094,13.0448,2.8373,86,86, 60000); AddStaticVehicleEx(600,2491.5459,-1681.2618,13.0490,359.6013,86,86, 60000); AddStaticVehicleEx(492,2516.4478,-1671.8979,13.6814,62.0043,86,86, 60000); AddStaticVehicleEx(492,2510.7803,-1687.7375,13.3418,45.3245,86,86, 60000); AddStaticVehicleEx(492,2506.0259,-1694.2249,13.3317,0.0002,86,86, 60000); AddStaticVehicleEx(492,2506.6377,-1651.8461,13.4621,317.3195,86,86, 60000); AddStaticVehicleEx(500,2467.2190,-1655.0046,13.4315,90.4295,86,86, 60000); AddStaticVehicleEx(487,2529.4441,-1678.7546,20.1231,5.9486,86,86, 60000); GroveCar[1] = AddStaticVehicleEx(500,2473.1929,-1655.0105,13.4399,91.4332,86,86, 60000); теперь создаём паблик PHP код: public IsAGrooveCar(carid) { if(( carid >= GroveCar[0]) && (carid <= GroveCar[1])) { return 1; } return 0; } в этом паблике машины грув стрита от GroveCar[0] до GroveCar[1],продожаем,необходимо сделать проверку на фракцию при входе в машину идём в public OnPlayerStateChange и добавляем PHP код: if(IsAGrooveCar(newcar)) { if( PlayerInfo[playerid][pMember] == 13||PlayerInfo[playerid][pLeader] == 13) { } else { SendClientMessage(playerid,COLOR_GREY," Вы не из Grove Street"); RemovePlayerFromVehicle(playerid); printf("TEST29");} } 13 - номер фракции,меняем на свободный.Вот и всё) Это привязка машин по переменным
  13. Mr.Brain

    [All] Оптимизация кода

    Здравствуйте, дорогие пользователи GS-Games.Ru, надеюсь вам поможет эта статья иначе я просто напросто потрачу 15 минут своей жизни http://forum.gs-games.ru/public/style_emoticons/default/fuck[1].gif Пожалуй начнём... Для чего вообще требуется оптимизация кода? Оптимизированный код значительно снижает нагрузку на сервер, при онлайне 15-20 человек, конечно это будет не заметно, но при человек 100 тогда уже мод начнёт подлагивать.... 1. Первый вариант оптимизации, Допустим у нас стоит проверка на что-то: if(IsACop(playerid)) { SendClientMessage(playerid, -1, "Ты коп!!!11!!"); return 1; } SendClientMessage(playerid, -1, "Ты не коп!!11!"); Вот этот страшный код годфазера...Оптимизируем его: if(IsACop(playerid)) return SendClientMessage(playerid, -1, "Ты коп!!!11!!"); SendClientMessage(playerid, -1, "Ты не коп!!11!");Вот это незначительно, но снимает нагрузку на сервер))2. Второй способ: Будем оптимизировать OnDialogResponse Вместо кода: if(dialogid == 0) { } if(dialogid == 1) { } Вместо этого можно использовать switch: switch(dialogid) { case 0: case 1: }Тем самым мы так же облегчаем жизнь серверу http://forum.gs-games.ru/public/style_emoticons/default/smile.gif3. Третье самое распространённая ошибка в GF кодах: Не использование повторяющихся обстоятельств SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); Хотя вместо этого можно сделать так: for(new i; i < 10; i++) SendClientMessageToAll(COLOR, " "); Спасибо за внимание, с Вами был ePZuz Специально для GS-Games.Ru При копирование материала ссылка на источник и указание автора обязательна! (с)GS-Games, GCMT
  14. Пишите какие уроки хотите увидеть в этом разделе и в течении 2 двух дней, тот манипуал который вы описали появится здесь... И самое главное всё подробно описывайте, если не будет подробного описания. То ваше сообщение не будет приниматься....
  15. Итак, по сути, этот урок повторение и закрепление 11 урока. Сейчас я покажу, как выдавать Это, пожалуй, самый легкий урок из всех предыдущих. Расставить транспорт можно несколькими способами: Расстановка транспорта с помощью Samp Debug: Для начала запускаем Samp Debug из папки с GTA San Andreas. Как только все загрузится, вы появляетесь Карлом Джонсоном возле надписи Vinewood. Теперь с помощью команды /v вызываем нужную нам машину, например INFERNUS, для этого пишем в чате /v 411 и получаем машину. Если вы не знаете ID машины, которую хотите вызвать, введите /vmenu, и вы попадете в меню выбора транспорта. Садитесь в машину и паркуйте ее там, где вам нужно. После этого, не выходя из машины, вводите команду /save. В директории: Мои документы\GTA San Andreas User Files\Samp\ будет файл savedpositions.txt, с примерно таким содержанием: AddStaticVehicle(411, 322.5014, 303.6906, 999.1484, 269.1425, 0, 0);Функция AddStaticClass может использоваться только внутри автовызываемой функцииOnGameModeInit, в других функциях она работать не будет. Можно расставить транспорт с помощью фильтрскриптов, таких как cars. Данный скрипт прилагается к учебнику. Достаточно ввести ID транспорта, как команда, например /411 и вы окажетесь прямо в машине. Автор Cloud
  16. Lexa

    Проверка на алкоголь

    Вот команда для законников: if(strcmp(cmd,"/bh",true)==0) { if(IsPlayerConnected(playerid)) { new leader = PlayerInfo[playerid][pLeader]; new member = PlayerInfo[playerid][pMember]; if(member==1 || member==2 || member==3 || leader==1 || leader==2 || leader==3)// проверка на фракцию. { tmp = strtok(cmdtext, idx); if(!strlen(tmp)) { SendClientMessage(playerid, COLOR_GREY, "*Используйте: /bh [ид игрока]"); return 1; } giveplayerid = ReturnUser(tmp); if(IsPlayerConnected(giveplayerid)) { if(giveplayerid != INVALID_PLAYER_ID) { if (ProxDetectorS(8.0, playerid, giveplayerid)) { GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer)); GetPlayerName(playerid, sendername, sizeof(sendername)); new text1[20]; if(GetPlayerDrunkLevel(giveplayerid) > 0) { text1 = "| Пьян."; } else { text1 = "| Трезв."; } format(string, sizeof(string), "|__________ %s Проверен на алкоголь__________|", giveplayer); SendClientMessage(playerid, COLOR_WHITE, string); format(string, sizeof(string), "%s.", text1); SendClientMessage(playerid, COLOR_GREY, string); format(string, sizeof(string), "* %s Проверил на алкоголь %s", sendername ,giveplayer); ProxDetector(30.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE); } else { SendClientMessage(playerid, COLOR_RED, "** Игрок далеко от вас!"); return 1; } } } else { SendClientMessage(playerid, COLOR_RED, "** Этот игрок не в игре !"); return 1; } } else { SendClientMessage(playerid, COLOR_RED, "** Вы не законник!"); return 1; } } return 1; }
  17. Краткое руководство по настройке плагина от Инкогнито: 1. Скачаем архив с плагинами и инклюдом. 2. Помещаем папку plugins в папку с вашим сервером 3. Помещаем инклюд streamer.inc в папку с павно, с помощью котрого идет компиляция вашего мода. 4. Открываем ваш мод и в самое начало кода (шапку) вставляем 3 строки. Дефайны упрощают работу с стримером, вам не нужно будет переименовывать функции для добавления новых объектов. #include <streamer> #define CreateObject CreateDynamicObject #define MoveObject MoveDynamicObject 5. Нажимаем клавишу F5, происходит компилирование мода. 6. Приступаем к редактированию server.cfg для подключения плагина во время запуска сервера. Если вы используете оперативную систему поколения linux, то вам нужно ввести в конец вашего server.cfg строку plugins streamer.soЕсли же вы используете оперативную систему поколения windows, то в server.cfg достаточно ввести plugins streamer Лимиты:Стример позволяет использовать до 399 объектов вокруг игрока Автор: Elfuego streamer.rar
  18. ByMeR_OK

    SpeedHack

    В начало мода вставьте: forward Anticheat(); в любое место в моде вставить: public Anticheat() { for(new i = 0; i < GetMaxPlayers(); i++) // Цикл, проверяем всех игроков онлайн { if(IsPlayerConnected(i)) // проверяем подключен ли { if(GetSpeedKM(i) > 260) //Максимальная скорость { SendClientMessage(i, COLOR_LIGHTRED, "Вы кикнуты, причина Speedhack"); // пишем месег Kick(i); // кикаем его } } return 1; } stock GetSpeedKM(playerid) // проверяет скорость { new Float:PosX, Float:PosY, Float:PosZ, Float:PlayerSpeedDistance; GetVehicleVelocity(GetPlayerVehicleID(playerid), PosX, PosY, PosZ); PlayerSpeedDistance = floatmul(floatsqroot(floatadd(floatadd(floatpower( PosX, 2), floatpower(PosY, 2)), floatpower(PosZ, 2))), 170.0); new spe = floatround(PlayerSpeedDistance * 1); return spe; } в public OnGameModeInit SetTimer("Anticheat",2000,1);
  19. Сабвуфер для "Эллегии"[RUS]Автор: [iSS]jumboОписание можно прочесть по ссылке ниже:А я всего сделал перевод для этого скрипта...Скачать: ESubwoofers.pwnESubwoofers.rar
  20. Если вы хорошо поняли прошлый урок, то без труда освоите и этот, поскольку инклуды очень похожие, просто имена функций немного отличаются, но выполняют они одну и ту же функцию. Файл Dini.inc нужно скопировать в папку include в директории с редактором Pawno. В начале вашего скрипта обязательно нужно объявить этот инклуд, также как объявляется инклуд a_samp. Итак, приступим к разбору основных функций mxINI: dini_Create(“filename.ini”); //Создает файл с именем filename.ini в папке scriptfiles. dini_Remove(“filename.ini”); //Удаляет файл dini_Exists(“filename.ini”); //Проверяет, существует ли данный файл (для оператора if)Запись данных в файл: dini_Set(“filename.ini”, "имя ключа", "текст"); // Эта функция записывает текст в ключ. dini_IntSet(“filename.ini”, "имя ключа", "текст"); // Эта функция записывает целое число в ключ. dini_FloatSet(“filename.ini”, "имя ключа", 123456 ); // Эта функция записывает десятичное число в ключ. dini_BoolSet(“filename.ini”, "имя ключа", 3.1416 ); // Эта функция записывает логическое значение в ключ.Чтение данных из файла dini_Get(“filename.ini”, "имя ключа", "текст"); // Эта функция получает текст из ключа. dini_Int(“filename.ini”, "имя ключа", "текст"); // Эта функция получает целое число из ключа. dini_Float(“filename.ini”, "имя ключа", 123456 ); // Эта функция получает десятичное из ключа. dini_Bool(“filename.ini”, "имя ключа", 3.1416 ); // Эта функция получает логическое значение из ключа.Остальные функции dini_Unset(“filename.ini”, "имя ключа"); // Отменяет последнее установленное число на ключ dini_Isset(“filename.ini”, "имя ключа"); // Проверяет было ли установлено данное значение в ключ(для оператора if)Инклуд mxINI это по сути упрощенный инклуд Dini, поэтому они особо не отличаются. Но mxINI не умеет удалять файлы, как это может Dini. Поэтому можно пользоваться mxINI для чтения и записи, а Dini для удаления файлов. В приведенном ниже примере я взял за основу пример из прошлого урока и переделал его под использование Dini. new string[255], PlayerName[32]; new Float:health, money; GetPlayerName(playerid,PlayerName,32); format(string,64,”%s.ini”,PlayerName); new iniFile = dini_Create(string); //Открываем файл dini_Get(iniFile, "Name", PlayerName); //Узнаем имя игрока и записываем его в переменную dini_Int (iniFile, "Money", money); // Узнаем количество денег и записываем в переменную dini_Float(iniFile, "Health", health); // Узнаем количество здоровья и записываем в переменную GivePlayerMoney(playerid,money); SetPlayerHealth(playerid,health);Т.е. переименовал название функции на имена функций Dini.Автор Cloud
  21. В этом уроке я расскажу, как научится работать с include – mxINI. На момент написания этого урока последняя актуальная версия инклуда 0.5. Прежде чем приступить к изучению инклуда, рекомендую его скачать. На основе этого инклуда в основном делают регистрацию на сервере. В этом уроке я не буду показывать вам, как написать простейшую регистрацию на сервере, а всего лишь объясню, как с помощью mxINI происходит запись и чтение из файла. Думаю, выяснив, как работает данный инклуд, вы сами сможете написать простую регистрацию, возможно даже на диалогах, так как урок с диалогами вы уже проходили. Файл mxINI.inc нужно скопировать в папку include в директории с редактором Pawno. В начале вашего скрипта обязательно нужно объявить этот инклуд, также как объявляется инклуд a_samp. Итак, приступим к разбору основных функций mxINI: ini_createFile(“filename.ini”); //Создает файл с именем filename.ini в папке scriptfiles. ini_openFile(“filename.ini”); //Открывает файл ini_closeFile(ID открытого файла); //Закрывает файлЗапись данных в файл: ini_setString(ID файла, "имя ключа", "текст"); // Эта функция записывает текст в ключ. ini_setInteger(ID файла, "имя ключа", 123456 ); // Эта функция записывает целое число в ключ. ini_setFloat(ID файла, "имя ключа", 3.1416 ); // Эта функция записывает десятичное число в ключ.Чтение данных из файла ini_getString(ID файла, "имя ключа", <имя переменной>); // Эта функция записывает текст в переменную из файла. ini_getInteger(ID файла, "имя ключа", <имя переменной>); // Эта функция записывает целое число в переменную из файла. ini_getFloat(ID файла, "имя ключа", <имя переменной>); // Эта функция записывает десятичное число в переменную из файла.Запись в файлДавайте для простого примере с помощью команды, запишем данные игрока: имя, деньги и количество здоровья. Сначала мы создаем 2 переменные, где у нас будут храниться имя игрока и отформатированное сообщение. new string[255], PlayerName[32]; GetPlayerName(playerid,PlayerName,32); format(string,64,”%s.ini”,PlayerName); new iniFile = ini_createFile(string);После переменных мы узнаем имя игрока функцией GetPlayerName. Дальшеформатируем строку, как будет называться файл в который будет производиться запись. В данном случае файл будет называться по имени игрока. Дальше создаем переменную IniFile, которая будет создавать данный файл. Перед тем как записать количество денег и здоровья игрока, нужно сначала их узнать: new money = GetPlayerMoney(playerid); new Float:health = GetPlayerHealth(playerid);Теперь пишем проверку, если файл выдаст ошибку, открыть файл снова. if(iniFile < 0) iniFile = ini_openFile(string);Дальше записываем данные в файл и закрываем его: ini_setString(iniFile, "Name", PlayerName); //Записываем имя игрока ini_setInteger(iniFile, "Money", money); //Записываем количество денег ini_setFloat(iniFile, "Health", health); //Записываем количество здоровья ini_closeFile(iniFile); //Закрываем файлВот так производится запись данных в файл. Запись в файле будет выглядеть примерноследующим образом: Name = Player Money = 1000 Health = 100.0Чтение из файлаЧтение из файла ничем не сложнее записи, все аналогично. Только тут не нужно проверок, условий: if{iniFile < 0), и в переменной iniFile мы не создаем, а уже открываем созданный нами файл. Весь код будет выглядеть следующим образом: new string[255], PlayerName[32]; new Float:health, money; GetPlayerName(playerid,PlayerName,32); format(string,64,”%s.ini”,PlayerName); new iniFile = ini_openFile(string); //Открываем файл ini_getString(iniFile, "Name", PlayerName); //Узнаем имя игрока и записываем его в переменную ini_getInteger(iniFile, "Money", money); // Узнаем количество денег и записываем в переменную ini_getFloat(iniFile, "Health", health); // Узнаем количество здоровья и записываем в переменную ini_closeFile(iniFile); //Закрываем файл GivePlayerMoney(playerid,money); SetPlayerHealth(playerid,health);
  22. В этом уроке я научу вас создавать простые двери, открываемые по команде. Таким же образом вы сможете потом ставить ворота и шлагбаумы. И начну я с фильтр скрипта Ingame Object Editor. (данный скрипт прилагается к учебнику). Почему именно он, когда предлагают много раз MTA Map Editor. Во-первых, это как один из простых способов расставить небольшое количество объектов, если ставить много объектов, на это уйдет больше времени, чем в MTA Map Editor. Во-вторых, это тоже было бы полезно знать. В-третьих, не нужно конвертировать код из map в pwn, все объекты будут в вашем моде вместе с этим фильтр скриптом. Доступ к его опциям имеет только RCON администратор, поэтому вам необходимо будет войти на сервер как RCON администратор. Начнем с создания двери. Войдите на сервер как RCON администратор. Итак, вот место куда мы, например, хотим поставить дверь. Мы можем поставить деревянную дверь с ID = 1491, это дверь, которая открывается когда ее толкаешь, но нам нет смысла сейчас ее ставить, потому что мы делаем закрытую дверь, которую нужно будет открыть по команде. Поставим дверь, например с ID = 1500. Итак, в чате пишем следующую команду /oadd 1500 door. Команда /oadd – добавляет новый объект, через пробел пишется ID объекта и далее имя объекта, любое. Итак, мы создали нашу дверь, но она оказалась в воздухе. Давайте ее опустим. Пишем следующую команду в чат: /omode m_z – эта команда позволит двигать дверь в двух направлениях (вверх или вниз). Дальше садимся на кнопку C и камера переключается на сам объект. Стрелками двигаем дверь вниз к полу. Итак, мы опустили дверь, мы можем снова нажать С, и встать в удобное вам место для обзора объекта и снова сесть. Дальше нам нужно повернуть дверь левее (исходя из рисунка). Пишем туже команду, но уже не m_z а m_xy. Это команда позволит двигать объект во все четыре стороны (вперед, назад, влево и вправо). Таким образом, двигаем дверь в дверной проем. Нам нужно записать куда-нибудь координаты этой двери в положении закрыто. Координаты этой двери находится в scriptfiles/oed/BREAD_OED.txt и выглядеть они будут следующим образом (чтобы не запутаться, после координат написано имя объекта, имеющего эти координаты, его мы не трогаем): 1500,371.234283,166.662429,1007.383850,0.000000,0.000000,0.000000,1Итак, мы записали координаты в безопасное место. А теперьповернем дверь в положение открыто. Чтобы повернуть дверь, мы все также используем команду /o_mode, только теперь вместо m_xy пишем r_z. И поворачиваем дверь в такое положение: Теперь снова записываем те же координаты двери в положении закрыто. В координатах ничего не изменилось, кроме предпоследней цифры. 1500,371.234283,166.662429,1007.383850,0.000000,0.000000,93.000000,1/o_mode r_z – позволяет нам вращать объект таким образом, чтобы дверь открывалась изакрывалась. Есть также r_xy – с помощью, которой уже вращаем дверь в другом направлении. Запомните m_z и m_xy – это перемещение по осям: z и xy, а r_z и r_xy – это вращение по тем же осям. Итак, мы получили координаты закрытой и открытой двери. Теперь мы можем удалить этот объект, т.к. у нас есть его координаты. Удаляем его командой /odel [имя объекта] в данном случае имя объекта – door, значит, пишем /odel door. Удаляем мы его для того, чтобы у нас не получилось 2 копии двери, т.к. одну дверь мы вставим в мод. Прежде чем приступить к делу объясню ниже приведенные цифры. Первая цифра означает ID модели, следующие 3 цифры это координаты положения объекта, далее идут 3 цифры это координаты вращения объекта, последняя цифра это видимость объекта. 1500,371.234283,166.662429,1007.383850,0.000000,0.000000,93.000000,1Итак, приступим к написанию команды. Сначала в начале скрипта мы объявляемглобальную переменную, например door. Затем внутри автовызываемой функции OnGameModeInit – мы присваиваем этой переменной, созданный объект. cpd = CreateObject(1500,371.234283,166.662429,1007.383850,0.000000,0.000000,0.000000,300.0);Видимость мы ставим 300.0, иначе вы будете видеть дверь, только подойдя к ней вплотную.Затем пишем две команды, одну для открытия двери, другую для закрытия: if(strcmp("/open", cmdtext, true, 10) == 0) { SetObjectRot(cpd,0.000000,0.000000,93.000000); return 1; } if(strcmp("/close", cmdtext, true, 10) == 0) { SetObjectRot(cpd,0.000000,0.000000,0.000000); return 1; }В функции мы указывает координаты вращения, т.к. мы будем вращать объект.Недостаток этого скрипта только в том, что дверь открывается мгновенно. Все из-за того, что в функции SetObjectRot которая устанавливает координаты вращения объекта, нет последнего аргумента speed, который есть в функции MoveObject. MoveObject – передвигает объекты в указанное место и так как у него есть аргумент speed, передвигает он объекты плавно. На его основе делают выдвижные двери. Так вот, давайте сделаем раздвижные двери. Естественно нашу дверь нужно подвинуть немного вперед в дверной проем, чтобы, когда дверь открывалась, ручки двери не торчали из стены. Т.е мы заново получаем координаты открытой и закрытой двери. И теперь мы из полученных координат берем координаты положения, а не координаты вращения. if(strcmp("/open", cmdtext, true, 10) == 0) { MoveObject (cpd,372.531341,166.374206,1007.370971,2.0); return 1; } if(strcmp("/close", cmdtext, true, 10) == 0) { MoveObject(cpd,371.238067,166.374206,1007.370971,2.0); return 1; }Вот в принципе и все. Автор Cloud
  23. Devin Coleman

    Урок №22 – Запись в файл

    В этом уроке мы переходим к разбору третьего стиля диалога: DIALOG_STYLE_LIST. Давайте рассмотрим данный стиль диалога на следующем примере. Допустим нам нужно командой, вызвать меню со списком оружия на выбор. Создаем простейшую команду и внутрь ее пишем функцию вызова диалога. Так как это будет список, нам нужно использовать \n – переход на новую строчку. Т.е. мы пишем название пункта \n название пункта и снова \n. if (strcmp("/weaponlist", cmdtext, true, 10) == 0) { ShowPlayerDialog(playerid,0,DSL,"Список оружия»,«Кольт\nКольт с глушителем\nПустынный орел", "Выбор", "Отмена"); return 1; }Диалог будет выглядеть следующим образом:Перед тем как написать функцию для этого диалогового окна, давайте посмотрим на следующую конструкцию приведенную ниже. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == 0) { if(listitem == 1) //Если был выбран 1 пункт списка { //Выполнить этот код } if(listitem == 2) //Если был выбран 2 пункт списка { //Выполнить этот код } } return 1; }Вот так должен выглядеть код для данного стиля диалога. Тут мы проверяем значениеlistitem, т.е. пункта списка которого мы выберем в диалоге. listitem = 1 – это кольт, значит, в условную конструкцию listitem == 1 мы должны вписать функцию GivePlayerWeapon, чтобы дать оружие игроку. if(listitem == 1) //Если был выбран 1 пункт списка { GivePlayerWeapon(playerid,22,100); //Дать игроку кольт и 100 патронов }То же самое делаем и для остальных listitem. Вписываем ту же строчку, только вместо 22,пишем следующее: 23 – для кольта с глушителем, 24 – для пустынного орла (эти цифры, это ID модели этого оружия). ID модели смотрите на странице «ID оружия». Вообще, приведенный выше пример, очень схож с оператором switch, т.к. мы проверяем значение одного аргумента и в зависимости от этого значения выполняем действие. Тоесть, это все можно заменить на оператор switch, таким образом: public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == 0) { switch(listitem) { case 1: //Если был выбран 1 пункт списка { //Выполнить этот код } case 2: //Если был выбран 1 пункт списка { //Выполнить этот код } } } return 1; }Но все же, если вы хорошо не усвоите этот урок, лучше этим примером не пользоваться Автор Cloud
  24. В этом уроке мы переходим к разбору второго стиля диалога: DIALOG_STYLE_INPUT. Работать с данным стилем диалога будет сложнее по сравнению с остальными стилями диалогов, т.к. тут есть поле ввода. Начнем с простого примера: мы командой вызовем диалоговое окно, введем текст и данный текст отправиться всем игрокам в чат. Имя игрока видно не будет, сообщение анонимное. Итак, приступим к созданию диалога: ShowPlayerDialog(playerid,0,DSI,"Отправить сообщение всем","Введите текст сообщения","ОК","Отмена");Данную строку я думаю, вы уже догадались, что ее нужно вписать внутрь готовой команды.Я все также использовал константу DSI из прошлого урока, чтобы не писать длинное название стиля диалога, поэтому не забудьте ее добавить в ваш скрипт. #define DSI DIALOG_STYLE_INPUTИтак, диалоговое окно мы создали, и оно будет выглядеть следующим образом.Приступим к написанию функции для этого диалога. Как и в прошлом уроке, внутрь функции OnDialogResponse, пишем условную конструкцию проверки на вызов диалога с ID = 0. Внутрь этой условной конструкции пишем еще одну, проверку на нажатие кнопки. Дальше внутри этой проверки будет еще одна проверка на то, что поле ввода у нас содержит какие-либо символы. Ведь мы же не можем отправить пустой текст. Условная конструкция будет такая: if(!strlen(inputtext)) { }else{ }Данную условную конструкцию мы пишем внутри условной конструкции if(response). Атеперь я вам объясню, что значит strlen и inputtext: Strlen – возвращает количество символов в строке. Inputtext – этот аргумент содержит в себе текст, который мы вводим в поле ввода. В общем, думаю, вам будет все понятно, посмотрев нижеприведенный готовый скрипт, но все же я вам кратко его объясню на всякий случай. Сначала идет проверка на вызов диалогового окна с ID = 0. Мы данное окно вызывали функцией ShowPlayerDailog(playerid,0…); - я специально выделил цифру, это dialogid. После проверки, внутри идет еще одна проверка на нажатие кнопки. Если нажата кнопка 1, т.е. кнопка «ОК», идет следующая проверка на то, что в поле ввода есть какой-либо текст. Если он есть, функция SendClientMessage отправляет в чат значение аргумента inputtext, т.е то что игрок введет в поле ввода диалогового окна. Если игрок не введет в поле ввода ничего, функция SendClientMessage отправит в чат сообщение с ошибкой, о том что текст сообщения не был введен в поле ввода. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == 0) { if(response) //Если была нажата 1 кнопка { if(!strlen(inputtext)){ //Если в поле не был введен текст при отправке SendClientMessage(playerid,COLOR_RED,"Вы не написали текст сообщения в поле ввода"); return 1; }else{ SendClientMessage(playerid,COLOR_WHITE,inputtext); } } } return 1; }Если вы поняли этот урок, тогда переходим к следующему. Автор Cloud
  25. В дальнейших уроках мы рассмотрим все типы диалогов и работу с ними. Для начала я ознакомлю вас со всеми диалогами, а затем в каждом уроке мы будем рассматривать по каждому типу диалога. Итак, приступим к теории. Диалоги бывают трех типов: 0 - DIALOG_STYLE_MSGBOX - обычный диалог с 2мя кнопками, 1 - DIALOG_STYLE_INPUT - диалог с полем для ввода, 2 - DIALOG_STYLE_LIST - список из нескольких элементов. Вызывается диалоговое окно функцией ShowPlayerDialog, структура функции такая: ShowPlayerDialog(playerid,<ID диалога>,<ID стиля>,<Название>,<Текст>,<Первая кнопка>,<Вторая>);Обычно, чтобы не запоминать цифры и не писать длинное название стилей диалогов, язаменяю их такими константами: #define DSL DIALOG_STYLE_LIST #define DSI DIALOG_STYLE_INPUT #define DSM DIALOG_STYLE_MSGBOXДля написания основного текста диалогового окна вы можете использовать:\b backspaсe \f Form feed \n переход на новую строку \r возврат каретки \' одиночная кавычка \" двойные кавычки \? вопросительный знак Итак, переходим к практике или к разбору первого стиля: DIALOG_STYLE_MSGBOX. Рассмотрим обычный пример: Мы вводим команду, и появляется диалоговое окно с запросом о подтверждении выполнения команды. Для начала мы напишем скрипт простейшей команды в автовызываемую функцию OnPlayerCommandText. if (strcmp("/test", cmdtext, true, 10) == 0) { return 1; }Затем с помощью функции ShowPlayerDialog мы вызовем данное диалоговое окно. Так каквызывать меню мы будем с помощью команды, то и пишем данную функцию, приведенную ниже внутри нее. ShowPlayerDialog(playerid,0,DSM,"Подтверждение","Вы точно хотите выполнить команду","Да","Нет");Цифра 0 – это идентификатор (ID) диалога, у каждого диалога свой ID. Послеидентификатора пишем название стиля диалога, но я заменил его константой, поэтому я написал DSM (DIALOG_STYLE_MSGBOX). После стиля пишем название диалога. Далее пишем текст диалога и название первой и второй кнопки. В общем, код будет выглядеть следующим образом: if (strcmp("/test", cmdtext, true, 10) == 0) { ShowPlayerDialog(playerid,0,DSM,"Подтверждение","Вы точно хотите выполнить команду","Да","Нет"); return 1; }Но данное диалоговое окно работать не будет, если мы не напишем для него функцию.Допустим, наша команда выдаст в чат всю информацию об игроке, т.е при нажатии кнопки «Да» все так и будет, но при нажатии кнопки «Нет», мы выдадим сообщение красным цветом о том что данная команда не была выполнена. Писать функцию диалогового окна мы будем в автовызываемой функции OnDialogResponse. Сначала внутри функции мы напишем условную конструкцию, которая будет проверять, что данное диалоговое окно было вызвано. Код условия такой: if(dialogid == 0) { }Условие проверяет: было ли вызвано диалоговое окно с ID = 0. Внутрь этой условнойконструкции добавляем еще одно условие: if(response) { }else{ }Условие проверяет, была ли нажата первая кнопка, если нажата вторая кнопка, товыполняется код после else. Внутри этой условной конструкции для первой кнопки мы пишем следующий код. if(response) { new string[128]; //Переменная с основным текстом диалога new plname[MAX_PLAYER_NAME]; //Переменная с именем игрока new money; //Переменные для хранения кол-ва наличных денег игрока new Float: health, Float: armor; //Переменные для хранения кол-ва здоровья и брони игрока GetPlayerName(playerid,plname,MAX_PLAYER_NAME); //Записываем имя игрока в переменную plname money = GetPlayerMoney(playerid); //Записываем деньги игрока в переменную money и т.д. GetPlayerHealth(playerid,health); GetPlayerArmour(playerid,armor); format(string,sizeof(string),”Игрок: %s(ID:%d). Деньги: %d $.\n Здоровье: %.2f\n Броня: %.2f”,plname,playerid,money,health,armor); ShowPlayerDialog(playerid,1,DSM,"Информация об игроке",string,"ОК",""); }else{Сначала мы создаем все необходимые переменные, а потом получаем данные и сразу же ихзаписываем их во всех переменные. Обратите внимание на функцию GetPlayerMoney, в скобках она имеет всего один аргумент (playerid), в отличие от других, и она возвращает количество денег игрока. Поэтому мы присваиваем переменной money, эту функцию, которая возвратит значение, которое и будет значением этой переменной. Еще обратите внимание на %.2f, я мог бы использовать просто %f, как показано в таблице. Точка и цифра означает, сколько чисел должно быть после запятой у десятичного числа. Дальше мы форматируем сообщение, после чего вызываем новое диалоговое окно с новым ID. Обратите внимание, что имя второй кнопки не указано, в таком случае, эта кнопка просто будет отсутствовать в диалоге. А вместо основного текста мы подставляем переменную string в которой уже есть готовое отформатированное сообщение. Вернемся к условию, если будет нажата вторая кнопка в первом диалоге, тут все просто без объяснений в else пишем: SendClientMessage(playerid,COLOR_RED,"Команда отменена");Вот в принципе и все, В следующем уроке мы рассмотрим другой стиль диалога. Переходимк следующему уроку. Автор Cloud
×

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

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