Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 8 из 8
  1. #1
    Аватар для Seviel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2016
    Адрес
    Казахстан
    Сообщений
    148
    Репутация:
    26 ±

    Система домов для самых маленьких

    Доброго времени суток дамы и господа.
    Сегодня я покажу как реализовать простенькую систему домов. UPD: 04.01.2017

    Как будет работать
    При запуске сервера будет загружаться две таблицы, в одной будет хранится информация о доме(нашем случае id, координаты входа, интерьер и владелец), а вторая таблица будет хранить информацию о интерьере(id, координаты выхода, интерьер, название). Сначала будет загружаться таблица с интерьерами, а после таблица с домами. В таблице с домами есть поле интерьер, в этом поле хранится id из таблицы с интерьерами.

    Что нам нужно
    А нужно нам 3 инклуда(с плагинами):
    PHP код:
    #include <a_samp> 
    #include <a_mysql> // - У меня R39-2
    #include <dc_cmd> 
    mysql: https://github.com/pBlueG/SA-MP-MySQL/releases
    dc_cmd: http://pro-pawn.ru/showthread.php?10...2-8-(23-03-14)

    Поля в таблице
    Таблица с домами имеет следующие поля:
    id integer AUTO_INCREMENT
    X double
    Y double
    Z double
    interior integer(11)
    owner varchar(24)
    а таблица с интерьерами
    id integer AUTO_INCREMENT
    X double
    Y double
    Z double
    interior integer(11)
    caption varchar(64)
    Заполненную таблицу с интерьерами вы можете скачать здесь(не все интерьеры)

    Переменные и константы
    PHP код:
    #define MAX_HOUSES 200 // - Максимальное количество домов.
    #define MAX_INTERIORS 20 // - Максимальное количество интерьеров
    new connection// - id подключения к базе данных.
    enum hInfo
    {
        
    id// - id дома
        
    Float:enterX// - координаты входа
        
    Float:enterY
        
    Float:enterZ
        
    interior// - Интерьер
        
    owner[25// - Владелец
    }
    new 
    House[MAX_HOUSES][hInfo]; // - Массив со всеми домами.
    enum iInfo
    {
        
    id// - id интерьера
        
    Float:enterX// - координаты входа
        
    Float:enterY
        
    Float:enterZ
        
    interior// - Интерьер
        
    caption[65// - Название
    }
    new 
    Int[MAX_HOUSES][iInfo];
    new 
    HousesInts// - Переменные хранящие количество домов
    new housePickupXhousePickupYhousePickupZ// - Переменные хранящие позицию входа при созданий дома 

    Подключение к базе данных и загрузка таблиц
    Перейдем к OnGameModeInit()
    PHP код:
    connection mysql_connect(const host[], const user[], const database[], const password[]); 
     Пояснение
    const host[]: IP, на котором расположена База Данных
    const user[]: логин пользователя для доступа к Базе Данных
    const database[]: имя Базы Данных
    const password[]: пароль, для подключения к Базе Данных

    PHP код:
    mysql_function_query(connection"SELECT * FROM `interiors`"true"LoadInts""");
    mysql_function_query(connection"SELECT * FROM `houses`"true"LoadHouses"""); 
    houses и interiors - это таблицы
    LoadHouses и LoadInts - это паблики для обработки.
    Добавьте его конец мода.
    PHP код:
    forward LoadInts(); 
    public 
    LoadInts()
    {
        new 
    row1row2;
        
    cache_get_data(row1row2);
        if(
    row1
        {
            for(new 
    irow1i++)  // перебираем каждую строку из выборки
            
    {
                
    Int[i][id] = cache_get_field_content_int(i"id"); // переносим данные из бд в массив
                
    Int[i][enterX] = cache_get_field_content_float(i"X");
                
    Int[i][enterY] = cache_get_field_content_float(i"Y");
                
    Int[i][enterZ] = cache_get_field_content_float(i"Z");
                
    Int[i][interior] = cache_get_field_content_int(i"interior");
                
    cache_get_field_content(i"owner"Int[i][caption], connect_mysql64);
                
    Ints++; // увеличиваем значение переменной при каждой итерации
            
    }
            
    printf("Загружено интерьеров: %d"Ints); // выводим в консоль сколько домов было загружено
        
    }
         else
         {
             print(
    "Интерьеры не были загружены!"); // выводим в консоль ошибку
         
    }
        return 
    true;
    }
    forward LoadHouses(); 
    public 
    LoadHouses()
    {
        new 
    row1row2;
        
    cache_get_data(row1row2);
        if(
    row1
        {
            for(new 
    irow1i++)  // перебираем каждую строку из выборки
            
    {
                
    House[i][id] = cache_get_field_content_int(i"id"); // переносим данные из бд в массив
                
    House[i][enterX] = cache_get_field_content_float(i"X");
                
    House[i][enterY] = cache_get_field_content_float(i"Y");
                
    House[i][enterZ] = cache_get_field_content_float(i"Z");
                
    House[i][interior] = cache_get_field_content_int(i"interior");
                
    cache_get_field_content(i"owner"House[i][owner], connect_mysql24);
                
    CreateDynamicPickup(1913223House[i][enterX], House[i][enterY], House[i][enterZ], -1); // создаем пикап входа
                    
    new House[i][interior];
                
    CreateDynamicPickup(1913223Int[h][enterX], Int[h][enterY], Int[h][enterZ], -1); // создаем пикап выхода
                
    Houses++; // увеличиваем значение переменной при каждой итерации
            
    }
            
    printf("Загружено домов: %d"Houses); // выводим в консоль сколько домов было загружено
        
    }
         else
         {
             print(
    "Дома не были загружены!"); // выводим в консоль ошибку
         
    }
        return 
    true;


    Делаем вход и выход
    В OnPlayerKeyStateChange добавляем:
    PHP код:
    if(newkeys == KEY_WALK// проверяем нажатие кнопки
    {
        for(new 
    i!= Housesi++) 
        {
            new 
    House[i][interior];
            if(
    IsPlayerInRangeOfPoint(playerid1.0House[i][enterX], House[i][enterY], House[i][enterZ])) //проверка расстояния к пикапу входа
            
    {
                
    SetPlayerPos(playeridInt[h][enterX], Int[h][enterY], Int[h][enterZ]); // отправляем игрока на пикап выхода 
                
    SetPlayerInterior(playeridInt[h][interior]); // устанавливаем игроку интерьер
                
    SetPlayerVirtualWorld(playeridHouse[i][id]); // Чтобы один интерьер можно было использовать для нескольких домов
                
    break; // Выходим из цикла
            
    }
            if(
    IsPlayerInRangeOfPoint(playerid1.0Int[h][enterX], Int[h][enterY], Int[h][enterZ]))  // проверка на расстояние к пикапу выхода
            
    {
                
    SetPlayerPos(playeridHouse[i][enterX], House[i][enterY], House[i][enterZ]); // отправляем на пикап входа
                
    SetPlayerInterior(playerid0); // устанавливаем 0 интерьер игроку
                
    SetPlayerVirtualWorld(playerid0); // возвращаем игрока в 0 виртуальный мир
                
    break;
            }
        }


    Делаем команду добавления дома
    Команда по добавлению домов, состоит из двух частей. Первая устанавливает точку входа, второя выбирает интерьер.
    В конец мода:
    PHP код:
    CMD:addhouse(playerid)
    {
        if(
    /*ваша проверка на админки*/) < 5) return true;
        
    GetPlayerPos(playeridhousePickupXhousePickupYhousePickupZ); // получаем координаты игрока
        
    SetPVarInt(playerid"addHouse"1); // создаем PVar
        
    SendClientMessage(playerid, -1"Вы установили точку входа, выберите интерьер из списка");
        for(new 
    iInteriori++)
        {
        
    strcat(stringInt[i][iCaption]);
            
    strcat(string"\n");
        }
        
    SPD(playerid8DSL"Интерьеры"string"Выбрать""Выход");
        return 
    true;

    и в OnDialogResponse делаем восьмой диалог(у меня switch поэтому case, если у вас на if то замените case 8: на if(dialogid == 8))
    PHP код:
    case 8:
    {
        if(!
    response) return true;
        static 
    new_str[] = "INSERT INTO `houses` (`id`,`X`,`Y`,`Z`,`interior`,`owner`) VALUES (NULL,'%f','%f','%f','%d','%s')";
        new 
    string[sizeof(new_str)+MAX_PLAYER_NAME+62];
        
    GetPlayerName(playeridstringsizeof(string)); // Получаем имя игрока
        
    mysql_format(connect_mysqlstringsizeof(string), new_strhousePickupXhousePickupYhousePickupZlistitemstring);
        
    mysql_function_query(connect_mysqlstringfalse"""");
        
    SCM(playerid, -1"Вы создали дом!");


    Вывод
    Я показал пример, как по мне хороший, а вы как хотите так и делайте. Не нравится напишите, нравится напишите.
    Последний раз редактировалось Seviel; 04.01.2017 в 13:52.

  2. #2
    Аватар для Wise
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.10.2014
    Сообщений
    148
    Репутация:
    37 ±
    Урок предусматривает разъяснение всех функций. Что, куда, зачем?
    А у тебя получился обычный мануал. Пихаем туда, пихаем сюда...
    Pawn - странный предмет. Вроде понимаешь, а вроде бы нет.

  3. #3
    Аватар для Seviel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2016
    Адрес
    Казахстан
    Сообщений
    148
    Репутация:
    26 ±
    Цитата Сообщение от Wise Посмотреть сообщение
    Урок предусматривает разъяснение всех функций. Что, куда, зачем?
    А у тебя получился обычный мануал. Пихаем туда, пихаем сюда...
    Да с разделом я накосячил, когда начинал писать думал буду разъяснять, но потом лень стало.

  4. #4
    Аватар для middlematt
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.01.2016
    Сообщений
    40
    Репутация:
    7 ±
    Версию MySQL хотя-бы указал

  5. #5
    Аватар для HarrWe
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.05.2016
    Сообщений
    144
    Репутация:
    11 ±
    100% есть баг, что когда ты выходишь из инта тебя спавнит не у входа в дом, а в последнем доме к которому принадлежит данный инт, поэтому нужно проверять при выходе ID дома.

  6. #6
    Аватар для Seviel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2016
    Адрес
    Казахстан
    Сообщений
    148
    Репутация:
    26 ±
    Цитата Сообщение от middlematt Посмотреть сообщение
    Версию MySQL хотя-бы указал
    Хорошо укажу.
    Цитата Сообщение от HarrWe Посмотреть сообщение
    100% есть баг, что когда ты выходишь из инта тебя спавнит не у входа в дом, а в последнем доме к которому принадлежит данный инт, поэтому нужно проверять при выходе ID дома.
    Вы проверяли?

  7. #7
    Аватар для Skyline
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.01.2014
    Адрес
    Россия
    Сообщений
    304
    Репутация:
    2 ±
    Ну как то не впечатлило. Начал хорошо....

  8. #8
    Аватар для 123
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2014
    Сообщений
    93
    Репутация:
    8 ±
    Версия MySQL указана R41-2, хотя в коде используются R39. Ясно, понятно..

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •