Представляю вам Динамическую систему домов, Для ДМ или ТДМ, думаю пойдёт!
Описание:
/sellhouse - Продать дом. /addhouse - Добавить дом прям из игры.

Вход/Выход из дома на /enter /exit.(Alt)!
При создании дома, Выберается Интерьер(Random), и ID.
Начинаем, ко Дефайн
#define publics:%0(%1) forward %0(%1); \ public %0(%1)

Ко все форвард
forward SaveStuff();

new
new Property = 160;// Кол-во домов new Float:Propexit[10][3] = { {140.25939941406,1366.2185058594,1083.859375}, {2317.7861328125,-1026.9718017578,1050.2177734375}, {2365.2104492188,-1135.6337890625,1050.8825683594}, {2282.9489746094,-1140.1695556641,1050.8984375}, {2196.8657226563,-1204.4061279297,1049.0234375}, {2270.3344726563,-1210.5197753906,1047.5625}, {2308.7983398438,-1212.7666015625,1049.0234375}, {2237.5236816406,-1081.6125488281,1049.0234375}, {2333.10546875,-1077.15625,1049.0234375}, {2.0533,-3.1624,999.4284} }; new Propinterior[10] = { 5,9,8,11,6,10,6,2,6,2 };

enum pinfo
pPhousekey,

OnPlayerConnect
PlayerInfo[playerid][pPhousekey] = 0;

OnPlayerSave
format(var, 32, "PropertyHouse=%d\n",PlayerInfo[playerid][pPhousekey]);fwrite(hFile, var);

Паблик
public SaveStuff() { new iniFile = ini_openFile ("stuff.ini"); ini_setInteger(iniFile, "Property", Property); ini_closeFile(iniFile); return 1; }

Enum
enum hInfo { Float:hEntarcex,// Вход x Float:hEntarcey,// Вход y Float:hEntarcez,// Вход z Float:hExistx,// Выход x Float:hExisty,// Выход y Float:hExistz,// Выход z hId,// ID дома hOwner[MAX_PLAYER_NAME],// %s Владелец hValue, // Цена hInterior, // Интерьер hLock,// Закрыта/Открыта hOwned,// Владелец Text3D: hLabel,// 3D-Text hPickup,// Пикап hMIcon// Иконка }; new HouseInfo[160][hInfo];// Кол-во домов.

GameModeInit()
LoadProperty(); SaveProperty(); SaveStuff(); for(new h = 0; h < sizeof(HouseInfo); h++) { new text[600]; if(HouseInfo[h][hOwned] == 0)// { format(text,sizeof(text),"{FF6600}Дом доступен для покупки\nНомер дома: [%d]\nСтоимость дома: [$%d]\nДля покупки, [/buyhouse]",h,HouseInfo[h][hValue]); HouseInfo[h][hMIcon] = CreateMapIcon(31, COLOR_WHITE,HouseInfo[h][hEntarcex], HouseInfo[h][hEntarcey], HouseInfo[h][hEntarcez]); HouseInfo[h][hPickup] = CreatePickup(1272, 23, HouseInfo[h][hEntarcex], HouseInfo[h][hEntarcey], HouseInfo[h][hEntarcez],-1); } else if(HouseInfo[h][hOwned] == 1) // Куплен { format(text,sizeof(text),"{0066B3}Номер дома: [%d]\nВладелец дома: [%s]\nСтоимость дома: [$%d]\nАренда дома: [Недоступна]",h,HouseInfo[h][hOwner],HouseInfo[h][hValue]); Update3DTextLabelText(HouseInfo[h][hLabel], 0xFFFFFFFF, text); HouseInfo[h][hMIcon] = CreateMapIcon(32, COLOR_WHITE,HouseInfo[h][hEntarcex], HouseInfo[h][hEntarcey], HouseInfo[h][hEntarcez]); HouseInfo[h][hPickup] = CreatePickup(1239, 23, HouseInfo[h][hEntarcex], HouseInfo[h][hEntarcey], HouseInfo[h][hEntarcez],-1); } HouseInfo[h][hLabel] = Create3DTextLabel(text,0xFFFFFFFF,HouseInfo[h][hEntarcex],HouseInfo[h][hEntarcey],HouseInfo[h][hEntarcez] +1,20.0,0,1); }

Теперь комманды,
//=====================================[/Open/Exit]============================= if(strcmp(cmd, "/enter", true) == 0) { if(IsPlayerConnected(playerid)) { for(new i = 0; i < Property; i++) { if (IsPlayerInRangeOfPoint(playerid,1,HouseInfo[i][hEntarcex], HouseInfo[i][hEntarcey], HouseInfo[i][hEntarcez])) { if(PlayerInfo[playerid][pPhousekey] == i+1 || HouseInfo[i][hLock] == 0) { SetPlayerInterior(playerid,HouseInfo[i][hInterior]); ServerSetPlayerPos(playerid,HouseInfo[i][hExistx],HouseInfo[i][hExisty],HouseInfo[i][hExistz]); GameTextForPlayer(playerid, "~b~Welcome to Home", 5000, 1); SetPlayerVirtualWorld(playerid,HouseInfo[i][hId]); } else { GameTextForPlayer(playerid, "~r~Lock House", 5000, 1); } } } } return 1; } if(strcmp(cmd, "/exit", true) == 0) { if(IsPlayerConnected(playerid)) { for(new i = 0; i < Property; i++) { if (IsPlayerInRangeOfPoint(playerid,1,HouseInfo[i][hExistx], HouseInfo[i][hExisty], HouseInfo[i][hExistz]) && GetPlayerVirtualWorld(playerid) == HouseInfo[i][hId]) { SetPlayerInterior(playerid,0); ServerSetPlayerPos(playerid,HouseInfo[HouseInfo[i][hId]-1][hEntarcex],HouseInfo[HouseInfo[i][hId]-1] [hEntarcey],HouseInfo[HouseInfo[i][hId]-1][hEntarcez]); SetPlayerVirtualWorld(playerid,0); if(PlayerInfo[playerid][pPhousekey] == HouseInfo[i][hId]) { new Float:tempheal; GetPlayerHealth(playerid,tempheal); if(tempheal < 100.0) { ServerGivePlayerHealth(playerid,100.0); } } } } } return 1; } if(strcmp(cmd, "/buyhouse", 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 < Property; h++) { if(IsPlayerInRangeOfPoint(playerid, 2.0, HouseInfo[h][hEntarcex], HouseInfo[h][hEntarcey], HouseInfo[h][hEntarcez]) && HouseInfo[h][hOwned] == 0) { if(PlayerInfo[playerid][pPhousekey] != 0 && strcmp(playername, HouseInfo[PlayerInfo[playerid][pPhousekey]-1][hOwner], true) == 0) return SendClientMessage(playerid, COLOR_WHITE, "У вас уже есть дом, используйте /sellhouse чтобы продать его!"); if(GetPlayerMoney(playerid) < HouseInfo[h][hValue]) return SendClientMessage(playerid, COLOR_WHITE, "[House] У вас нет такой суммы."); PlayerInfo[playerid][pPhousekey] = HouseInfo[h][hId]; HouseInfo[h][hOwned] = 1; GetPlayerName(playerid, sendername, sizeof(sendername)); strmid(HouseInfo[h][hOwner], sendername, 0, strlen(sendername), 255); GivePlayerMoney(playerid,-HouseInfo[h][hValue]); SetPlayerInterior(playerid,HouseInfo[h][hInterior]); ServerSetPlayerPos(playerid,HouseInfo[h][hExistx],HouseInfo[h][hExisty],HouseInfo[h][hExistz]); SetPlayerVirtualWorld(playerid,HouseInfo[h][hId]); UpdateHouse(h); SendClientMessage(playerid, COLOR_BLUE, "[House] Поздравляю, Вы купили себе новый дом."); SaveProperty(); OnPlayerSave(playerid); return 1; } } } return 1; } if(strcmp(cmd, "/sellhouse", true) == 0) { if(IsPlayerConnected(playerid)) { GetPlayerName(playerid, playername, sizeof(playername)); if(PlayerInfo[playerid][pPhousekey] == 0) return SendClientMessage(playerid, COLOR_BLUE, "[House] У вас нет дома."); if(PlayerInfo[playerid][pPhousekey] != 0 && strcmp(playername, HouseInfo[PlayerInfo[playerid][pPhousekey]-1][hOwner], true) == 0) { new house = PlayerInfo[playerid][pPhousekey]-1; HouseInfo[house][hLock] = 0; HouseInfo[house][hOwned] = 0; GetPlayerName(playerid, sendername, sizeof(sendername)); strmid(HouseInfo[house][hOwner], "The State", 0, strlen("The State"), 255); GivePlayerMoney(playerid,HouseInfo[house][hValue]*4/5); PlayerInfo[playerid][pPhousekey] = 0; if(GetPlayerInterior(playerid) == HouseInfo[house][hInterior]) { SetPlayerInterior(playerid,0); ServerSetPlayerPos(playerid,HouseInfo[house][hEntarcex],HouseInfo[house][hEntarcey],HouseInfo[house][hEntarcez] ); SetPlayerVirtualWorld(playerid,0); } UpdateHouse(house); SaveProperty(); OnPlayerSave(playerid); SendClientMessage(playerid, COLOR_BLUE, "[House] Вы успешно продали свой мод."); return 1; } else { SendClientMessage(playerid, COLOR_BLUE, "[House] У вас нет дома."); } } return 1; } if(strcmp(cmd, "/addhouse", true) == 0) { if ((PlayerInfo[playerid][pAdmin] >= 6)) return SendClientMessage(playerid,COLOR_GREY,"Нет доступа!"); cmd = strtok(cmdtext, idx); if(!strlen(cmd)) return SendClientMessage(playerid, COLOR_WHITE, "[House] /addhouse 0,1,2,3[Выберите интерьер], [ID дома]."); new level = strval(cmd); new cost; cmd = strtok(cmdtext, idx); if(!strlen(cmd)) return SendClientMessage(playerid, COLOR_WHITE, "[House] /addhouse 0,1,2,3[Выберите интерьер], [ID дома]."); new id = strval(cmd) -1; new inter; if(level == 0) { inter = 9; cost = 250000; } else if(level == 1) { inter = 2+random(6); if(inter == 2) cost = (10+random(3))*50000; if(inter == 3) cost = (5+random(2))*50000; if(inter == 4) cost = (7+random(3))*50000; if(inter == 5) cost = (6+random(2))*50000; if(inter == 6) cost = (5+random(2))*50000; if(inter == 7) cost = (6+random(2))*50000; if(inter == 8) cost = (6+random(2))*50000; } else if(level == 2) { inter = 0; cost = (12+random(3))*50000; if(inter == 1) cost = (13+random(4))*50000; } else if(level == 3) { inter = 1; cost = (13+random(4))*50000; } else return SendClientMessage(playerid, COLOR_GREY, "[Random] Interiors: 0,1,2,3[Выберите интерьер]."); new Float:X,Float:Y,Float:Z; GetPlayerPos(playerid,X,Y,Z); if(id+1 > Property) Property += 1; HouseInfo[id][hEntarcex] = X; HouseInfo[id][hEntarcey] = Y; HouseInfo[id][hEntarcez] = Z; HouseInfo[id][hValue] = cost; HouseInfo[id][hOwned] = 0; HouseInfo[id][hId] = id+1; HouseInfo[id][hOwner][0] = 0; HouseInfo[id][hExistx] = Propexit[inter][0]; HouseInfo[id][hExisty] = Propexit[inter][1]; HouseInfo[id][hExistz] = Propexit[inter][2]; HouseInfo[id][hInterior] = Propinterior[inter]; HouseInfo[id][hLock] = 0; strmid(HouseInfo[id][hOwner], "The State", 0, strlen("The State"), 255); new text[600]; format(text,sizeof(text),"{FF6600}Дом доступен для покупки\nНомер дома: [%d]\nСтоимость дома: [$%d]\nДля покупки, [/buyhouse]",id,HouseInfo[id][hValue]); HouseInfo[id][hLabel] = Create3DTextLabel(string,COLOR_GREEN,HouseInfo[id][hEntarcex], HouseInfo[id][hEntarcey], HouseInfo[id][hEntarcez]+1.2,15.0,0); HouseInfo[idx][hMIcon] = CreateDynamicMapIcon(HouseInfo[id][hEntarcex], HouseInfo[id][hEntarcey], HouseInfo[id][hEntarcez], 31, COLOR_WHITE, 0, -1, -1, 400.0); HouseInfo[id][hPickup] = CreatePickup(1272, 23, HouseInfo[id][hEntarcex], HouseInfo[id][hEntarcey], HouseInfo[id][hEntarcez],-1); SaveProperty(); SaveStuff(); UpdateHouse(id); format(string,sizeof(string),"Дом создан, ID дома: [%d] | Цена дома: [%d]",HouseInfo[id][hId],HouseInfo[id][hValue]); return SendClientMessage(playerid, COLOR_BLUE, string); }

В OnPlayerLogin
for(new home =0 ; home < Property; home++) { if(!strcmp(HouseInfo[home][hOwner],PlayerName,true) && HouseInfo[home][hOwned] == 1) PlayerInfo[playerid][pPhousekey] = home+1; }

OnPLayerSpawn
if(PlayerInfo[playerid][pPhousekey] != 0) { if(SpawnChange[playerid]) //If 1, then you get to your house, else spawn somewhere else { SetCameraBehindPlayer(playerid); SetPlayerPos(playerid,HouseInfo[PlayerInfo[playerid][pPhousekey]-1][hExistx],HouseInfo[PlayerInfo[playerid] [pPhousekey]-1][hExisty],HouseInfo[PlayerInfo[playerid][pPhousekey]-1][hExistz]); SetPlayerInterior(playerid,HouseInfo[PlayerInfo[playerid][pPhousekey]-1][hInterior]); SetPlayerVirtualWorld(playerid,HouseInfo[PlayerInfo[playerid][pPhousekey]-1][hId]); return 1; } }

Теперь в конец мода:
stock UpdateHouse(idx) { new text[600]; DestroyMapIcon(HouseInfo[idx][hMIcon]); DestroyPickup(HouseInfo[idx][hPickup]); if(HouseInfo[idx][hOwned] == 0) { format(text,sizeof(text),"{FF6600}Дом доступен для покупки\nНомер дома: [%d]\nСтоимость дома: [$%d]\nДля покупки, [/buyhouse]",idx,HouseInfo[idx][hValue]); HouseInfo[idx][hMIcon] = CreateMapIcon(31, COLOR_WHITE,HouseInfo[idx][hEntarcex], HouseInfo[idx][hEntarcey], HouseInfo[idx][hEntarcez]); HouseInfo[idx][hPickup] = CreatePickup(1272, 23, HouseInfo[idx][hEntarcex], HouseInfo[idx][hEntarcey], HouseInfo[idx][hEntarcez],-1); } else if(HouseInfo[idx][hOwned] == 1) { format(text,sizeof(text),"{0066B3}Номер дома: [%d]\nВладелец дома: [%s]\nСтоимость дома: [$%d]\nАренда дома: [Недоступна]",idx,HouseInfo[idx][hOwner],HouseInfo[idx][hValue]); Update3DTextLabelText(HouseInfo[idx][hLabel], 0xFFFFFFFF, text); HouseInfo[idx][hMIcon] = CreateMapIcon(32, COLOR_WHITE,HouseInfo[idx][hEntarcex], HouseInfo[idx][hEntarcey], HouseInfo[idx][hEntarcez]); HouseInfo[idx][hPickup] = CreatePickup(1239, 23, HouseInfo[idx][hEntarcex], HouseInfo[idx][hEntarcey], HouseInfo[idx][hEntarcez],-1); } Update3DTextLabelText(HouseInfo[idx][hLabel], 0xFFFFFFFF, text); } publics:SaveProperty() { new i; new File:houses; while(i < Property) { new string[288]; format(string, sizeof(string), "%d,%f,%f,%f,%f,%f,%f,%d,%d,%s,%d,%d,%d\r\n", HouseInfo[i][hId], HouseInfo[i][hEntarcex], HouseInfo[i][hEntarcey], HouseInfo[i][hEntarcez], HouseInfo[i][hExistx], HouseInfo[i][hExisty], HouseInfo[i][hExistz], HouseInfo[i][hInterior], HouseInfo[i][hOwned], HouseInfo[i][hOwner], HouseInfo[i][hValue], HouseInfo[i][hLock]); if(i == 0) { houses = fopen("property.cfg", io_write); } else { houses = fopen("property.cfg", io_append); } fwrite(houses, string); i++; fclose(houses); } i = 0; return 1; } publics:LoadProperty() { new string[288]; new arrCoords[12][46]; new File:houses = fopen("property.cfg", io_read); new i; if(houses) { while(i < Property) { fread(houses, string); split(string, arrCoords, ','); HouseInfo[i][hId] = strval(arrCoords[0]); HouseInfo[i][hEntarcex] = floatstr(arrCoords[1]); HouseInfo[i][hEntarcey] = floatstr(arrCoords[2]); HouseInfo[i][hEntarcez] = floatstr(arrCoords[3]); HouseInfo[i][hExistx] = floatstr(arrCoords[4]); HouseInfo[i][hExisty] = floatstr(arrCoords[5]); HouseInfo[i][hExistz] = floatstr(arrCoords[6]); HouseInfo[i][hInterior] = strval(arrCoords[7]); HouseInfo[i][hOwned] = strval(arrCoords[8]); strmid(HouseInfo[i][hOwner], arrCoords[9], false, strlen(arrCoords[9]), MAX_PLAYER_NAME+1); HouseInfo[i][hValue] = strval(arrCoords[10]); HouseInfo[i][hLock] = strval(arrCoords[11]); printf("PropertyInfo: [%d] | Владелец: [%s] | Цена: [%d]",i,HouseInfo[i][hOwner],HouseInfo[i][hValue]); i++; } } fclose(houses); return 1; }

-------------------------------------------------------------------------------------------------------------
Аа, кстати незабываем создать property.cfg в папке scriptfiles
Ну вот и всё, Написали за 2-дня!
Авторы: Jeff_Hardy | DeN_Bellik
P.S. Указал 2-рого автора, Потомучто помог исправить баг, После рестарта слетали мода не сохранялись!
Кому понадобилось ставим +