Чуть-чуть информации:
В данной системе 2 системы, а точнее вторая система это - система домов, так, как без неё не будет работать система мебели.
Создать дом: /addhouse.
Добавить мебель в дом: /addfurniture.
Открыть меню дома: /hmenu.
Плюсы/Минусы системы:
+ Создание дома. Интерьер на выбор.
+ Возможность добавлять мебель в дом прямо из игры.
+ Возможность добавлять дом прямо из игры.
+ Возможно посмотреть в дверной глазок дома.
+ Возможность продать мебель в своём доме.
+ Возможность хранить предметы внутри дома, то-есть в шкафу. (см. /hmenu)
Зависимые плагины/библиотеки. [Показать]
MySQL R41-4, Pawn.CMD, foreach, Streamer, sscanf2.
Без этих зависимостей, у вас будет некорректно работать система, а точнее вообще не будет работать.
Без этих зависимостей, у вас будет некорректно работать система, а точнее вообще не будет работать.
Начало. [Показать]
/* В OnGameModeInit */
for(new i; i < MAX_HOUSE_INTERIORS; i++) format(hInteriorList, sizeof(hInteriorList), "%s%s\n", hInteriorList, hInteriors[i][eHouse_iName]);
mysql_tquery(/* Ваша переменная подключения */, "SELECT * FROM `houses`", "LoadHouses");
mysql_tquery(/* Ваша переменная подключения */, "CREATE TABLE IF NOT EXISTS `houses` (
`id` int(11) NOT NULL,
`owner` varchar(24) COLLATE utf8mb4_unicode_ci NOT NULL,
`cost` int(11) NOT NULL,
`enter_x` float NOT NULL,
`enter_y` float NOT NULL,
`enter_z` float NOT NULL,
`enter_x_pickup` float NOT NULL,
`enter_y_pickup` float NOT NULL,
`enter_z_pickup` float NOT NULL,
`exit_x` float NOT NULL,
`exit_y` float NOT NULL,
`exit_z` float NOT NULL,
`interior` int(11) NOT NULL,
`lock` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;");
mysql_tquery(/* Ваша переменная подключения */, "CREATE TABLE IF NOT EXISTS `furniture` (
`id` int(11) NOT NULL,
`house_id` int(11) NOT NULL,
`object` int(11) NOT NULL,
`interior` int(11) NOT NULL,
`virtual_world` int(11) NOT NULL,
`x` float NOT NULL,
`y` float NOT NULL,
`z` float NOT NULL,
`rx` float NOT NULL,
`ry` float NOT NULL,
`rz` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;");
/* */
#define MAX_HOUSES 1096
#define MAX_FURNITURE 1096
#define MAX_LOCK_LABEL 64
#define MAX_HOUSE_INTERIORS 8
#define MAX_INTERIOR_NAME 64
#define MAX_FURNITURE_ON_PAGE 20
#define GetHouseData(%0,%1) hInfo[%0][%1]
#define SetHouseData(%0,%1,%2) hInfo[%0][%1] = %2
#define SCM SendClientMessage
#define SPD ShowPlayerDialog
#define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
enum e_DIALOG_IDs {
dNone,
dHouse_CreateInterior,
dHouse_Enter,
dHouse_MenuMain,
dFurniture_List,
dFurniture_Menu,
dFurniture_About
};
enum e_HOUSE_INFO {
hID,
hOwner[MAX_PLAYER_NAME],
hCost,
hVWorld,
hInterior,
Float: hEnterX,
Float: hEnterY,
Float: hEnterZ,
Float: hEnterXPickup,
Float: hEnterYPickup,
Float: hEnterZPickup,
Float: hExitX,
Float: hExitY,
Float: hExitZ,
Text3D: hLabel,
hLock
};
enum e_HOUSE_INTERIORS {
eHouse_ID,
eHouse_Int,
Float: eHouse_EnterX,
Float: eHouse_EnterY,
Float: eHouse_EnterZ,
Float: eHouse_ExitX,
Float: eHouse_ExitY,
Float: eHouse_ExitZ,
eHouse_iName[MAX_INTERIOR_NAME]
};
enum e_FURNITURE_HOUSE {
eFurniture_ID,
eFurniture_IdentifierObj,
eFurniture_Object,
eFurniture_HouseID,
eFurniture_Interior,
eFurniture_VirtualWorld,
Float: eFurniture_ObjectX,
Float: eFurniture_ObjectY,
Float: eFurniture_ObjectZ,
Float: eFurniture_ObjectRX,
Float: eFurniture_ObjectRY,
Float: eFurniture_ObjectRZ
};
enum e_FURNITURE_ITEMS {
eFurniture_ID,
eFurniture_OBJ,
eFurniture_Name[64],
eFurniture_Price
};
new eFurnitureItems[55][e_FURNITURE_ITEMS] = {
{ 0, 1208, "Стиральная машина", 1000 },
{ 1, 1518, "Телевизор, Чёрный", 1000 },
{ 2, 1719, "DVD-Проигрыватель", 1000 },
{ 3, 2099, "Музыкальный центр", 1000 },
{ 4, 2149, "Микроволновка", 1000 },
{ 5, 11743, "Кофеварка", 1000 },
{ 6, 19786, "Телевизор [Плазма]", 1000 },
{ 7, 19893, "Ноутбук", 1000 },
{ 8, 19808, "Клавиатура", 1000 },
{ 9, 2226, "BoomBox", 1000 },
{ 10, 2514, "Унитаз", 1000 },
{ 11, 2515, "Туалетная раковина", 1000 },
{ 12, 2518, "Кухонная раковина", 1000 },
{ 13, 2517, "Душевая кабинка", 1000 },
{ 14, 2526, "Ванна", 1000 },
{ 15, 1738, "Чугунная батарея", 1000 },
{ 16, 1808, "Кулер с водой", 1000 },
{ 17, 1829, "Открытый сейф", 1000 },
{ 18, 2254, "Картина №-1", 1000 },
{ 19, 2267, "Картина с титаником", 1000 },
{ 20, 2275, "Картина с фруктами", 1000 },
{ 21, 2332, "Закрытый сейф", 1000 },
{ 22, 2737, "Доска", 1000 },
{ 23, 2817, "Ковёр голубой с узорами", 1000 },
{ 24, 2824, "Книги", 1000 },
{ 25, 2826, "Журналы", 1000 },
{ 26, 3077, "Стенд", 1000 },
{ 27, 11728, "Навесной телефон", 1000 },
{ 28, 1701, "Кровать №-1", 1000 },
{ 29, 1712, "Диван", 1000 },
{ 30, 1767, "Кресло", 1000 },
{ 31, 14866, "Кровать №-2 (Элитная)", 1000 },
{ 32, 2013, "Кухонная мебель №-1", 1000 },
{ 33, 2014, "Кухонная мебель №-2", 1000 },
{ 34, 2015, "Кухонная мебель №-3", 1000 },
{ 35, 2016, "Кухонная мебель №-4", 1000 },
{ 36, 2017, "Кухонная мебель №-5 (Плита)", 1000 },
{ 37, 11706, "Мусорное ведро", 1000 },
{ 38, 1734, "Круглая лампа", 1000 },
{ 39, 2023, "Настольная лампа", 1000 },
{ 40, 19806, "Люстра", 1000 },
{ 41, 1433, "Стол №-1", 1000 },
{ 42, 1516, "Стол №-2", 1000 },
{ 43, 1663, "Кабинетное кресло", 1000 },
{ 44, 1720, "Стул кухонный", 1000 },
{ 45, 1827, "Стеклянный стол", 1000 },
{ 46, 2086, "Стеклянный стол №-2", 1000 },
{ 47, 2125, "Барный стул", 1000 },
{ 48, 2086, "Стеклянный стол №-3", 1000 },
{ 49, 912, "Тумбочка", 1000 },
{ 50, 2025, "Шкаф", 1000 },
{ 51, 2091, "Шкаф с телевизором", 1000 },
{ 52, 2161, "Книжная полка", 1000 },
{ 53, 2608, "Книжная полка №-2", 1000 },
{ 54, 2919, "Мешок", 1000 }
};
new hInteriors[MAX_HOUSE_INTERIORS][e_HOUSE_INTERIORS] = {
{ 0, 10, 324.2386, -1581.2238, 10.1469, 324.2469, -1579.2540, 10.1469, "Интерьер дома №-1 (Элитный класс)" },
{ 0, 25, 369.0740, 1803.8835, 542.3391, 369.0769, 1805.8754, 542.3391, "Интерьер дома №-2 (Без мебели)" },
{ 0, 30, 301.3104, 1779.1508, 537.7065, 304.1251, 1780.3705, 537.7065, "Интерьер дома №-3 (Без мебели)" },
{ 0, 35, 653.8707, 2089.0718, 536.9958, 653.9099, 2087.0332, 536.9958, "Интерьер дома №-4 (Без мебели)" },
{ 0, 40, 910.4214, 1947.5809, 537.6104, 910.4706, 1945.5288, 537.6104, "Интерьер дома №-5 (Без мебели)" },
{ 0, 45, 1009.6191, 2048.9692, 535.5986, 1007.3119, 2049.1509, 535.5986, "Интерьер дома №-6 (Без мебели)" },
{ 0, 50, 1232.6803, 1888.6193, 535.5975, 1232.7075, 1886.3788, 535.5975, "Интерьер дома №-7 (Без мебели)" },
{ 0, 55, 1079.7793, 1760.9023, 535.0430, 1079.7931, 1762.8513, 535.0430, "Интерьер дома №-8 (Без мебели)" }
/* Если хотите добавить интерьер, добавляйте на примере тех, что выше. */
};
new Iterator: iFurnitures<MAX_FURNITURE>;
new Iterator: iHouses<MAX_HOUSES>;
new hInteriorList[MAX_HOUSE_INTERIORS * MAX_INTERIOR_NAME + 1];
new hLockLabel[2][7] = {
{ "ОТКРЫТ" },
{ "ЗАКРЫТ" }
};
new HouseFurnitureData[MAX_HOUSES][MAX_FURNITURE][e_FURNITURE_HOUSE];
new hInfo[MAX_HOUSES][e_HOUSE_INFO];
Команды. [Показать]
CMD:addhouse(playerid, params[]) {
if (!/* Ваша проверка на то, авторизован ли игрок */) return 1;
if (/* Ваша функция, которая возвращает уровень админки игрока */ < уровень)
return 1;
new bCost;
if (sscanf(params, "d", bCost)) return SCM(playerid, -1, "Подсказка: /addhouse <стоимость>");
SetPVarInt(playerid, "pVar__HouseCost", bCost);
return SPD(playerid, dHouse_CreateInterior, DIALOG_STYLE_LIST,
"Выбор интерьера для дома",
hInteriorList,
"Создать", "Закрыть"
);
}
CMD:hmenu(playerid) {
if (!/* Ваша проверка на то, авторизован ли игрок */) return 1;
if (!GetPlayerCountHouses(playerid))
return SCM(playerid, -1, "{ffd966}<ИНФОРМАЦИЯ> {FFFFFF}Вы не владеете недвижимостью.");
new id = GetPVarInt(playerid, "pVar__HouseID");
if (id == -1)
return SCM(playerid, -1, "{ffd966}<ИНФОРМАЦИЯ> {FFFFFF}Вы не находитесь в доме.");
if (strcmp(GetHouseData(id, hOwner), /* Ваша функция, получение ника игрока. */)) {
return SCM(playerid, -1, "{ffd966}<ИНФОРМАЦИЯ> {FFFFFF}Вы не владелец этого дома.");
} else {
ShowHouseMenu(playerid, id);
}
return 1;
}
CMD:addfurniture(playerid, params[]) {
if (!/* Ваша проверка на то, авторизован ли игрок */) return 1;
if (/* Ваша проверка на то, является ли игрок администратором */ < уровень)
return 1;
new
house_id,
object = -1,
furniture_string[64],
free_idx = Iter_Free(iFurnitures),
string[] = "INSERT INTO `furniture` (`house_id`, `object`) VALUES ('%d', '%d')",
result_string[sizeof string + (-2+8) + (-2+6)],
string_chat[144]
;
if (sscanf(params, "ds[64]", house_id, furniture_string))
return SCM(playerid, -1, "Использование: /addfurniture <номер дома> <название мебели>");
for (new i; i < sizeof eFurnitureItems; i++) {
if (!strcmp(eFurnitureItems[i][eFurniture_Name], furniture_string))
object = eFurnitureItems[i][eFurniture_OBJ];
}
if (object == -1)
return SCM(playerid, -1, "Мебель не найдена.");
format(result_string, sizeof(result_string), string, house_id, object);
// format(string_chat, sizeof (string_chat), "A: Администратор %s[%d] выдал мебель: %s в дом №-%d", /* Ваша функция, получение ника игрока. */, playerid, furniture_string, house_id);
/* На этом моменте, вы можете вывести сообщение администрации. Раскоментируйте строки, если это не обходимо */
return mysql_tquery(/* Ваша переменная подключения */, result_string, "UploadFurnitureOnServer", "ddd", house_id, object, free_idx);
}
Диалоги. [Показать]
/* В OnDialogResponse */
case dHouse_CreateInterior: {
if (!response) return 1;
return CreateHouse(playerid, listitem);
}
case dHouse_Enter: {
if (!response)
return SetPVarInt(playerid, "pVar__HouseID", -1);
new id = GetPVarInt(playerid, "pVar__HouseID");
switch(listitem) {
case 0: {
SetPlayerPos(playerid, GetHouseData(id, hEnterX), GetHouseData(id, hEnterY), GetHouseData(id, hEnterZ));
SetPlayerVirtualWorld(playerid, GetHouseData(id, hID));
SetPlayerInterior(playerid, GetHouseData(id, hInterior));
TogglePlayerControllable(playerid, 0);
SetTimerEx("UnfreezePlayer", 3000, false, "d", playerid);
}
}
}
case dHouse_MenuMain: {
if (!response) return 1;
new id = GetPVarInt(playerid, "pVar__HouseID");
switch(listitem) {
case 4: {
SetHouseData(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]);
mysql_tquery(/* Ваша переменная подключения */, fmt_str, "", "");
}
case 5: {
SetHouseData(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]);
mysql_tquery(/* Ваша переменная подключения */, fmt_str, "", "");
}
case 6: {
ShowFurnitureList(playerid, hInfo[id][hID]);
}
default: return 1;
}
}
case dFurniture_List: {
new
page = GetPVarInt(playerid, "pVar__FurniturePage"),
house_id = GetPVarInt(playerid, "pVar__HouseID"),
idx = page * MAX_FURNITURE_ON_PAGE + listitem
;
if (!response) return ShowHouseMenu(playerid, house_id);
if (!strcmp(inputtext, ">>>")) {
SetPVarInt(playerid, "pVar__FurniturePage", page + 1);
return ShowFurnitureList(playerid, hInfo[house_id][hID]);
} else if (!strcmp(inputtext, "<<<")) {
page = page - 1;
if (page <= 0)
DeletePVar(playerid, "pVar__FurniturePage");
else SetPVarInt(playerid, "pVar__FurniturePage", page);
return ShowFurnitureList(playerid, hInfo[house_id][hID]);
}
SetPVarInt(playerid, "pVar__FurnitureIDX", idx);
return ShowFurnitureMenu(playerid);
}
case dFurniture_About: {
new house_id = GetPVarInt(playerid, "pVar__HouseID");
return ShowFurnitureList(playerid, hInfo[house_id][hID]);
}
case dFurniture_Menu: {
new
house_id = GetPVarInt(playerid, "pVar__HouseID"),
h_id = GetHouseData(house_id, hID),
furniture_id = GetPVarInt(playerid, "pVar__FurnitureIDX"),
Float: x,
Float: y,
Float: z,
interior = GetPlayerInterior(playerid),
virtual_world = GetPlayerVirtualWorld(playerid)
;
if (!response) return ShowFurnitureList(playerid, hInfo[house_id][hID]);
switch(listitem) {
case 0: return ShowAboutFurniture(playerid, h_id, furniture_id); /* Описание объекта */
case 1: { /* Установить объект */
if (HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectX] != 0.0 && HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectY] != 0.0 && HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectZ] != 0.0) {
ShowFurnitureList(playerid, h_id);
return SCM(playerid, -1, "Этот объект уже установлен в вашем доме!");
}
GetPlayerPos(playerid, x, y, z);
HouseFurnitureData[h_id][furniture_id][eFurniture_IdentifierObj] = CreateDynamicObject(
HouseFurnitureData[h_id][furniture_id][eFurniture_Object],
x,
y,
z,
0.0,
0.0,
0.0,
virtual_world,
interior
);
HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectX] = x;
HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectY] = y;
HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectZ] = z;
HouseFurnitureData[h_id][furniture_id][eFurniture_Interior] = interior;
HouseFurnitureData[h_id][furniture_id][eFurniture_VirtualWorld] = virtual_world;
SaveFurniture(h_id, furniture_id);
ShowFurnitureList(playerid, h_id);
SCM(playerid, -1, "Вы установили объект в своём доме. Введите /hmenu -> Управление Мебелью -> Редактировать позицию: Что-бы отредактировать положение объекта");
}
case 2: { /* Удалить объект */
if (HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectX] == 0.0 && HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectY] == 0.0 && HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectZ] == 0.0) {
ShowFurnitureList(playerid, h_id);
return SCM(playerid, -1, "Этот объект ещё не создавался в вашем доме!");
}
HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectX] = 0.0;
HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectY] = 0.0;
HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectZ] = 0.0;
HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectRX] = 0.0;
HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectRY] = 0.0;
HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectRZ] = 0.0;
HouseFurnitureData[h_id][furniture_id][eFurniture_Interior] = 0;
HouseFurnitureData[h_id][furniture_id][eFurniture_VirtualWorld] = 0;
SaveFurniture(h_id, furniture_id);
ShowFurnitureList(playerid, h_id);
DestroyDynamicObject(HouseFurnitureData[h_id][furniture_id][eFurniture_IdentifierObj]);
SCM(playerid, -1, "Вы удалили объект из своего дома. Введите /hmenu -> Управление Мебелью -> Установить объект: Что-бы вернуть его");
}
case 3: { /* Отредактировать позицию */
if (HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectX] == 0.0 && HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectY] == 0.0 && HouseFurnitureData[h_id][furniture_id][eFurniture_ObjectZ] == 0.0) {
ShowFurnitureList(playerid, h_id);
return SCM(playerid, -1, "Этот объект ещё не создавался в вашем доме!");
}
EditDynamicObject(playerid, HouseFurnitureData[h_id][furniture_id][eFurniture_IdentifierObj]);
SCM(playerid, -1, "Отредактируйте положение объекта как вам угодно, и после нажмите кнопку сохранения.");
}
}
return 1;
}
Функции/Стоки [Показать]
/* В OnPlayerKeyStateChange */
if (PRESSED(KEY_WALK)) {
foreach(new i: iHouses) {
if (IsPlayerInRangeOfPoint(playerid, 1.0, GetHouseData(i, hEnterXPickup), GetHouseData(i, hEnterYPickup), GetHouseData(i, hEnterZPickup))) {
if (GetHouseData(i, hLock)) {
SCM(playerid, -1, "{ffd966}<ИНФОРМАЦИЯ> {FFFFFF}Дом закрыт, Вы не можете в него попасть!");
break;
}
SetPVarInt(playerid, "pVar__HouseID", i);
if (!strcmp(GetHouseData(i, hOwner), "NULL")) {
SPD(playerid, dHouse_Enter, DIALOG_STYLE_LIST,
"Выберите одно из двух.",
"\
{FFFFFF}Войти в дом \t\t{ffd966}[ НАЖМИТЕ ] \n\
{FFFFFF}Приобрести \t\t{ffd966}[ НАЖМИТЕ ] \n\
",
"Выбрать", "Закрыть"
);
} else {
SetPlayerPos(playerid, GetHouseData(i, hEnterX), GetHouseData(i, hEnterY), GetHouseData(i, hEnterZ));
SetPlayerVirtualWorld(playerid, GetHouseData(i, hID));
SetPlayerInterior(playerid, GetHouseData(i, hInterior));
TogglePlayerControllable(playerid, 0);
SetTimerEx("UnfreezePlayer", 3000, false, "d", playerid);
}
}
}
}
if (PRESSED(KEY_WALK)) {
new id = GetPVarInt(playerid, "pVar__HouseID");
if (IsPlayerInRangeOfPoint(playerid, 1.0, GetHouseData(id, hExitX), GetHouseData(id, hExitY), GetHouseData(id, hExitZ)) {
SetPlayerPos(playerid, GetHouseData(id, hEnterXPickup), GetHouseData(id, hEnterYPickup), GetHouseData(id, hEnterZPickup));
SetPlayerVirtualWorld(playerid, 0);
SetPlayerInterior(playerid, 0);
SetPVarInt(playerid, "pVar__HouseID", -1);
}
}
/* */
forward UploadFurnitureOnServer(house_id, object, free_idx);
public UploadFurnitureOnServer(house_id, object, free_idx) {
new
idx = GetCountFurnitureHouse(house_id) - 1 + (1)
;
HouseFurnitureData[house_id][idx][eFurniture_ID] = cache_insert_id();
HouseFurnitureData[house_id][idx][eFurniture_HouseID] = house_id;
HouseFurnitureData[house_id][idx][eFurniture_Object] = object;
HouseFurnitureData[house_id][idx][eFurniture_ObjectX] = 0.0;
HouseFurnitureData[house_id][idx][eFurniture_ObjectY] = 0.0;
HouseFurnitureData[house_id][idx][eFurniture_ObjectZ] = 0.0;
HouseFurnitureData[house_id][idx][eFurniture_ObjectRX] = 0.0;
HouseFurnitureData[house_id][idx][eFurniture_ObjectRY] = 0.0;
HouseFurnitureData[house_id][idx][eFurniture_ObjectRZ] = 0.0;
return Iter_Add(iFurnitures, free_idx);
}
public OnPlayerEditDynamicObject(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz) {
if (response == EDIT_RESPONSE_FINAL) {
new
house_id = GetPVarInt(playerid, "pVar__HouseID"),
h_id = GetHouseData(house_id, hID),
idx = GetPVarInt(playerid, "pVar__FurnitureIDX")
;
SetDynamicObjectPos(objectid, x, y, z);
SetDynamicObjectRot(objectid, rx, ry, rz);
HouseFurnitureData[h_id][idx][eFurniture_ObjectX] = x;
HouseFurnitureData[h_id][idx][eFurniture_ObjectY] = y;
HouseFurnitureData[h_id][idx][eFurniture_ObjectZ] = z;
HouseFurnitureData[h_id][idx][eFurniture_ObjectRX] = rx;
HouseFurnitureData[h_id][idx][eFurniture_ObjectRY] = ry;
HouseFurnitureData[h_id][idx][eFurniture_ObjectRZ] = rz;
SaveFurniture(h_id, idx);
}
return 1;
}
forward LoadHouses();
public LoadHouses() {
new rows;
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", GetHouseData(i, hID));
cache_get_value_name_int(i, "interior", GetHouseData(i, hInterior));
cache_get_value_name_int(i, "cost", GetHouseData(i, hCost));
cache_get_value_name_int(i, "lock", GetHouseData(i, hLock));
cache_get_value_name(i, "owner", GetHouseData(i, hOwner));
cache_get_value_name_float(i, "enter_x", GetHouseData(i, hEnterX));
cache_get_value_name_float(i, "enter_y", GetHouseData(i, hEnterY));
cache_get_value_name_float(i, "enter_z", GetHouseData(i, hEnterZ));
cache_get_value_name_float(i, "enter_x_pickup", GetHouseData(i, hEnterXPickup));
cache_get_value_name_float(i, "enter_y_pickup", GetHouseData(i, hEnterYPickup));
cache_get_value_name_float(i, "enter_z_pickup", GetHouseData(i, hEnterZPickup));
cache_get_value_name_float(i, "exit_x", GetHouseData(i, hExitX));
cache_get_value_name_float(i, "exit_y", GetHouseData(i, hExitY));
cache_get_value_name_float(i, "exit_z", GetHouseData(i, hExitZ));
format(result_string, sizeof(result_string), string, GetHouseData(i, hID));
mysql_tquery(/* Ваша переменная подключения */, result_string, "OnLoadFurniture", "d", GetHouseData(i, hID));
CreatePickup(19132, 24, GetHouseData(i, hEnterXPickup), GetHouseData(i, hEnterYPickup), GetHouseData(i, hEnterZPickup), 0);
CreatePickup(19132, 23, GetHouseData(i, hExitX), GetHouseData(i, hExitY), GetHouseData(i, hExitZ), GetHouseData(i, hID));
Create3DTextLabel("{ffd966}[ ВЫХОД ]", -1, GetHouseData(i, hExitX), GetHouseData(i, hExitY), GetHouseData(i, hExitZ), 7.0, GetHouseData(i, hID), 1);
Iter_Add(iHouses, i);
if (!strcmp(GetHouseData(i, hOwner), "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, GetHouseData(i, hID), GetHouseData(i, hCost));
SetHouseData(i, hLabel, Create3DTextLabel(hLabelText_NO_OWNER_Format, -1, GetHouseData(i, hEnterXPickup), GetHouseData(i, hEnterYPickup), GetHouseData(i, hEnterZPickup), 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,GetHouseData(i, hOwner), GetHouseData(i, hID), GetHouseData(i, hCost), hLockLabel[GetHouseData(i, hLock)]);
SetHouseData(i, hLabel, Create3DTextLabel(hLabelText_OWNER_Format, -1, GetHouseData(i, hEnterXPickup), GetHouseData(i, hEnterYPickup), GetHouseData(i, hEnterZPickup), 7.0, 0, 1));
}
}
return printf("Загружено домов: %d", rows);
}
stock SetHouseDescription(idx) {
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 (!strcmp(GetHouseData(i, hOwner), "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, GetHouseData(i, hID), GetHouseData(i, hCost));
Update3DTextLabelText(GetHouseData(i, hLabel), -1, hLabelText_NO_OWNER_Format);
} 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, GetHouseData(i, hOwner), GetHouseData(i, hID), GetHouseData(i, hCost), hLockLabel[GetHouseData(i, hLock)]);
}
return 1;
}
stock GetPlayerCountHouses(playerid) {
new count = 0;
foreach (new i: iHouses) {
if (!strcmp(GetHouseData(i, hOwner), /* Ваша функция, получение ника игрока. */))
count++;
}
return count;
}
stock CreateHouse(playerid, idx) {
new cost = GetPVarInt(playerid, "pVar__HouseCost");
new Float: xPlayer, Float: yPlayer, Float: zPlayer;
GetPlayerPos(playerid, xPlayer, yPlayer, zPlayer);
new str[] = "INSERT INTO `houses` (`owner`, `cost`, `enter_x`, `enter_y`, `enter_z`, `enter_x_pickup`, `enter_y_pickup`, `enter_z_pickup`, `exit_x`, `exit_y`, `exit_z`, `interior`) VALUES ('NULL', %d, '%.3f', '%.3f', '%.3f', '%.3f', '%.3f', '%.3f', '%.3f', '%.3f', '%.3f', %d)";
new fmt_str[sizeof str + (-2+MAX_PLAYER_NAME) + (-2+8) + (-2+14) + (-2+14) + (-2+14) + (-2+14) + (-2+14) + (-2+14) + (-2+14) + (-2+14) + (-2+14) + (-2+8)];
format(fmt_str, sizeof(fmt_str),
str,
cost,
hInteriors[idx][eHouse_EnterX],
hInteriors[idx][eHouse_EnterY],
hInteriors[idx][eHouse_EnterZ],
xPlayer,
yPlayer,
zPlayer,
hInteriors[idx][eHouse_ExitX],
hInteriors[idx][eHouse_ExitY],
hInteriors[idx][eHouse_ExitZ],
hInteriors[idx][eHouse_Int]
);
mysql_tquery(/* Ваша переменная подключения */, fmt_str, "", "");
return SCM(playerid, -1, "<ИНФОРМАЦИЯ>: Дом был создан, он будет загружен на сервер после перезапуска.");
}
forward OnLoadFurniture(house_id);
public OnLoadFurniture(house_id) {
new
rows,
object,
id_from_db,
interior,
virtual_world,
Float: x,
Float: y,
Float: z,
Float: rx,
Float: ry,
Float: rz
;
cache_get_row_count(rows);
if (rows) {
for (new i; i < rows; i++) {
cache_get_value_name_int(i, "object", object);
cache_get_value_name_int(i, "id", id_from_db);
cache_get_value_name_int(i, "interior", interior);
cache_get_value_name_int(i, "virtual_world", virtual_world);
cache_get_value_name_float(i, "x", x);
cache_get_value_name_float(i, "y", y);
cache_get_value_name_float(i, "z", z);
cache_get_value_name_float(i, "rx", rx);
cache_get_value_name_float(i, "ry", ry);
cache_get_value_name_float(i, "rz", rz);
HouseFurnitureData[house_id][i][eFurniture_ID] = id_from_db;
HouseFurnitureData[house_id][i][eFurniture_Object] = object;
HouseFurnitureData[house_id][i][eFurniture_Interior] = interior;
HouseFurnitureData[house_id][i][eFurniture_VirtualWorld] = virtual_world;
HouseFurnitureData[house_id][i][eFurniture_HouseID] = house_id;
HouseFurnitureData[house_id][i][eFurniture_ObjectX] = x;
HouseFurnitureData[house_id][i][eFurniture_ObjectY] = y;
HouseFurnitureData[house_id][i][eFurniture_ObjectZ] = z;
HouseFurnitureData[house_id][i][eFurniture_ObjectRX] = rx;
HouseFurnitureData[house_id][i][eFurniture_ObjectRY] = ry;
HouseFurnitureData[house_id][i][eFurniture_ObjectRZ] = rz;
if (x != 0.0 && y != 0.0 && z != 0.0) {
HouseFurnitureData[house_id][i][eFurniture_IdentifierObj] = CreateDynamicObject(object, x, y, z, rx, ry, rz, virtual_world, interior);
}
Iter_Add(iFurnitures, i);
}
}
return 1;
}
stock SaveFurniture(house_id, idx) {
new
string[] = "UPDATE `furniture` SET `x` = '%0.3f', `y` = '%0.3f', `z` = '%0.3f', `rx` = '%.03f', `ry` = '%.03f', `rz` = '%.03f', `interior` = '%d', `virtual_world` = '%d' WHERE `house_id` = '%d' AND `id` = '%d'",
result_string[sizeof string + (-2+16) + (-2+16) + (-2+16) + (-2+16) + (-2+16) + (-2+16) + (-2+16) + (-2+16) + (-2+8) + (-2+8)]
;
format(result_string, sizeof (result_string), string,
HouseFurnitureData[house_id][idx][eFurniture_ObjectX],
HouseFurnitureData[house_id][idx][eFurniture_ObjectY],
HouseFurnitureData[house_id][idx][eFurniture_ObjectZ],
HouseFurnitureData[house_id][idx][eFurniture_ObjectRX],
HouseFurnitureData[house_id][idx][eFurniture_ObjectRY],
HouseFurnitureData[house_id][idx][eFurniture_ObjectRZ],
HouseFurnitureData[house_id][idx][eFurniture_Interior],
HouseFurnitureData[house_id][idx][eFurniture_VirtualWorld],
house_id, HouseFurnitureData[house_id][idx][eFurniture_ID]
);
return mysql_tquery(/* Ваша переменная подключения */, result_string);
}
stock ShowAboutFurniture(playerid, house_id, furniture_id) {
new string[] = "\
{FFFFFF}Уникальный ID Мебели: {ffd966}[ №-%d ] \n\
{FFFFFF}Номер дома: {ffd966}[ №-%d ] \n\
{FFFFFF}Модель объекта: {ffd966}[ #-%d ] \n\
{FFFFFF}Координата объекта X: {ffd966}[ %f ] \n\
{FFFFFF}Координата объекта Y: {ffd966}[ %f ] \n\
{FFFFFF}Координата объекта Z: {ffd966}[ %f ] \n\
{FFFFFF}Координата объекта RX: {ffd966}[ %f ] \n\
{FFFFFF}Координата объекта RY: {ffd966}[ %f ] \n\
{FFFFFF}Координата объекта RZ: {ffd966}[ %f ] \n\
", result_string[
sizeof string
+ (-2+8)
+ (-2+8)
+ (-2+32)
+ (-2+16)
+ (-2+16)
+ (-2+16)
+ (-2+16)
+ (-2+16)
+ (-2+16)
];
format(result_string, sizeof(result_string), string,
HouseFurnitureData[house_id][furniture_id][eFurniture_ID],
HouseFurnitureData[house_id][furniture_id][eFurniture_HouseID],
HouseFurnitureData[house_id][furniture_id][eFurniture_Object],
HouseFurnitureData[house_id][furniture_id][eFurniture_ObjectX],
HouseFurnitureData[house_id][furniture_id][eFurniture_ObjectY],
HouseFurnitureData[house_id][furniture_id][eFurniture_ObjectZ],
HouseFurnitureData[house_id][furniture_id][eFurniture_ObjectRX],
HouseFurnitureData[house_id][furniture_id][eFurniture_ObjectRY],
HouseFurnitureData[house_id][furniture_id][eFurniture_ObjectRZ]
);
return SPD(playerid, dFurniture_About, DIALOG_STYLE_MSGBOX, "{FFFFFF}Информация о мебели.", result_string, "{FFFFFF}Закрыть", "{FFFFFF}Назад");
}
stock ShowFurnitureMenu(playerid) {
return
SPD(
playerid,
dFurniture_Menu,
DIALOG_STYLE_LIST,
"{FFFFFF}Редактирование мебели.",
"\
{FFFFFF}Описание мебели\t\t{8fce00}[ НАЖМИТЕ ] \n\
{FFFFFF}Установить объект\t\t{8fce00}[ НАЖМИТЕ ] \n\
{FFFFFF}Удалить объект\t\t{8fce00}[ НАЖМИТЕ ] \n\
{FFFFFF}Редактировать позицию\t{8fce00}[ НАЖМИТЕ ] \n\
",
"{FFFFFF}Выбрать",
"{FFFFFF}Назад"
);
}
stock GetCountFurnitureHouse(house_id) {
new count;
foreach (new i: iFurnitures) {
if (HouseFurnitureData[house_id][i][eFurniture_Object] != 0)
count ++;
}
return count;
}
stock GetObjectName(string[], object) {
for (new idx; idx < sizeof eFurnitureItems; idx++) {
if (eFurnitureItems[idx][eFurniture_OBJ] == object)
format(string, 64, "%s", eFurnitureItems[idx][eFurniture_Name]);
}
return 1;
}
stock ShowFurnitureList(playerid, house_id) {
new furniture_count = GetCountFurnitureHouse(house_id);
new h_id = GetPVarInt(playerid, "pVar__HouseID");
if (!furniture_count) {
ShowHouseMenu(playerid, h_id);
return SCM(playerid, -1, "В этом доме нету мебели.");
}
new str[2000] = "{ffffff}Номер дома\tМодель объекта\tНаименование объекта\n";
new page = GetPVarInt(playerid, "pVar__FurniturePage");
new start = page * MAX_FURNITURE_ON_PAGE;
if (start > furniture_count) {
page -= 1;
if (page < 0) return 0;
SetPVarInt(playerid, "pVar__FurniturePage", page);
start = page * MAX_FURNITURE_ON_PAGE;
}
new end = start + MAX_FURNITURE_ON_PAGE;
if (end > furniture_count)
end = furniture_count;
new idx = -1, furniture_name[64];
for (new i; i < furniture_count; i++) {
GetObjectName(furniture_name, HouseFurnitureData[house_id][i][eFurniture_Object]);
if (++idx < start) continue;
if (idx >= end) break;
format(str, sizeof(str), "%s{bcbcbc}№-%d\t{bcbcbc}#-%d\t{ffd966}%s\n", str, house_id, HouseFurnitureData[house_id][i][eFurniture_Object], furniture_name);
}
if (furniture_count > MAX_FURNITURE_ON_PAGE) {
if (end < furniture_count) {
strcat(str, "{93c47d}>>>\t\t\n");
}
if (page) {
strcat(str, "{f44336}<<<\t\t\n");
}
}
return SPD(playerid, dFurniture_List, DIALOG_STYLE_TABLIST_HEADERS, "{FFFFFF}Список мебели", str, "Выбор", "Назад");
}
stock ShowHouseMenu(playerid, house_id) {
new str[] =
"\
{FFFFFF}Владелец \t\t{ffd966}[ %s ] \n\
{FFFFFF}Номер дома \t\t{ffd966}[ #-%d ] \n\
{FFFFFF}Замок \t\t\t{ffd966}[ %s ] \n\
{FFFFFF}Гос. стоимость \t{8fce00}[ %d $ ] \n\n\
{FFFFFF}Открыть дом \t\t{ffd966}[ НАЖМИТЕ ] \n\
{FFFFFF}Закрыть дом \t\t{ffd966}[ НАЖМИТЕ ] \n\
{FFFFFF}Управление мебелью \t{ffd966}[ НАЖМИТЕ ] \n\
"
, fmt_str[sizeof str + (-2+MAX_PLAYER_NAME) + (-2+3) + (-2+sizeof hLockLabel[][]) + (-2+8)];
format(fmt_str, sizeof(fmt_str), str, GetHouseData(house_id, hOwner), GetHouseData(house_id, hID), hLockLabel[GetHouseData(house_id, hLock)], GetHouseData(house_id, hCost));
return SPD(playerid, dHouse_MenuMain, DIALOG_STYLE_LIST, "Меню дома", fmt_str, "Выбрать", "Закрыть");
}
Структура таблицы домов. [Показать]
Название таблицы: houses; Название столбца: id(AUTO_INCREMENT); Тип: int(11); Название столбца: owner; Предназначение: Владелец определённого дома, по умолчанию определяется как NULL, если дом не куплен. Тип: varchar(24); Название столбца: cost; Предназначение: Цена для дома, используется для его приобретения. Тип: int(11); Название столбца: enter_x; Предназначение: Координата. Тип: float; Название столбца: enter_y; Предназначение: Координата. Тип: float; Название столбца: enter_z; Предназначение: Координата. Тип: float; Название столбца: enter_x_pickup; Предназначение: Координата. Тип: float; Название столбца: enter_y_pickup; Предназначение: Координата. Тип: float; Название столбца: enter_z_pickup; Предназначение: Координата. Тип: float; Название столбца: exit_x; Предназначение: Координата. Тип: float; Название столбца: exit_y; Предназначение: Координата. Тип: float; Название столбца: exit_z; Предназначение: Координата. Тип: float; Название столбца: interior; Предназначение: Интерьер, в котором располагается дом. Тип: int(11); Название столбца: lock; Предназначение: Свидетельствует о том, закрыт ли дом, иначе открыт. Тип: int(1);
!ВНИМАНИЕ! Если называете таблицу по своему, то меняйте название таблиц в запросах, всё что касается системы мебели и домов.
Структура таблицы мебели. [Показать]
Название таблицы: furniture; Название столбца: id(AUTO_INCREMENT); Тип: int(11); Название столбца: house_id; Предназначение: Идентификатор, для взаимодействия с мебелью определённого дома; Тип: int(11); Название столбца: object; Предназначение: Отображаемый объект в доме; Тип: int(11); Название столбца: interior; Предназначение: Интерьер, в котором располагается объект; Тип: int(11); Название столбца: virtual_world; Предназначение: Виртуальный мир, в котором располагается объект; Тип: int(11); Название столбца: x; Предназначение: Координата; Тип: int; Название столбца: y; Предназначение: Координата; Тип: int; Название столбца: z; Предназначение: Координата; Тип: float; Название столбца: rx; Предназначение: Координата; Тип: int; Название столбца: ry; Предназначение: Координата; Тип: int; Название столбца: rz; Предназначение: Координата; Тип: float;
!ВНИМАНИЕ! Если называете таблицу по своему, то меняйте название таблиц в запросах, всё что касается системы мебели и домов.
Пояснение за некоторые функции. [Показать]
ShowFurnitureList(playerid, house_id);
Описание: Используется для вывода мебели определённого дома игроку.
GetCountFurnitureHouse(house_id);
Описание: Функция возвращает кол-во мебели в определённом доме.
ShowAboutFurniture(playerid, house_id, furniture_id);
Описание: Вывод диалога игроку, с информацией о текущей мебели в доме.
OnLoadFurniture(house_id);
Описание: Callback, который вызывается всякий раз, когда запускается сервер.
SaveFurniture(house_id, idx);
Описание: Сохранение текущей мебели.
LoadHouses();
Описание: Callback, который вызывается всякий раз, когда запускается сервер.
SetHouseDescription(idx);
Описание: Изменяется 3D-Текст, в зависимости от того, является ли дом куплен, или же иначе.
GetPlayerCountHouses(playerid);
Описание: Функция возвращает кол-во домов у определённого игрока.
GetObjectName(string[], object);
Описание: Форматирует наименование ко всем объектам в списке мебели определённого дома.
Описание: Используется для вывода мебели определённого дома игроку.
GetCountFurnitureHouse(house_id);
Описание: Функция возвращает кол-во мебели в определённом доме.
ShowAboutFurniture(playerid, house_id, furniture_id);
Описание: Вывод диалога игроку, с информацией о текущей мебели в доме.
OnLoadFurniture(house_id);
Описание: Callback, который вызывается всякий раз, когда запускается сервер.
SaveFurniture(house_id, idx);
Описание: Сохранение текущей мебели.
LoadHouses();
Описание: Callback, который вызывается всякий раз, когда запускается сервер.
SetHouseDescription(idx);
Описание: Изменяется 3D-Текст, в зависимости от того, является ли дом куплен, или же иначе.
GetPlayerCountHouses(playerid);
Описание: Функция возвращает кол-во домов у определённого игрока.
GetObjectName(string[], object);
Описание: Форматирует наименование ко всем объектам в списке мебели определённого дома.
Ну вот и в принципе всё. По поводу моих макросов, начиная от #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
Вход
Регистрация
Помощь

Тема закрыта









