Форум Pawn.Wiki - Воплоти мечту в реальность!: Система мебели в доме. - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

  • (6 Страниц) +
  • 1
  • 2
  • 3
  • Последняя »
  • Вы не можете создать новую тему
  • Тема закрыта

[ Scr ][ All ]
Система мебели в доме. Система мебели + Система домов.
Оценка: ***** 1 Голосов

#1
Пользователь офлайн   swlm 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию
Всех приветствую, решил написать систему мебели с полного нуля, а так-же систему домов, отдельное спасибо Perdolinka, за то, что объяснил как реализовать мою задумку.

Чуть-чуть информации:
В данной системе 2 системы, а точнее вторая система это - система домов, так, как без неё не будет работать система мебели.
Создать дом: /addhouse.
Добавить мебель в дом: /addfurniture.
Открыть меню дома: /hmenu.

Плюсы/Минусы системы:
+ Создание дома. Интерьер на выбор.
+ Возможность добавлять мебель в дом прямо из игры.
+ Возможность добавлять дом прямо из игры.
+ Возможно посмотреть в дверной глазок дома.
+ Возможность продать мебель в своём доме.
+ Возможность хранить предметы внутри дома, то-есть в шкафу. (см. /hmenu)

Зависимые плагины/библиотеки. [Показать]


Начало. [Показать]


Команды. [Показать]


Диалоги. [Показать]


Функции/Стоки [Показать]


Структура таблицы домов. [Показать]


Структура таблицы мебели. [Показать]


Пояснение за некоторые функции. [Показать]


Ну вот и в принципе всё. По поводу моих макросов, начиная от #define SetHouseID(%0) hInfo[%0][hID], заканчивая - #define SetHouseLock(%0) hInfo[%0][hLock]; Даже не понимаю зачем я сделал такое получение данных из массива, наверное, мне делать было нечего, и я это решил сделать так, я знаю, что эти макросы бессмысленны, и они почти ничего не делают по сравнению например с #define GetHouseInterior(%0) hInfo[%0][hInterior], и #define SetHouseInterior(%0) hInfo[%0][hInterior], ибо суть то одна и та-же.

Проверял работа-способность этой системы, никаких багов не заметил, можете взять к себе на доработку.

Критика приветствуется, а так-же советы.

Это только первая версия моей системы мебели, в дальнейшем буду добавлять что-то, исправлять.

Обновления:


Видео обзор системы домов:


(Зеркало на видео: Яндекс.Диск, MEGA)

Сообщение отредактировал Romzes: 21 августа 2023 - 11:47
Причина редактирования: fix

5

#2
Пользователь онлайн   21th year 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию
Тогда уж оставь и SQL запрос для создания базы..
0

#3
Пользователь онлайн   21th year 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию
Могу заметить много скобок, которых можно было бы и избежать
Раз выбираешь и выкладываешь, то лучше убери SCM и замени как надо)

new hLockLabel[2][32] = {
    { "ОТКРЫТ" },
    { "ЗАКРЫТ" }
};

Бро, 32 массива очень много!

string[] = "INSERT INTO `furniture` (`house_id`, `object`, `x`, `y`, `z`, `rx`, `ry`, `rz`) VALUES ('%d', '%d', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0')",

По логике, x,y,z,rx,ry,rz можно вовсе убрать, установив значение по умолчанию 0.0

И вот такое, это - косытль, ты - лучше передай туда значение дома
Iter_Add(iHouses, Iter_Free(iHouses));


SendAdminsMessage - ???

Сообщение отредактировал 21th year: 06 июля 2023 - 23:43

1

#4
Пользователь офлайн   swlm 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщения21th year (06 июля 2023 - 23:36) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


Да, я сейчас всё поправляю, уже заметил свои ошибочки, щас всё поправлю, насчёт значения дома, не особо тебя понял, переменную из цикла?

Сообщение отредактировал DigitalOneThe: 06 июля 2023 - 23:48

0

#5
Пользователь онлайн   21th year 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию
forward LoadHouses();
public LoadHouses() {
    new rows, count;
    cache_get_row_count(rows);
    
    new hLabelText_NO_OWNER[] = 
        "\
            {FFFFFF}* Дом продаётся * \n\
            {FFFFFF}Номер дома: {6fa8dc}[ #-%d ] \n\
            {FFFFFF}Гос. цена: {8fce00}[ %d $] \n\
            {FFFFFF}Замок: {8fce00}[ ОТКРЫТ ] \n\
            {ffd966}[ Для приобретения или входа, нажмите ALT. ] \n\
        "
    ;
    new hLabelText_OWNER[] = 
        "\
            {FFFFFF}Владелец дома: {ffe599}[ %s ] \n\
            {FFFFFF}Номер дома: {6fa8dc}[ #-%d ] \n\
            {FFFFFF}Гос. цена: {8fce00}[ %d $] \n\
            {FFFFFF}Замок: {8fce00}[ %s ] \n\
            {ffd966}[ Для входа, нажмите ALT. ] \n\
        "
    ;
    
    if (rows) {
        new 
            string[] = "SELECT * FROM furniture WHERE house_id = '%d'",
            result_string[sizeof (string) + (-2+8)]
        ;    
        for (new i; i < rows; i++) {
            count++;
            cache_get_value_name_int(i, "id", SetHouseID(i));
            cache_get_value_name_int(i, "interior", SetHouseInterior(i));
            cache_get_value_name_int(i, "cost", SetHouseCost(i));
            cache_get_value_name_int(i, "lock", SetHouseLock(i));
            cache_get_value_name(i, "owner", SetHouseOwner(i));
            cache_get_value_name_float(i, "enter_x", SetHouseEnterX(i));
            cache_get_value_name_float(i, "enter_y", SetHouseEnterY(i));
            cache_get_value_name_float(i, "enter_z", SetHouseEnterZ(i));
            cache_get_value_name_float(i, "enter_x_pickup", SetHouseEnterXPickup(i));
            cache_get_value_name_float(i, "enter_y_pickup", SetHouseEnterYPickup(i));
            cache_get_value_name_float(i, "enter_z_pickup", SetHouseEnterZPickup(i));
            cache_get_value_name_float(i, "exit_x", SetHouseExitX(i));
            cache_get_value_name_float(i, "exit_y", SetHouseExitY(i));
            cache_get_value_name_float(i, "exit_z", SetHouseExitZ(i));
            format(result_string, sizeof(result_string), string, GetHouseID(i));
                    mysql_tquery(dbHandle, result_string, "OnLoadFurniture", "d", GetHouseID(i));    
            
            CreatePickup(19132, 24, GetHouseEnterXPickup(i), GetHouseEnterYPickup(i), GetHouseEnterZPickup(i), 0);
            CreatePickup(19132, 23, GetHouseExitX(i), GetHouseExitY(i), GetHouseExitZ(i), GetHouseID(i));
            
            Create3DTextLabel("{ffd966}[ ВЫХОД ]", -1, GetHouseExitX(i), GetHouseExitY(i), GetHouseExitZ(i), 7.0, GetHouseID(i), 1);
            
            Iter_Add(iHouses, i);
            
            if (!strcmp(GetHouseOwner(i), "NULL")) {
                new hLabelText_NO_OWNER_Format[sizeof hLabelText_NO_OWNER + (-2+3) + (-2+8)];
                format(hLabelText_NO_OWNER_Format, sizeof(hLabelText_NO_OWNER_Format), hLabelText_NO_OWNER, GetHouseID(i), GetHouseCost(i));
                
                HouseLabel(i) = Create3DTextLabel(hLabelText_NO_OWNER_Format, -1, GetHouseEnterXPickup(i), GetHouseEnterYPickup(i), GetHouseEnterZPickup(i), 7.0, 0, 1);
            } else {
                new hLabelText_OWNER_Format[sizeof hLabelText_OWNER + (-2+MAX_PLAYER_NAME) + (-2+3) + (-2+8) + (-2+sizeof hLockLabel[][])];
                format(hLabelText_OWNER_Format, sizeof(hLabelText_OWNER_Format), hLabelText_OWNER, GetHouseOwner(i), GetHouseID(i), GetHouseCost(i), hLockLabel[GetHouseLock(i)]);
                
                HouseLabel(i) = Create3DTextLabel(hLabelText_OWNER_Format, -1, GetHouseEnterXPickup(i), GetHouseEnterYPickup(i), GetHouseEnterZPickup(i), 7.0, 0, 1);
            }
        }
        
        printf("<ЗАГРУЖЕНО ДОМОВ>: [%d]", count);
    } else {
        return print("<ЗАГРУЖЕНО ДОМОВ>: [0]");
    }
    
    return 1;
}

Count не нужен, можно обойтись простым rows

string_chat[256]

Что за приколы? Максимальная длина - 144

case dHouse_CreateInterior: {
            if(!response) return true;
            return CreateHouse(playerid, listitem);
}


case dHouse_MenuMain: {
        if (!response) return 1;
        
        new id = GetPVarInt(playerid, "pVar__HouseID");
        switch(listitem) {
                case 4: {
                    hInfo[id][hLock] = 0;
                    SetHouseDescription(id);
                    new str[] = "UPDATE `houses` SET `lock` = '0' WHERE `id` = %d";
                    new fmt_str[sizeof str + (-2+1) + (-2+8)];
                    format(fmt_str, sizeof(fmt_str), str, hInfo[id][hID]);
                    return mysql_tquery(dbHandle, fmt_str, "", "");
                }
                
                case 5: {
                    hInfo[id][hLock] = 1;
                    SetHouseDescription(id);
                    new str[] = "UPDATE `houses` SET `lock` = '1' WHERE `id` = %d";
                    new fmt_str[sizeof str + (-2+1) + (-2+8)];
                    format(fmt_str, sizeof(fmt_str), str, hInfo[id][hID]);
                    return mysql_tquery(dbHandle, fmt_str, "", "");
                }
                
                case 6: 
                    return ShowFurnitureList(playerid, hInfo[id][hID]);
                default: return true;
        }
}


С этим диалогом ты работу завершил, можно и return вернуть. Также вместо case 0..3, уберём и сделаем default

stock GetPlayerCountHouses(playerid) {
    new count = 0;    
    foreach (new i: iHouses) {
        if (!strcmp(hInfo[i][hOwner], pName(playerid)))
            count++;
    }
    
    return count;
}

При этом, ты создал итератор, через который и мог бы перебрать

  new idx = -1, furniture_name[64];

furniture_name объявлен с очень большим запасом тебе хватит и 24 символов с учётом EOS

Сообщение отредактировал 21th year: 06 июля 2023 - 23:59

0

#6
Пользователь онлайн   21th year 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDigitalOneThe (06 июля 2023 - 23:44) писал:

Да, я сейчас всё поправляю, уже заметил свои ошибочки, щас всё поправлю, насчёт значения дома, не особо тебя понял, переменную из цикла?

да
0

#7
Пользователь офлайн   swlm 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщения21th year (06 июля 2023 - 23:49) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


Размер массива furniture_name пока-что я менять не буду, ибо не посчитал максимальную длину текста в массиве eFurnitureItems.
Так-же, если ты про GetPlayerCountHouses(playerid), имеешь ввиду про что?
0

#8
Пользователь онлайн   21th year 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDigitalOneThe (07 июля 2023 - 00:09) писал:

Размер массива furniture_name пока-что я менять не буду, ибо не посчитал максимальную длину текста в массиве eFurnitureItems.
Так-же, если ты про GetPlayerCountHouses(playerid), имеешь ввиду про что?

Не важно, бред по поводу этого написал
0

#9
Пользователь офлайн   Pa4enka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию
Убери все что связано с SendAdminsMessage. Нет смысла в нем.

В ShowFurnitureMenu ты создаешь string. Зачем? Ты ничего не форматируешь. Вставь текст напрямую в диалог. И поправь в других участках этот момент, если есть подобное.

А так, принципе, неплохо.
0

#10
Пользователь офлайн   swlm 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщения21th year (06 июля 2023 - 23:49) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


Так-же насчёт - "С этим диалогом ты работу завершил, можно и return вернуть. Также вместо case 0..3, уберём и сделаем default", это я сделал для удобства, если игрок нажмёт не туда куда надо, то ему вернётся текущий его диалог, или я что-то не знаю? default делает то же самое что и по сути мои case 0..3?

Сообщение отредактировал DigitalOneThe: 07 июля 2023 - 00:20

0

Поделиться темой:


  • (6 Страниц) +
  • 1
  • 2
  • 3
  • Последняя »
  • Вы не можете создать новую тему
  • Тема закрыта

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика