Наши коллбэки созданы. Кстати, чуть не забыл, ID купленного дома сохранятся в аккаунте игрока, поэтому, где `enum pInfo` или что-либо подобное прописываем `pHouseKey`. Эта переменная отвечает за ID купленного дома. По умолчанию эта переменная должны быть равна `-1`. Ладно, двигаемся дальше
В функцию, отвечающую за спавн игрока, или в `public OnPlayerSpawn(playerid)` прописываем следующее:
Код
if(PlayerInfo[playerid] [pHouseKey]!= -1) { new h = PlayerInfo[playerid][pHouseKey]; SetPlayerPosAC(playerid,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]); SetPlayerFacingAngle(playerid,270.0000); SetPlayerInterior(playerid,HouseInfo[h][hInt]); SetPlayerVirtualWorld(playerid,h+50); }
Дальше мы создадим функцию, отвечающую за обновление 3D Текстов
Код
stock Update3DTexts() { new string[128]; for(new i = 1; i <= TOTALHOUSES; i++) { new klass[2]; DestroyDynamicMapIcon(HouseInfo[idx][hIconID]); DestroyPickup(HouseInfo[idx][hPickupID]); Delete3DTextLabel(HouseInfo[idx][hTextID]); if(HouseInfo[idx] [hOwned]== 0) { HouseInfo[idx] [hPickupID]= CreatePickupAC(1273, 23, HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],-1); HouseInfo[idx] [hIconID]= CreateDynamicMapIcon(HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ], 31, COLOR_WHITE, 0, -1, -1, 100.0); switch(HouseInfo[idx][hClass]) { case 0: klass = "E"; case 1: klass = "D"; case 2: klass = "C"; case 3: klass = "B"; case 4: klass = "A"; case 5: klass = "S"; } format(string,sizeof(string),"Номер дома: %i\nЦена: %i долларов\nКласс: %s",idx,HouseInfo[idx][hPrice],klass); HouseInfo[idx] [hTextID]= Create3DTextLabel(string,COLOR_YELLOW,HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],20.0,0,1); } else { HouseInfo[idx] [hPickupID]= CreatePickupAC(1272, 23, HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],-1); HouseInfo[idx] [hIconID]= CreateDynamicMapIcon(HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ], 32, COLOR_WHITE, 0, -1, -1, 100.0); switch(HouseInfo[idx][hClass]) { case 0: klass = "E"; case 1: klass = "D"; case 2: klass = "C"; case 3: klass = "B"; case 4: klass = "A"; case 5: klass = "S"; } format(string,sizeof(string),"Номер дома: %i\nВладелец: %s\nКласс: %s",idx,HouseInfo[idx][hOwner],klass); HouseInfo[idx] [hTextID]= Create3DTextLabel(string,COLOR_LIGHTRED,HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],20.0,0,1); } } }
Ну, мы практически подошли к концу, осталось только создать команды. Я использовал командный процессор от Kazon'a "LIFE-CMD".
CMD:buyhouse(playerid,params[]) { if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться"); if(PlayerInfo[playerid] [pHouseKey]!= -1) return SendMes(playerid,COLOR_GRAD1," У вас уже есть дом. Введите /sellhouse, чтобы его продать"); for(new h = 1; h <= TOTALHOUSES; h++) { if(IsPlayerInRangeOfPoint(playerid,2.0,HouseInfo[h][hEnterX],HouseInfo[h][hEnterY],HouseInfo[h][hEnterZ])) { if(HouseInfo[h] [hOwned]== 1) SendMes(playerid,COLOR_GRAD2,"В этом доме уже кто-то проживает"); if(PlayerInfo[playerid] [pBank]< HouseInfo[h][hPrice]) return SendMes(playerid,COLOR_GRAD1," У вас недостаточно денег на покупку дома"); PlayerInfo[playerid] [pHouseKey]= h; HouseInfo[h] [hOwned]= 1; HouseInfo[h] [hHel]= 0; HouseInfo[h] [hTakings]= 50*(HouseInfo[h][hClass]+1)*2; strmid(HouseInfo[h][hOwner], PlayerInfo[playerid][pNick], 0, strlen(PlayerInfo[playerid][pNick]), 255); PlayerInfo[playerid] [pBank]-= HouseInfo[h][hPrice]; SetPlayerPosAC(playerid,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]); SetPlayerInterior(playerid,HouseInfo[h][hInt]); SetPlayerVirtualWorld(playerid,h+50); SendMes(playerid,COLOR_WHITE," Поздравляем с покупкой!"); SendMes(playerid,COLOR_YELLOW," Внимание! Теперь каждый час со счёта вашего дома будут снимать комунальные платежи в размере %i долларов",50*(HouseInfo[h][hClass]+1)); SendMes(playerid,COLOR_YELLOW," Если на счету недостаточно денег, вас выселят"); SendMes(playerid,COLOR_YELLOW," Пополнить домашний счёт или узнать баланс можно через банк/банкомат (помощь: /help -> команды)"); Update3DTexts(); OnHouseSave(h); break; } } return true; } CMD:sellhouse(playerid,params[]) { if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться"); if(PlayerInfo[playerid] [pHouseKey]== -1) return SendMes(playerid,COLOR_GRAD1," В не владеете недвижимостью"); new h = PlayerInfo[playerid][pHouseKey]; PlayerInfo[playerid] [pHouseKey]= -1; strmid(HouseInfo[h][hOwner], "The State", 0, strlen("The State"), 255); PlayerInfo[playerid] [pBank]+= HouseInfo[h][hPrice]+HouseInfo[h][hTakings]; HouseInfo[h] [hOwned]= 0; HouseInfo[h] [hHel]= 0; HouseInfo[h] [hTakings]= 0; HouseInfo[h] [hLock]= 1; SendMes(playerid,COLOR_LIGHTGREEN," Поздравляем вас с продажей дома!"); SendMes(playerid,COLOR_WHITE," Выручка с продажи дома составила %i долларов",HouseInfo[h][hPrice]); SendMes(playerid,COLOR_WHITE," Деньги были переведены на ваш банковский счет"); Update3DTexts(); OnHouseSave(h); return true; } CMD:open(playerid,params[]) { if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться"); if(PlayerInfo[playerid] [pHouseKey]== -1) return SendMes(playerid,COLOR_GRAD1," В не владеете недвижимостью"); new h = PlayerInfo[playerid][pHouseKey]; if(IsPlayerInRangeOfPoint(playerid,5.0,HouseInfo[h][hEnterX],HouseInfo[h][hEnterY],HouseInfo[h][hEnterZ])) { switch(HouseInfo[h][hLock]) { case 0: { HouseInfo[h] [hLock]= 1; GameTextForPlayer(playerid,"~w~HOUSE ~r~CLOSE",5000,1); } case 1: { HouseInfo[h] [hLock]= 0; GameTextForPlayer(playerid,"~w~HOUSE ~g~OPEN",5000,1); } } } else { SendMes(playerid,COLOR_GRAD1," Необходимо находиться возле своего дома"); return true; } return true; } CMD:enter(playerid,params[]) { if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться"); for(new h = 1; h <= TOTALHOUSES; h++) { if(IsPlayerInRangeOfPoint(playerid,5.0,HouseInfo[h][hEnterX],HouseInfo[h][hEnterY],HouseInfo[h][hEnterZ])) { if(HouseInfo[h] [hLock]== 0) { SetPlayerPosAC(playerid,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]); SetPlayerInterior(playerid,HouseInfo[h][hInt]); SetPlayerVirtualWorld(playerid,h+50); return true; } else return GameTextForPlayer(playerid,"~r~CLOSED",5000,1); } } return true; } CMD:exit(playerid,params[]) { if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться"); for(new h = 1; h <= TOTALHOUSES; h++) { if(IsPlayerInRangeOfPoint(playerid,5.0,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]) && GetPlayerVirtualWorld(playerid) == h+50) { SetPlayerPosAC(playerid,HouseInfo[h][hEnterX],HouseInfo[h][hEnterY],HouseInfo[h][hEnterZ]); SetPlayerInterior(playerid,0); SetPlayerVirtualWorld(playerid,0); return true; } } return true; } CMD:healme(playerid,params[]) { if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться"); for(new h = 1; h <= TOTALHOUSES; h++) { if(IsPlayerInRangeOfPoint(playerid,5.0,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]) && GetPlayerVirtualWorld(playerid) == h+50) { new Float:health; GetPlayerHealth(playerid,health); if(health >= 100) return SendMes(playerid,COLOR_WHITE," Вы не нуждаетесь в лечении"); if(HouseInfo[h] [hHel]< 1) return SendMes(playerid,COLOR_WHITE," В этом доме нет аптечек"); SetPlayerHealthAC(playerid,100.0); HouseInfo[h][hHel]--; if(!strcmp(HouseInfo[h][hOwner],PlayerInfo[playerid][pNick],false)) SendMes(playerid,COLOR_BLUE," Вы использовали одну аптечку. Осталось аптечек: %i",HouseInfo[h][hHel]); else SendMes(playerid,COLOR_BLUE," Вы использовали одну аптечку"); format(ministring,sizeof(ministring)," %s использовал аптечку",PlayerInfo[playerid][pNick]); ProxDetectorNew(30.0,playerid,ministring,COLOR_PURPLE); return true; } } SendMes(playerid,COLOR_GRAD1," Вы должны находиться в каком-либо доме"); return true; } CMD:hinfo(playerid,params[]) { if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться"); for(new h = 1; h <= TOTALHOUSES; h++) { if(IsPlayerInRangeOfPoint(playerid,5.0,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]) && GetPlayerVirtualWorld(playerid) == h+50) { if(strcmp(HouseInfo[h][hOwner],PlayerInfo[playerid][pNick],false) != 0) return SendMes(playerid,COLOR_GRAD1," Вы не можете посмотреть информацию о этом доме"); format(bigstring,sizeof(bigstring),"{ffffff}Информация о доме\n\n\tСостояние: %s\n\tАптечек: {33aaff}%i{ffffff} штук\n\tДомашний счет: {33aaff}%i{ffffff} долларов",!HouseInfo[h] [hLock]? ("{33aa33}Открыт{ffffff}") : ("{ff6347}Закрыт{ffffff}"),HouseInfo[h][hHel],HouseInfo[h][hTakings]); ShowPlayerDialog(playerid,D_NULL,DIALOG_STYLE_MSGBOX," ",bigstring,"Закрыть",""); return true; } } SendMes(playerid,COLOR_GRAD1," Вы должны находиться в каком-либо доме"); return true; }
На этом все, возникнут проблемы/ошибки - обращайтесь! ЗЫ: Тут не сделана система платежей за квартиру и система снятия денег с домашнего счета, так как я не знаю, как у вас реализован банкомат банк и пэйдэй.