Advertisement
kaZax

[FS] House System MYSQL

Oct 21st, 2013
1,020
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 16.46 KB | None | 0 0
  1. #include <a_samp>
  2. #include <a_mysql>
  3. #include <streamer>
  4.  
  5. // House System by kaZax
  6.  
  7. // 03.09.2013
  8.  
  9. // SAMP-RU.ORG
  10.  
  11. #define MAX_HOUSES 100
  12.  
  13. #define DIALOG_BUYHOUSE  600
  14. #define DIALOG_HOUSEINFO 601
  15. #define DIALOG_HOUSEMENU 602
  16. #define DIALOG_INTERIORS 603
  17. #define DIALOG_COSTINFO  604
  18. #define DIALOG_WRITENAME 605
  19.  
  20. #define white            0xFFFFFFFF
  21. #define green            0x00FF00FF
  22. #define red              0xFF0000FF
  23.  
  24. #define SQL_HOST         "localhost"
  25. #define SQL_DB           "sss"
  26. #define SQL_USER         "sss"
  27. #define SQL_PASS         "sss"
  28. #define SQL_DEBUG
  29.  
  30. enum HOUSEDATA
  31. {
  32.     owner[24],
  33.     cost,
  34.     interior,
  35.     Float:hx,
  36.     Float:hy,
  37.     Float:hz,
  38.     pickup,
  39.     Text3D:txt,
  40.     name[24],
  41.     lock
  42. };
  43. enum PLAYERDATA
  44. {
  45.     HouseID,
  46.     CurrentID,
  47.     bool:HaveHouse
  48. };
  49.  
  50. new pstruct[MAX_PLAYERS][PLAYERDATA];
  51. new struct[MAX_HOUSES][HOUSEDATA];
  52.  
  53. new houses;
  54.  
  55. public OnFilterScriptInit()
  56. {
  57.     mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS);
  58.     if(mysql_ping()) print("MySQL соединение установлено!");
  59.     mysql_query("SET NAMES 'cp1251'");
  60.     mysql_query("SET CHARACTER SET 'cp1251'");
  61.  
  62.     #if defined SQL_DEBUG
  63.     mysql_debug(1);
  64.     #endif
  65.     LoadAllHousesFromDB();
  66.     DisableInteriorEnterExits();
  67.     return 1;
  68. }
  69. public OnFilterScriptExit()
  70. {
  71.     SaveAllHousesToDB();
  72.     mysql_close();
  73.     return 1;
  74. }
  75. public OnPlayerConnect(playerid)
  76. {
  77.     FindPlayerHouse(playerid);
  78.     GivePlayerMoney(playerid,100000);
  79.     return 1;
  80. }
  81. public OnPlayerCommandText(playerid, cmdtext[])
  82. {
  83.     new p[2][128], cmd[128], idx;
  84.     cmd = strtok(cmdtext, idx);
  85.     if(!strcmp(cmd,"/housemenu",true))
  86.     {
  87.         ShowPlayerHouseMenu(playerid);
  88.         return 1;
  89.     }
  90.     if(!strcmp(cmd,"/exit",true))
  91.     {
  92.         if(pstruct[playerid][CurrentID] == INVALID_PLAYER_ID)return SendClientMessage(playerid,red,"Вы не входили в дом!");
  93.         SetPlayerPosIntVW(playerid,struct[pstruct[playerid][CurrentID]][hx],struct[pstruct[playerid][CurrentID]][hy],struct[pstruct[playerid][CurrentID]][hz],0,0);
  94.         pstruct[playerid][CurrentID] = INVALID_PLAYER_ID;
  95.         SendClientMessage(playerid,white,"Вы вышли из дома");
  96.         return 1;
  97.     }
  98.     if(!strcmp(cmd, "/savebase", true))
  99.     {
  100.         if(!IsPlayerAdmin(playerid))return SendClientMessage(playerid,white,"Вы не Rcon администратор!");
  101.         SaveAllHousesToDB();
  102.         SendClientMessage(playerid,white,"База данных успешно сохранена.");
  103.         return 1;
  104.     }
  105.     if(!strcmp(cmd, "/deletehouse", true))
  106.     {
  107.         if(!IsPlayerAdmin(playerid))return SendClientMessage(playerid,white,"Вы не Rcon администратор!");
  108.         p[0] = strtok(cmdtext,idx);
  109.         if(!strlen(p[0]))return SendClientMessage(playerid,white,"CMD: /deletehouse [id]");
  110.         if(strval(p[0]) < 0)return SendClientMessage(playerid,white,"ID не меньше 0!");
  111.         DestroyDynamic3DTextLabel(struct[strval(p[0])][txt]);
  112.         DestroyDynamicPickup(struct[strval(p[0])][pickup]);
  113.         struct[strval(p[0])][cost] = 0;
  114.         SaveAllHousesToDB();
  115.         return 1;
  116.     }
  117.     if(!strcmp(cmd, "/ch", true))
  118.     {
  119.         if(!IsPlayerAdmin(playerid))return SendClientMessage(playerid,white,"Вы не Rcon администратор!");
  120.         if(houses == MAX_HOUSES)return SendClientMessage(playerid,white,"Лимит домов !");
  121.         p[0] = strtok(cmdtext, idx);
  122.         if(!strlen(p[0]))return SendClientMessage(playerid,white,"CMD: /ch [цена] [интерьер]");
  123.         if(strval(p[0]) < 1)return SendClientMessage(playerid,white,"Цена не ниже {00ff00}$1");
  124.         struct[houses][cost] = strval(p[0]);
  125.         p[1] = strtok(cmdtext,idx);
  126.         if(!strlen(p[1]))return SendClientMessage(playerid,white,"CMD: /ch [цена] [интерьер]");
  127.         if(strval(p[1]) > 6 || strval(p[1]) < 1)return SendClientMessage(playerid,white,"Интерьер от 1 до 6");
  128.         struct[houses][interior] = strval(p[1]);
  129.         new Float:pp[3], str[128];
  130.         GetPlayerPos(playerid,pp[0],pp[1],pp[2]);
  131.         struct[houses][hx] = pp[0];
  132.         struct[houses][hy] = pp[1];
  133.         struct[houses][hz] = pp[2];
  134.         format(struct[houses][name],24,"HouseName");
  135.         format(struct[houses][owner],24,"None");
  136.         format(str,sizeof(str),"ID: %d\nДом на продаже!\nЦена: $%d",houses,struct[houses][cost]);
  137.         struct[houses][txt] = CreateDynamic3DTextLabel(str, white, pp[0],pp[1],pp[2],20.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,0,-1,-1,-1,20.0);       
  138.         struct[houses][pickup] = CreateDynamicPickup(1273, 23, pp[0],pp[1],pp[2],-1,-1,-1,20.0);
  139.         format(str,sizeof(str),"House # {ffffff}%d{00ff00} created",houses);
  140.         houses++;
  141.         SendClientMessage(playerid,green,str);
  142.         SaveAllHousesToDB();
  143.         return 1;
  144.     }
  145.     return 0;
  146. }
  147. public OnPlayerPickUpDynamicPickup(playerid, pickupid)
  148. {
  149.     for(new id;id<MAX_HOUSES;id++)
  150.     {
  151.         if(pickupid == struct[id][pickup])
  152.         {
  153.             pstruct[playerid][CurrentID] = id;
  154.             new str[128];
  155.             if(!strcmp(struct[id][owner], "None", true))
  156.             {
  157.                 format(str,sizeof(str),"{ffffff}HOUSE ID: {00ff00}%d\n{ffffff}Цена: {00ff00}$%d\n{ffffff}Желаете приобрести этот дом?",id,struct[id][cost]);
  158.                 ShowPlayerDialog(playerid,DIALOG_BUYHOUSE,DIALOG_STYLE_MSGBOX,"Покупка дома",str,"Да","Нет");
  159.                 break;
  160.             }
  161.             else
  162.             {
  163.                 format(str,sizeof(str),"{ffffff}HOUSE ID: {00ff00}%d\n{ffffff}Владелец: {00ff00}%s\n{ffffff}Название: {00ff00}%s",id,struct[id][owner],struct[id][name]);
  164.                 ShowPlayerDialog(playerid,DIALOG_HOUSEINFO,DIALOG_STYLE_MSGBOX,"Информация дома",str,"Войти","Отмена");
  165.                 break;
  166.             }
  167.         }
  168.     }
  169.     return 1;
  170. }
  171. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  172. {
  173.     if(dialogid == DIALOG_HOUSEMENU)
  174.     {
  175.         if(!response)return 0;
  176.         if(listitem == 0)
  177.         {
  178.             if(struct[pstruct[playerid][HouseID]][lock])struct[pstruct[playerid][HouseID]][lock] = 0;
  179.             else struct[pstruct[playerid][HouseID]][lock] = 1;
  180.             ShowPlayerHouseMenu(playerid);
  181.         }
  182.         if(listitem == 1)ShowPlayerDialog(playerid, DIALOG_INTERIORS, DIALOG_STYLE_LIST, "Интерьеры для дома", "Unused safe house\t{00FF00}$5000\n\
  183.                                                                                                                 Golden Bed Motel\t{00FF00}$8000\n\
  184.                                                                                                                 Hashbury House\t{00FF00}$11000\n\
  185.                                                                                                                 Johnsons House\t{00ff00}$14000\n\
  186.                                                                                                                 Madd Doggs Mansion\t{00ff00}$17000\n\
  187.                                                                                                                 Red Bed Motel Room\t{00ff00}$20000", "Купить", "Отмена");
  188.         if(listitem == 2)
  189.         {
  190.             new str[128];
  191.             format(str,sizeof(str),"{ffffff}Стоймость дома: {00ff00}$%d\n{ffffff}Продать можно за: {00ff00}$%d",struct[pstruct[playerid][HouseID]][cost],struct[pstruct[playerid][HouseID]][cost]*80/100);
  192.             ShowPlayerDialog(playerid, DIALOG_COSTINFO, DIALOG_STYLE_MSGBOX, "Информация о цене", str, "Okay", "");
  193.         }
  194.         if(listitem == 3)ShowPlayerDialog(playerid,DIALOG_WRITENAME, DIALOG_STYLE_INPUT, "Название дома", "Введите новое название для дома\nНе больше 24 символов:", "Ввести", "Отмена");
  195.         if(listitem == 4)
  196.         {
  197.             format(struct[pstruct[playerid][HouseID]][owner],24,"None");
  198.             UpdateHouse(pstruct[playerid][HouseID]);
  199.             GivePlayerMoney(playerid,struct[pstruct[playerid][HouseID]][cost]*80/100);
  200.             SetPlayerPosIntVW(playerid,struct[pstruct[playerid][HouseID]][hx],struct[pstruct[playerid][HouseID]][hy],struct[pstruct[playerid][HouseID]][hz],0,0);
  201.             pstruct[playerid][HouseID] = INVALID_PLAYER_ID;
  202.             pstruct[playerid][CurrentID] = INVALID_PLAYER_ID;
  203.             pstruct[playerid][HaveHouse] = false;
  204.             SaveAllHousesToDB();
  205.             SendClientMessage(playerid,white,"Дом успешно продан!");
  206.         }
  207.         return 1;
  208.     }
  209.     if(dialogid == DIALOG_WRITENAME)
  210.     {
  211.         if(!response)return 0;
  212.         if(strlen(inputtext) > 25)return ShowPlayerDialog(playerid,DIALOG_WRITENAME, DIALOG_STYLE_INPUT, "Название дома", "Введите новое название для дома\nНе больше 24 символов:", "Ввести", "Отмена");
  213.         format(struct[pstruct[playerid][HouseID]][name],24,"%s",inputtext);
  214.         UpdateHouse(pstruct[playerid][HouseID]);
  215.         SaveAllHousesToDB();
  216.         ShowPlayerHouseMenu(playerid);
  217.         return 1;
  218.     }
  219.     if(dialogid == DIALOG_INTERIORS)
  220.     {
  221.         if(!response)return 0;
  222.         if(listitem == 0)
  223.         {
  224.             if(GetPlayerMoney(playerid) < 5000)return SendClientMessage(playerid,red,"Недостаточно денег для покупки!");
  225.             GivePlayerMoney(playerid,-5000);
  226.             struct[pstruct[playerid][HouseID]][interior] = 1;
  227.         }
  228.         if(listitem == 1)
  229.         {
  230.             if(GetPlayerMoney(playerid) < 8000)return SendClientMessage(playerid,red,"Недостаточно денег для покупки!");
  231.             GivePlayerMoney(playerid,-8000);
  232.             struct[pstruct[playerid][HouseID]][interior] = 2;
  233.         }
  234.         if(listitem == 2)
  235.         {
  236.             if(GetPlayerMoney(playerid) < 11000)return SendClientMessage(playerid,red,"Недостаточно денег для покупки!");
  237.             GivePlayerMoney(playerid,-11000);
  238.             struct[pstruct[playerid][HouseID]][interior] = 3;
  239.         }
  240.         if(listitem == 3)
  241.         {
  242.             if(GetPlayerMoney(playerid) < 14000)return SendClientMessage(playerid,red,"Недостаточно денег для покупки!");
  243.             GivePlayerMoney(playerid,-14000);
  244.             struct[pstruct[playerid][HouseID]][interior] = 4;
  245.         }
  246.         if(listitem == 4)
  247.         {
  248.             if(GetPlayerMoney(playerid) < 17000)return SendClientMessage(playerid,red,"Недостаточно денег для покупки!");
  249.             GivePlayerMoney(playerid,-17000);
  250.             struct[pstruct[playerid][HouseID]][interior] = 5;
  251.         }
  252.         if(listitem == 5)
  253.         {
  254.             if(GetPlayerMoney(playerid) < 20000)return SendClientMessage(playerid,red,"Недостаточно денег для покупки!");
  255.             GivePlayerMoney(playerid,-20000);
  256.             struct[pstruct[playerid][HouseID]][interior] = 6;
  257.         }
  258.         Enter(playerid);
  259.         SaveAllHousesToDB();
  260.         return 1;
  261.     }
  262.     if(dialogid == DIALOG_BUYHOUSE)
  263.     {
  264.         if(!response)
  265.         {
  266.             pstruct[playerid][CurrentID] = INVALID_PLAYER_ID;
  267.             return 0;
  268.         }
  269.         if(pstruct[playerid][HaveHouse])
  270.         {
  271.             SendClientMessage(playerid,red,"У вас уже есть дом!");
  272.             pstruct[playerid][CurrentID] = INVALID_PLAYER_ID;
  273.             return 0;
  274.         }
  275.         if(GetPlayerMoney(playerid) < struct[pstruct[playerid][CurrentID]][cost])return SendClientMessage(playerid,red,"У вас не хватает денег!");
  276.         GivePlayerMoney(playerid,-struct[pstruct[playerid][CurrentID]][cost]);
  277.         format(struct[pstruct[playerid][CurrentID]][owner],24,"%s",gn(playerid));
  278.         UpdateHouse(pstruct[playerid][CurrentID]);
  279.         pstruct[playerid][HouseID] = pstruct[playerid][CurrentID];
  280.         pstruct[playerid][HaveHouse] = true;
  281.         SaveAllHousesToDB();
  282.         return 1;
  283.     }
  284.     if(dialogid == DIALOG_HOUSEINFO)
  285.     {
  286.         if(!response)
  287.         {
  288.             pstruct[playerid][CurrentID] = INVALID_PLAYER_ID;
  289.             return 0;
  290.         }
  291.         if(struct[pstruct[playerid][CurrentID]][lock])
  292.         {
  293.             pstruct[playerid][CurrentID] = INVALID_PLAYER_ID;
  294.             SendClientMessage(playerid,red,"Дом закрыт!");
  295.             return 0;
  296.         }
  297.         Enter(playerid);
  298.         GameTextForPlayer(playerid,"/exit",800,1);
  299.         return 1;
  300.     }
  301.     return 0;
  302. }
  303. stock Enter(playerid)
  304. {
  305.     switch(struct[pstruct[playerid][CurrentID]][interior])
  306.     {
  307.         case 1:SetPlayerPosIntVW(playerid,2324.419921,-1145.568359,1050.710083,12,pstruct[playerid][CurrentID]+1);//Unused safe house
  308.         case 2:SetPlayerPosIntVW(playerid,2251.85,-1138.16,1050.63,9,pstruct[playerid][CurrentID]+1);//Golden Bed Motel Room
  309.         case 3:SetPlayerPosIntVW(playerid,2260.76,-1210.45,1049.02,10,pstruct[playerid][CurrentID]+1);//Hashbury House
  310.         case 4:SetPlayerPosIntVW(playerid,2496.65,-1696.55,1014.74,3,pstruct[playerid][CurrentID]+1);//Johnsons House, The
  311.         case 5:SetPlayerPosIntVW(playerid,1299.14,-794.77,1084.00,5,pstruct[playerid][CurrentID]+1);//Madd Doggs Mansion
  312.         case 6:SetPlayerPosIntVW(playerid,2262.83,-1137.71,1050.63,10,pstruct[playerid][CurrentID]+1);//Red Bed Motel Room
  313.     }
  314. }
  315. stock SetPlayerPosIntVW(playerid,Float:x,Float:y,Float:z,int,vw)
  316. {
  317.     SetPlayerPos(playerid,x,y,z);
  318.     SetPlayerInterior(playerid,int);
  319.     SetPlayerVirtualWorld(playerid,vw);
  320.     return 1;
  321. }
  322. stock UpdateHouse(id)
  323. {
  324.     new str[128];
  325.     DestroyDynamicPickup(struct[id][pickup]);
  326.     if(!strcmp(struct[id][owner], "None", true))
  327.     {
  328.         format(str,sizeof(str),"ID: %d\nДом на продаже!\nЦена: $%d",id,struct[id][cost]);
  329.         UpdateDynamic3DTextLabelText(struct[id][txt], white, str);     
  330.         struct[id][pickup] = CreateDynamicPickup(1273, 23, struct[id][hx],struct[id][hy],struct[id][hz],-1,-1,-1,20.0);
  331.     }
  332.     else
  333.     {
  334.         format(str,sizeof(str),"ID: %d\nВладелец: %s\nНазвание: %s",id,struct[id][owner],struct[id][name]);
  335.         UpdateDynamic3DTextLabelText(struct[id][txt], white, str);
  336.         struct[id][pickup] = CreateDynamicPickup(1272, 23, struct[id][hx],struct[id][hy],struct[id][hz],-1,-1,-1,20.0);
  337.     }
  338. }
  339. stock FindPlayerHouse(playerid)
  340. {
  341.     for(new id;id<MAX_HOUSES;id++)
  342.     {
  343.         if(struct[id][cost])
  344.         {
  345.             if(!strcmp(struct[id][owner],gn(playerid)))
  346.             {
  347.                 pstruct[playerid][HaveHouse] = true;
  348.                 pstruct[playerid][HouseID] = id;
  349.                 break;
  350.             }
  351.         }
  352.     }
  353. }
  354. stock SaveAllHousesToDB()
  355. {
  356.     new data[256];
  357.     mysql_query("DELETE FROM `house`");
  358.     for(new id;id<MAX_HOUSES;id++)
  359.     {
  360.         if(!struct[id][cost])continue;
  361.         format(data,sizeof(data),"INSERT INTO `house`(`owner`, `cost`, `interior`, `hx`, `hy`, `hz`, `name`, `lock`) VALUES ('%s','%d','%d','%f','%f','%f','%s','%d')",struct[id][owner],struct[id][cost],struct[id][interior],struct[id][hx],struct[id][hy],struct[id][hz],struct[id][name],struct[id][lock]);
  362.         mysql_query(data);
  363.     }
  364. }
  365. stock LoadAllHousesFromDB()
  366. {
  367.     new data[256],str[128];
  368.     mysql_query("SELECT * FROM `house`");
  369.     mysql_store_result();
  370.     while(mysql_fetch_row_format(data, " "))
  371.     {
  372.         new i;
  373.         strval(strtok(data, i));
  374.         format(struct[houses][owner],24,"%s",strtok(data, i));
  375.         struct[houses][cost] = strval(strtok(data, i));
  376.         struct[houses][interior] = strval(strtok(data, i));
  377.         struct[houses][hx] = floatstr(strtok(data, i));
  378.         struct[houses][hy] = floatstr(strtok(data, i));
  379.         struct[houses][hz] = floatstr(strtok(data, i));
  380.         format(struct[houses][name],24,"%s",strtok(data, i));
  381.         struct[houses][lock] = strval(strtok(data, i));
  382.         if(!strcmp(struct[houses][owner], "None", true))
  383.         {
  384.             format(str,sizeof(str),"ID: %d\nДом на продаже!\nЦена: $%d",houses,struct[houses][cost]);
  385.             struct[houses][txt] = CreateDynamic3DTextLabel(str, white, struct[houses][hx],struct[houses][hy],struct[houses][hz],20.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,0,-1,-1,-1,20.0);
  386.             struct[houses][pickup] = CreateDynamicPickup(1273, 23, struct[houses][hx],struct[houses][hy],struct[houses][hz],-1,-1,-1,20.0);
  387.         }
  388.         else
  389.         {
  390.             format(str,sizeof(str),"ID: %d\nВладелец: %s\nНазвание: %s",houses,struct[houses][owner],struct[houses][name]);
  391.             struct[houses][txt] = CreateDynamic3DTextLabel(str, white, struct[houses][hx],struct[houses][hy],struct[houses][hz],20.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,0,-1,-1,-1,20.0);
  392.             struct[houses][pickup] = CreateDynamicPickup(1272, 23, struct[houses][hx],struct[houses][hy],struct[houses][hz],-1,-1,-1,20.0);
  393.         }
  394.         houses++;
  395.     }
  396.     mysql_free_result();
  397.     printf("Loaded %d houses.",houses);
  398. }  
  399. strtok(const string[], &index)
  400. {
  401.     new length = strlen(string);
  402.     while ((index < length) && (string[index] <= ' '))
  403.     {
  404.         index++;
  405.     }
  406.  
  407.     new offset = index;
  408.     new result[20];
  409.     while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
  410.     {
  411.         result[index - offset] = string[index];
  412.         index++;
  413.     }
  414.     result[index - offset] = EOS;
  415.     return result;
  416. }
  417. stock gn(playerid)
  418. {
  419.     new names[MAX_PLAYER_NAME+1];
  420.     GetPlayerName(playerid, names, sizeof(names));
  421.     return names;
  422. }
  423. stock ShowPlayerHouseMenu(playerid)
  424. {
  425.     if(pstruct[playerid][HaveHouse] == false)return SendClientMessage(playerid,white,"У вас нету дома!");
  426.     if(pstruct[playerid][CurrentID] != pstruct[playerid][HouseID])return SendClientMessage(playerid,white,"Сначала войдите в свой дом!");
  427.     new locked[16],listitem[256];
  428.     if(struct[pstruct[playerid][HouseID]][lock])locked = "Закрыт";
  429.     else locked = "Открыт";
  430.     format(listitem,sizeof(listitem),"Открыть/Закрыть\t{00FF00}%s\n\
  431.                                       Интерьер\t\t{00FF00}%d\n\
  432.                                       Стоимость\t\t{00FF00}$%d\n\
  433.                                       Название\t\t{00FF00}%s\n\
  434.                                       Продать дом",locked,struct[pstruct[playerid][HouseID]][interior],struct[pstruct[playerid][HouseID]][cost],struct[pstruct[playerid][HouseID]][name]);
  435.     ShowPlayerDialog(playerid, DIALOG_HOUSEMENU, DIALOG_STYLE_LIST, "Управление домом", listitem, "Выбрать", "Отмена");
  436.     return 0;
  437. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement