sk.tm_radik
Компетентный
Привет всем.
Так как я выложил свой мод Magic Worlds в паблик то и решил вырезать свою систему домов.
Автор системы я.
Сама система на файлах.
Все команды на стандартном командном процессоре.
Координаты интов вырезал с какого мода.
Важно - переменные заменяйте на свои.
Важно - в скриптфайлиз создайте папку House и два файла houses.cfg | config.ini
Ну пожалуй начнем:
1) В enum pInfo вставляем
PHP:
pHouse
PHP:
#define MAX_HOUSES 100 // Максимальное число домов
enum hInfo
{
hOwned, hOwner[24],
Float: hX, Float: hY, Float: hZ, hInterior, hVirtWorld,
hPrice,
hLock,
hLevel
};
new HousesInfo[MAX_HOUSES][hInfo];
new Text3D: houses_text[MAX_HOUSES];
new houses_icon[MAX_HOUSES];
new houses_pickup[MAX_HOUSES];
new AllHouse; // Всего домов
enum hiInfo
{
Float: hiX, Float: hiY, Float: hiZ, hiInt
};
new HInts[][hiInfo] = // Интерьеры
{
{235.508994, 1189.169897, 1080.339966, 3}, // 0
{225.756989, 1240.000000, 1082.149902, 2}, // 1
{223.043991, 1289.259888, 1082.199951, 1}, // 2
{225.630997, 1022.479980, 1084.069946, 7}, // 3
{295.138977, 1474.469971, 1080.519897, 15}, // 4
{328.493988, 1480.589966, 1084.449951, 15}, // 5
{385.803986, 1471.769897, 1080.209961, 15}, // 6
{2220.26, -1148.01, 1025.80, 15}, // 7
{2451.77, -1699.80, 1013.51, 2}, // 8
{2251.85, -1138.16, 1050.63, 9}, // 9
{2260.76, -1210.45, 1049.02, 10}, // 10
{2496.65, -1696.55, 1014.74, 3}, // 11
{1299.14, -794.77, 1084.00, 5}, // 12
{2262.83, -1137.71, 1050.63, 10}, // 13
{2365.42, -1131.85, 1050.88, 8}, // 14
{2324.33, -1144.79, 1050.71, 12}, // 15
{2233.6919, -1112.8107, 1050.8828, 5}, // 16
{2319.1272, -1023.9562, 1050.2109, 9}, // 17
{239.2819, 1114.1991, 1080.9922, 5}, // 18
{446.3247, 509.9662, 1001.4195, 12}, // 19
{446.626, 1397.738, 1084.3047, 2}, // 20
{261.1165, 1287.2197, 1080.2578, 4}, // 21
{306.1966, 307.819, 1003.3047, 4}, // 22
{24.3769, 1341.1829, 1084.375, 10}, // 23
{221.6766, 1142.4962, 1082.6094, 4}, // 24
{-262.1759, 1456.6158, 1084.3672, 4}, // 25
{234.2826, 1065.229, 1084.2101, 6}, // 26
{-68.5145, 1353.8485, 1080.2109, 6}, // 27
{-285.2511, 1471.197, 1084.375, 15}, // 28
{-42.5267, 1408.23, 1084.4297, 8}, // 29
{84.9244, 1324.2983, 1083.8594, 9}, // 30
{22.7322, 1404.7037, 1084.4297, 5}, // 31
{244.6048, 304.8997, 999.1484, 1}, // 32
{2216.1282, -1076.3052, 1050.4844, 1} // 33
};
PHP:
PlayerInfo[playerid][pHouse] = 9999;
PHP:
new hh = PlayerInfo[playerid][pHouse];
if(hh != 9999)
{
SetPlayerInterior(playerid, HInts[HousesInfo[hh][hInterior]][hiInt]);
SetPlayerPos(playerid, HInts[HousesInfo[hh][hInterior]][hiX], HInts[HousesInfo[hh][hInterior]][hiY], HInts[HousesInfo[hh][hInterior]][hiZ]);
SetPlayerVirtualWorld(playerid, HousesInfo[hh][hVirtWorld]);
return 1;
}
PHP:
SaveHouses();
PHP:
LoadHouses();
for(new h = 0; h < AllHouse; h++)
{
if(HousesInfo[h][hOwned] == 0)
{
format(string,sizeof(string), "Дом №%d продаётся\n\nСтоимость: %d$\nУровень: %d\nЧтобы купить, введите /buyhouse",h,HousesInfo[h][hPrice],HousesInfo[h][hLevel]);
houses_text[h] = Create3DTextLabel(string, 0xFFFFFFFF, HousesInfo[h][hX], HousesInfo[h][hY], HousesInfo[h][hZ]+0.5, 10.0, 0, 1);
houses_icon[h] = CreateDynamicMapIcon(HousesInfo[h][hX], HousesInfo[h][hY], HousesInfo[h][hZ], 31, COLOR_WHITE, 0, -1, -1, 400.0);
houses_pickup[h] = CreatePickup(1273, 23, HousesInfo[h][hX], HousesInfo[h][hY], HousesInfo[h][hZ]);
}
else if(HousesInfo[h][hOwned] == 1)
{
format(string,sizeof(string), "Дом №%d\n\nУровень: %d\nВладелец: %s",h,HousesInfo[h][hLevel],HousesInfo[h][hOwner]);
houses_text[h] = Create3DTextLabel(string, 0xFFFFFFFF, HousesInfo[h][hX], HousesInfo[h][hY], HousesInfo[h][hZ]+0.5, 10.0, 0, 1);
houses_icon[h] = CreateDynamicMapIcon(HousesInfo[h][hX], HousesInfo[h][hY], HousesInfo[h][hZ], 32, COLOR_WHITE, 0, -1, -1, 400.0);
houses_pickup[h] = CreatePickup(1272, 23, HousesInfo[h][hX], HousesInfo[h][hY], HousesInfo[h][hZ]);
}
}
PHP:
ini_setInteger(iniFile, "House", PlayerInfo[playerid][pHouse]);
PHP:
ini_getInteger(iniFile, "House", PlayerInfo[playerid][pHouse]);
PHP:
if(PlayerInfo[playerid][pHouse] != 9999 && strcmp(HousesInfo[PlayerInfo[playerid][pHouse]][hOwner], PlayerInfo[playerid][pName], true)) PlayerInfo[playerid][pHouse] = 9999;
PHP:
if(strcmp(cmd, "/createhouse", true) == 0)
{
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, COLOR_WHITE,"{FF9900}>{FFFFFF} /createhouse [0-33] [цена]");
new intid = strval(tmp);
tmp = strtok(cmdtext, idx);
if(intid > 33 || intid < 0) return SendClientMessage(playerid, COLOR_WHITE, "{ff3300}x{FFFFFF} От 0 до 33!");
if(!strlen(tmp)) return SendClientMessage(playerid, COLOR_WHITE,"{FF9900}>{FFFFFF} /createhouse [0-33] [цена]");
new hprice = strval(tmp);
if(hprice > 50000000 || hprice < 100) return SendClientMessage(playerid, COLOR_WHITE, "{ff3300}x{FFFFFF} От 100$ до 50.000.000$!");
new Float:XX, Float: YY, Float:ZZ;
GetPlayerPos(playerid,XX,YY,ZZ);
HousesInfo[AllHouse][hOwned] = 0;
strmid(HousesInfo[AllHouse][hOwner], "None", 0, strlen("None"), 255);
HousesInfo[AllHouse][hX] = XX;
HousesInfo[AllHouse][hY] = YY;
HousesInfo[AllHouse][hZ] = ZZ;
HousesInfo[AllHouse][hInterior] = intid;
HousesInfo[AllHouse][hVirtWorld] = AllHouse;
HousesInfo[AllHouse][hPrice] = hprice;
HousesInfo[AllHouse][hLock] = 1;
HousesInfo[AllHouse][hLevel] = 5;
format(string,sizeof(string),"Дом №%d продаётся\n\nСтоимость: %d$\nУровень: %d\nЧтобы купить, введите /buyhouse",AllHouse,HousesInfo[AllHouse][hPrice],HousesInfo[AllHouse][hLevel]);
houses_text[AllHouse] = Create3DTextLabel(string, 0xFFFFFFFF, HousesInfo[AllHouse][hX], HousesInfo[AllHouse][hY], HousesInfo[AllHouse][hZ]+0.5, 10.0, 0, 1);
houses_icon[AllHouse] = CreateDynamicMapIcon(HousesInfo[AllHouse][hX], HousesInfo[AllHouse][hY],HousesInfo[AllHouse][hZ], 31, COLOR_WHITE, 0, -1, -1, 400.0);
houses_pickup[AllHouse] = CreatePickup(1273, 23, HousesInfo[AllHouse][hX], HousesInfo[AllHouse][hY],HousesInfo[AllHouse][hZ]);
AllHouse++;
SaveHouses();
return 1;
}
if(strcmp(cmd, "/delhouse", true) == 0)
{
if(AllHouse == 0) return SendClientMessage(playerid, COLOR_WHITE, "{ff3300}x{FFFFFF} Домов больше нету!");
for(new h = 0; h <= AllHouse; h++)
{
if(strcmp(HousesInfo[h][hOwner],"None",true)!= 0) return SendClientMessage(playerid, COLOR_WHITE,"{ff3300}x{ffffff} Данный дом удалить нельзя. Сперва его нужно освободить (/aselhouse)!");
if(IsPlayerInRangeOfPoint(playerid, 1.0, HousesInfo[h][hX], HousesInfo[h][hY], HousesInfo[h][hZ]))
{
HousesInfo[h][hX] = 0;
HousesInfo[h][hY] = 0;
HousesInfo[h][hZ] = 0;
HousesInfo[h][hInterior] = 0;
HousesInfo[h][hVirtWorld] = 0;
HousesInfo[h][hPrice] = 0;
HousesInfo[h][hLock] = 0;
HousesInfo[h][hLevel] = 0;
HousesInfo[h][hOwned] = 0;
HousesInfo[h][hOwner] = 0;
Delete3DTextLabel(Text3D:houses_text[h]);
DestroyDynamicMapIcon(houses_icon[h]);
DestroyPickup(houses_pickup[h]);
AllHouse--;
SaveHouses();
format(string, sizeof(string), "Вы удалил дом №%d",h);
SendClientMessage(playerid, COLOR_WHITE, string);
}
}
return 1;
}
if(strcmp(cmd, "/aselhouse", true) == 0)
{
for(new h = 0; h <= AllHouse; h++)
{
if(IsPlayerInRangeOfPoint(playerid, 1.0, HousesInfo[h][hX], HousesInfo[h][hY], HousesInfo[h][hZ]))
{
strmid(HousesInfo[h][hOwner],"None", 0, 5, 5);
HousesInfo[h][hOwned] = 0;
HousesInfo[h][hLock] = 1;
SaveHouses();
UpdateHouse(h);
format(string, sizeof(string), "Вы освободили дом №%d",h);
SendClientMessage(playerid, COLOR_WHITE, string);
}
}
return 1;
}
if(strcmp(cmd, "/sethprice", true) == 0)
{
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, COLOR_WHITE, "{FF9900}>{FFFFFF} /sethprice [цена]");
new proplev = strval(tmp);
if(proplev > 50000000 || proplev < 100) return SendClientMessage(playerid, COLOR_WHITE, "{ff3300}x{FFFFFF} От 100$ до 50.000.000$!");
for(new h = 0; h <= AllHouse; h++)
{
if(IsPlayerInRangeOfPoint(playerid, 1.0, HousesInfo[h][hX], HousesInfo[h][hY], HousesInfo[h][hZ]))
{
HousesInfo[h][hPrice] = proplev;
format(string, sizeof(string), "Цена дома №%d теперь %d",h,HousesInfo[h][hPrice]);
SendClientMessage(playerid, COLOR_WHITE, string);
UpdateHouse(h);
}
}
SaveHouses();
return 1;
}
if(strcmp(cmd, "/sethlvl", true) == 0)
{
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, COLOR_WHITE, "{FF9900}>{FFFFFF} /sethlvl [уровень]");
new proplev = strval(tmp);
if(proplev > 500 || proplev < 1) return SendClientMessage(playerid, COLOR_WHITE, "{ff3300}x{FFFFFF} От 1 до 500!");
for(new h = 0; h <= AllHouse; h++)
{
if(IsPlayerInRangeOfPoint(playerid, 1.0, HousesInfo[h][hX], HousesInfo[h][hY], HousesInfo[h][hZ]))
{
HousesInfo[h][hLevel] = proplev;
format(string, sizeof(string), "Уровень дома №%d теперь %d",h,HousesInfo[h][hLevel]);
SendClientMessage(playerid, COLOR_WHITE, string);
UpdateHouse(h);
}
}
SaveHouses();
return 1;
}
if(strcmp(cmd, "/sethint", true) == 0)
{
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, COLOR_WHITE, "{FF9900}>{FFFFFF} /sethint [0-33]");
new proplev = strval(tmp);
if(proplev > 33 || proplev < 0) return SendClientMessage(playerid, COLOR_WHITE, "{ff3300}x{FFFFFF} От 0 до 33!");
for(new h = 0; h <= AllHouse; h++)
{
if(IsPlayerInRangeOfPoint(playerid, 1.0, HousesInfo[h][hX], HousesInfo[h][hY], HousesInfo[h][hZ]))
{
HousesInfo[h][hInterior] = proplev;
format(string, sizeof(string), "Интерьер дома №%d теперь %d",h,HousesInfo[h][hInterior]);
SendClientMessage(playerid, COLOR_WHITE, string);
}
}
SaveHouses();
return 1;
}
//
if(strcmp(cmd, "/sellhouse", true) == 0)
{
new hid = PlayerInfo[playerid][pHouse];
if(hid == 9999) return SendClientMessage(playerid, COLOR_WHITE, "{ff3300}x{ffffff} Вы не владеете домом!");
if(hid != 9999 && strcmp(PlayerInfo[playerid][pName], HousesInfo[hid][hOwner], true) == 0)
{
strmid(HousesInfo[hid][hOwner],"None", 0, 5, 5);
HousesInfo[hid][hOwned] = 0;
PlayerInfo[playerid][pHouse]= 9999;
HousesInfo[hid][hLock] = 1;
SaveHouses();
PlayerInfo[playerid][pMoney] += HousesInfo[hid][hPrice]/2;
UpdateHouse(hid);
SendClientMessage(playerid, COLOR_WHITE,"- Вы продали свой дом.");
}
else
{
SendClientMessage(playerid, COLOR_WHITE, "{ff3300}x{ffffff} Вы не владелец дома!");
}
return 1;
}
if(strcmp(cmd, "/buyhouse", true) == 0)
{
if(PlayerInfo[playerid][pHouse] != 9999) return SendClientMessage(playerid, COLOR_WHITE,"{ff3300}x{ffffff} У вас уже есть дом!");
for(new h = 0; h <= AllHouse; h++)
{
if(!IsPlayerInRangeOfPoint(playerid, 1.0, HousesInfo[h][hX], HousesInfo[h][hY], HousesInfo[h][hZ])) continue;
if(GetPlayerMoney(playerid) < HousesInfo[h][hPrice])return SendClientMessage(playerid, COLOR_WHITE,"{ff3300}x{ffffff} У вас недостаточно денег на покупку дома!");
if(strcmp(HousesInfo[h][hOwner],"None",true)!= 0) return SendClientMessage(playerid, COLOR_WHITE,"{ff3300}x{ffffff} Дом уже куплен!");
if(PlayerInfo[playerid][pLevel] < HousesInfo[h][hLevel]) return SendClientMessage(playerid, COLOR_WHITE,"{ff3300}x{ffffff} Ваш уровень недостаточен чтобы купить данный дом!");
HousesInfo[h][hOwned] = 1;
strmid(HousesInfo[h][hOwner], PlayerInfo[playerid][pName], 0, 24, 24);
PlayerInfo[playerid][pHouse] = h;
PlayerInfo[playerid][pMoney] -= HousesInfo[h][hPrice];
UpdateHouse(h);
SaveHouses();
SendClientMessage(playerid, COLOR_WHITE,"- Поздравляем вас с покупкой дома. (/househelp - помощь по дому)");
// Телепортируем игрока в дом после покупки
SetPlayerInterior(playerid, HInts[HousesInfo[h][hInterior]][hiInt]);
SetPlayerVirtualWorld(playerid, HousesInfo[h][hVirtWorld]);
SetPlayerPos(playerid, HInts[HousesInfo[h][hInterior]][hiX], HInts[HousesInfo[h][hInterior]][hiY], HInts[HousesInfo[h][hInterior]][hiZ]);
//
}
return 1;
}
if(strcmp(cmd, "/open", true) == 0)
{
if(HousesInfo[PlayerInfo[playerid][pHouse]][hLock])
{
HousesInfo[PlayerInfo[playerid][pHouse]][hLock] = 0;
SendClientMessage(playerid, COLOR_WHITE, "Вы открыли дом.");
}
else
{
HousesInfo[PlayerInfo[playerid][pHouse]][hLock] = 1;
SendClientMessage(playerid, COLOR_WHITE, "Вы закрыли дом.");
}
SaveHouses();
return 1;
}
if(strcmp(cmd, "/househelp", true) == 0)
{
if(PlayerInfo[playerid][pHouse] == 9999) return SendClientMessage(playerid, COLOR_WHITE, "{ff3300}x{ffffff} Вы не владеете домом!");
SendClientMessage(playerid, COLOR_WHITE, "==============[Помощь по домам]==============");
SendClientMessage(playerid, COLOR_WHITE, "{ff3300}>{ffffff} /open - Открыть/Закрыть дом");
SendClientMessage(playerid, COLOR_WHITE, "{ff3300}>{ffffff} /sellhouse - Продать дом");
SendClientMessage(playerid, COLOR_WHITE, "=============================================");
return 1;
}
PHP:
if(newkeys == 1024)
{
for(new i = 0; i < AllHouse; i++)
{
if(IsPlayerInRangeOfPoint(playerid, 4.0, HousesInfo[i][hX], HousesInfo[i][hY], HousesInfo[i][hZ]))
{
if(!HousesInfo[i][hLock] || PlayerInfo[playerid][pHouse] == i)
{
SetPlayerInterior(playerid,HInts[HousesInfo[i][hInterior]][hiInt]);
SetPlayerPos(playerid,HInts[HousesInfo[i][hInterior]][hiX],HInts[HousesInfo[i][hInterior]][hiY],HInts[HousesInfo[i][hInterior]][hiZ]);
SetPlayerVirtualWorld(playerid,HousesInfo[i][hVirtWorld]);
}
}
if(IsPlayerInRangeOfPoint(playerid, 4.0, HInts[HousesInfo[i][hInterior]][hiX], HInts[HousesInfo[i][hInterior]][hiY], HInts[HousesInfo[i][hInterior]][hiZ]) && GetPlayerVirtualWorld(playerid) == HousesInfo[i][hVirtWorld])
{
SetPlayerInterior(playerid, 0);
SetPlayerPos(playerid, HousesInfo[i][hX], HousesInfo[i][hY] ,HousesInfo[i][hZ]);
SetPlayerVirtualWorld(playerid, 0);
}
}
}
PHP:
stock LoadHouses() // Загрузка домов
{
new iniFile = ini_openFile("House/config.ini");
ini_getInteger(iniFile,"Houses",AllHouse);
ini_closeFile(iniFile);
new arrCoords[10][64];
new strFromFile2[256];
new File: file = fopen("House/houses.cfg", io_read);
if(file)
{
new idx;
while (idx < AllHouse)
{
fread(file, strFromFile2);
split(strFromFile2, arrCoords, ',');
HousesInfo[idx][hOwned] = strval(arrCoords[0]);
strmid(HousesInfo[idx][hOwner], arrCoords[1], 0, strlen(arrCoords[1]), 255);
HousesInfo[idx][hX] = floatstr(arrCoords[2]);
HousesInfo[idx][hY] = floatstr(arrCoords[3]);
HousesInfo[idx][hZ] = floatstr(arrCoords[4]);
HousesInfo[idx][hInterior] = strval(arrCoords[5]);
HousesInfo[idx][hVirtWorld] = strval(arrCoords[6]);
HousesInfo[idx][hPrice] = strval(arrCoords[7]);
HousesInfo[idx][hLock] = strval(arrCoords[8]);
HousesInfo[idx][hLevel] = strval(arrCoords[9]);
idx++;
}
printf("- Дома загружены - %d",idx);
fclose(file);
}
return 1;
}
stock SaveHouses() // Сохранение домов
{
new iniFile = ini_openFile("House/config.ini");
ini_setInteger(iniFile,"Houses",AllHouse);
ini_closeFile(iniFile);
new idx;
new File: file2;
while(idx < AllHouse)
{
new coordsstring[300];
format(coordsstring, sizeof(coordsstring), "%d,%s,%f,%f,%f,%d,%d,%d,%d,%d\n",
HousesInfo[idx][hOwned],
HousesInfo[idx][hOwner],
HousesInfo[idx][hX],
HousesInfo[idx][hY],
HousesInfo[idx][hZ],
HousesInfo[idx][hInterior],
HousesInfo[idx][hVirtWorld],
HousesInfo[idx][hPrice],
HousesInfo[idx][hLock],
HousesInfo[idx][hLevel]);
if(!idx) file2 = fopen("House/houses.cfg", io_write);
else file2 = fopen("House/houses.cfg", io_append);
fwrite(file2, coordsstring);
idx++;
fclose(file2);
}
return 1;
}
stock UpdateHouse(h)
{
new string[128];
DestroyDynamicMapIcon(houses_icon[h]);
DestroyPickup(houses_pickup[h]);
if(HousesInfo[h][hOwned] == 0)
{
format(string,sizeof(string), "Дом №%d продаётся\n\nСтоимость: %d$\nУровень: %d\nЧтобы купить, введите /buyhouse",h,HousesInfo[h][hPrice],HousesInfo[h][hLevel]);
Update3DTextLabelText(houses_text[h], 0xFFFFFFFF, string);
houses_icon[h] = CreateDynamicMapIcon(HousesInfo[h][hX], HousesInfo[h][hY],HousesInfo[h][hZ], 31, COLOR_WHITE, 0, -1, -1, 400.0);
houses_pickup[h] = CreatePickup(1273, 23, HousesInfo[h][hX], HousesInfo[h][hY],HousesInfo[h][hZ]);
}
else if(HousesInfo[h][hOwned] == 1)
{
format(string,sizeof(string), "Дом №%d\n\nУровень: %d\nВладелец: %s",h,HousesInfo[h][hLevel],HousesInfo[h][hOwner]);
Update3DTextLabelText(houses_text[h], 0xFFFFFFFF, string);
houses_icon[h] = CreateDynamicMapIcon(HousesInfo[h][hX], HousesInfo[h][hY],HousesInfo[h][hZ], 32, COLOR_WHITE, 0, -1, -1, 400.0);
houses_pickup[h] = CreatePickup(1272, 23, HousesInfo[h][hX], HousesInfo[h][hY],HousesInfo[h][hZ]);
}
}
Последнее редактирование:
