Advertisement
jst96

Dynamic House Spawn

Nov 6th, 2016
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 11.42 KB | None | 0 0
  1. #include <a_samp>
  2. #include <a_mysql>
  3. #include <YSI\y_iterate>
  4. #include <streamer>
  5. #include <izcmd>
  6.  
  7. #define MAX_HOUSES      100
  8.  
  9. #define COLOR_LIGHTBLUE 0x33CCFFAA
  10.  
  11. #define IsNull(%1) ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
  12. #define forex(%0,%1) for(new %0 = 0; %0 < %1; %0++)
  13. #define SEM(%0,%1); SendClientMessage(%0,COLOR_GREY,%1);
  14. #define function%0(%1) \
  15.         forward%0(%1); public%0(%1)
  16. #define INVALID_HOUSE_ID    -1
  17.  
  18. new Database;
  19.  
  20. enum hinfo
  21. {
  22.     ORM:ORM_ID,
  23.     ID,
  24.     OwnerID,
  25.     Owner[MAX_PLAYER_NAME],
  26.     Float:Spawn[4],
  27.     Price
  28. }
  29. new HouseInfo[MAX_HOUSES][hinfo];
  30. new HousePickup[MAX_HOUSES];
  31. new Text3D:HouseLabel[MAX_HOUSES];
  32. new Iterator:Houses<MAX_HOUSES>;
  33.  
  34. public OnFilterScriptInit()
  35. {
  36.     mysql_pquery(Database,"SELECT * FROM `house_info` ORDER BY `houseid` ASC","House_Load","");
  37. }
  38.  
  39. public OnFilterScriptExit()
  40. {
  41.     foreach(new houseid : Houses)
  42.     {
  43.         orm_update(HouseInfo[houseid][ORM_ID]);
  44.         orm_destroy(HouseInfo[houseid][ORM_ID]);
  45.     }
  46.     return 1;
  47. }
  48.  
  49. function House_Load()
  50. {
  51.     new rows = cache_get_row_count(Database);
  52.     if(rows != 0)
  53.     {
  54.         forex(row,rows)
  55.         {
  56.             new houseid = cache_get_row_int(row,0,Database);
  57.             new ORM:ormid = HouseInfo[houseid][ORM_ID] = orm_create("house_info",Database);
  58.             orm_addvar_int(ormid,HouseInfo[houseid][ID],"houseid");
  59.             orm_addvar_int(ormid,HouseInfo[houseid][OwnerID],"ownerid");
  60.             orm_addvar_string(ormid,HouseInfo[houseid][Owner],MAX_PLAYER_NAME,"owner");
  61.             orm_addvar_float(ormid,HouseInfo[houseid][Spawn][0],"x");
  62.             orm_addvar_float(ormid,HouseInfo[houseid][Spawn][1],"y");
  63.             orm_addvar_float(ormid,HouseInfo[houseid][Spawn][2],"z");
  64.             orm_addvar_float(ormid,HouseInfo[houseid][Spawn][3],"a");
  65.             orm_addvar_int(ormid,HouseInfo[houseid][Price],"price");
  66.             orm_apply_cache(ormid,row);
  67.             orm_setkey(ormid,"houseid");
  68.            
  69.             House_Create(houseid,INVALID_PLAYER_ID);
  70.         }
  71.     }
  72.     return 1;
  73. }
  74.  
  75. function House_Create(houseid,playerid)
  76. {
  77.     new string[256];
  78.     if(HouseInfo[houseid][OwnerID] == 0)
  79.     {
  80.         HousePickup[houseid] = CreateDynamicPickup(1273,23,HouseInfo[houseid][Spawn][0],HouseInfo[houseid][Spawn][1],HouseInfo[houseid][Spawn][2],0,0);
  81.         format(string,sizeof(string),"[id:%d]\n{ff0000}FOR SALE\n{ffffff}Price: {ffff00}$%d\n{ffffff}Use '{ffff00}/house buy{ffffff}' to purchase this house",houseid,HouseInfo[houseid][Price]);
  82.     }
  83.     else
  84.     {
  85.         HousePickup[houseid] = CreateDynamicPickup(1272,23,HouseInfo[houseid][Spawn][0],HouseInfo[houseid][Spawn][1],HouseInfo[houseid][Spawn][2],0,0);
  86.         format(string,sizeof(string),"[id:%d]\n{ffffff}Owner: {ffff00}%s",houseid,HouseInfo[houseid][Owner]);
  87.     }
  88.     HouseLabel[houseid] = CreateDynamic3DTextLabel(string,0x00FFFFAA,HouseInfo[houseid][Spawn][0],HouseInfo[houseid][Spawn][1],(HouseInfo[houseid][Spawn][2]+1.0),15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,0,0,0);
  89.     Iter_Add(Houses,houseid);
  90.    
  91.     if(playerid != INVALID_PLAYER_ID)
  92.     {
  93.         format(string,144,"HOUSE: {ffffff}House with {ffff00}id %d {ffffff}has been created!",houseid);
  94.         SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
  95.     }
  96.     return 1;
  97. }
  98.  
  99. stock GetPlayerNearestHouse(playerid)
  100. {
  101.     foreach(new houseid : Houses)
  102.     {
  103.         if(IsPlayerInRangeOfPoint(playerid,3.0,HouseInfo[houseid][Spawn][0],HouseInfo[houseid][Spawn][1],HouseInfo[houseid][Spawn][2])) return houseid;
  104.     }
  105.     return INVALID_HOUSE_ID;
  106. }
  107.  
  108. stock GetPlayerHouse(playerid)
  109. {
  110.     foreach(new houseid : Houses)
  111.     {
  112.         if(HouseInfo[houseid][OwnerID] == AccountInfo[playerid][ID]) return houseid;
  113.     }
  114.     return INVALID_HOUSE_ID;
  115. }
  116.  
  117. SSCANF:housemenu(string[])
  118. {
  119.     if(!strcmp(string,"create",true)) return 1;
  120.     if(!strcmp(string,"add",true)) return 1;
  121.     if(!strcmp(string,"make",true)) return 1;
  122.     if(!strcmp(string,"remove",true)) return 2;
  123.     if(!strcmp(string,"delete",true)) return 2;
  124.     if(!strcmp(string,"destroy",true)) return 2;
  125.     if(!strcmp(string,"price",true)) return 3;
  126.     if(!strcmp(string,"setprice",true)) return 3;
  127.     if(!strcmp(string,"sell",true)) return 4;
  128.     if(!strcmp(string,"asell",true)) return 4;
  129.     if(!strcmp(string,"buy",true)) return 5;
  130.     if(!strcmp(string,"purchase",true)) return 5;
  131.     if(!strcmp(string,"sell",true)) return 6;
  132.     return 0;
  133. }
  134.  
  135. CMD:house(playerid,params[])
  136. {
  137.     new action,string[128];
  138.     if(sscanf(params,"k<housemenu>S()[128]",action,string)) return SEM(playerid,"<USAGE>: /house [create/delete/price/asell/buy/sell]");
  139.     else
  140.     {
  141.         switch(action)
  142.         {
  143.             case 1:
  144.             {
  145.                 new price,houseid;
  146.                 if(IsNull(string)) return SEM(playerid,"<USAGE>: /house create [price]");
  147.                 price = strval(string);
  148.                 if(price < 1) return SEM(playerid,"ERROR: Price cannot go below $1");
  149.                 if(Iter_Free(Houses) == -1) return SEM(playerid,"ERROR: No free house slot available!");
  150.                 HouseInfo[houseid][ID] = houseid = Iter_Free(Houses);
  151.                 HouseInfo[houseid][OwnerID] = 0;
  152.                 GetPlayerPos(playerid,HouseInfo[houseid][Spawn][0],HouseInfo[houseid][Spawn][1],HouseInfo[houseid][Spawn][2]);
  153.                 GetPlayerFacingAngle(playerid,HouseInfo[houseid][Spawn][3]);
  154.                 HouseInfo[houseid][Price] = price;
  155.                 new ORM:ormid = HouseInfo[houseid][ORM_ID] = orm_create("house_info",Database);
  156.                 orm_addvar_int(ormid,HouseInfo[houseid][ID],"houseid");
  157.                 orm_addvar_int(ormid,HouseInfo[houseid][OwnerID],"ownerid");
  158.                 orm_addvar_string(ormid,HouseInfo[houseid][Owner],MAX_PLAYER_NAME,"owner");
  159.                 orm_addvar_float(ormid,HouseInfo[houseid][Spawn][0],"x");
  160.                 orm_addvar_float(ormid,HouseInfo[houseid][Spawn][1],"y");
  161.                 orm_addvar_float(ormid,HouseInfo[houseid][Spawn][2],"z");
  162.                 orm_addvar_float(ormid,HouseInfo[houseid][Spawn][3],"a");
  163.                 orm_addvar_int(ormid,HouseInfo[houseid][Price],"price");
  164.                 orm_insert(ormid,"House_Create","dd",houseid,playerid);
  165.                 orm_setkey(ormid,"houseid");
  166.             }
  167.             case 2:
  168.             {
  169.                 if(IsNull(string)) return SEM(playerid,"<USAGE>: /house delete [houseid]");
  170.                 new houseid = strval(string);
  171.                 if(Iter_Contains(Houses,houseid))
  172.                 {
  173.                     format(string,sizeof(string),"HOUSE: {ffffff}House with {ffff00}id %d {ffffff}has been deleted!",houseid);
  174.                     SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
  175.                     DestroyDynamicPickup(HousePickup[houseid]);
  176.                     DestroyDynamic3DTextLabel(HouseLabel[houseid]);
  177.                     orm_delete(HouseInfo[houseid][ORM_ID],true);
  178.                     Iter_Remove(Houses,houseid);
  179.                 }
  180.                 else SEM(playerid,"ERROR: Invalid houseid!");
  181.             }
  182.             case 3:
  183.             {
  184.                 new houseid,price;
  185.                 if(sscanf(string,"dd",houseid,price)) return SEM(playerid,"<USAGE>: /house price [houseid] [price]");
  186.                 if(price < 1) return SEM(playerid,"ERROR: Price cannot go below $1");
  187.                 if(Iter_Contains(Houses,houseid))
  188.                 {
  189.                     HouseInfo[houseid][Price] = price;
  190.                     orm_update(HouseInfo[houseid][ORM_ID]);
  191.                    
  192.                     if(HouseInfo[houseid][OwnerID] == 0)
  193.                     {
  194.                         new longString[256];
  195.                         format(longString,sizeof(longString),"[id:%d]\n{ff0000}FOR SALE\n{ffffff}Price: {ffff00}$%d\n{ffffff}Use '{ffff00}/house buy{ffffff}' to purchase this house",houseid,HouseInfo[houseid][Price]);
  196.                         UpdateDynamic3DTextLabelText(HouseLabel[houseid],0x00FFFFAA,longString);
  197.                     }
  198.                    
  199.                     format(string,sizeof(string),"HOUSE: {ffffff}House with {ffff00}id %d {ffffff}price has been changed to {00ff00}$%d",houseid,price);
  200.                     SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
  201.                 }
  202.                 else SEM(playerid,"ERROR: Invalid houseid!");
  203.             }
  204.             case 4:
  205.             {
  206.                 if(IsNull(string)) return SEM(playerid,"<USAGE>: /house delete [houseid]");
  207.                 new houseid = strval(string);
  208.                 if(Iter_Contains(Houses,houseid))
  209.                 {
  210.                     if(HouseInfo[houseid][OwnerID] != 0)
  211.                     {
  212.                         new longString[256];
  213.                         HouseInfo[houseid][OwnerID] = 0;
  214.                         orm_update(HouseInfo[houseid][ORM_ID]);
  215.                         format(longString,sizeof(longString),"[id:%d]\n{ff0000}FOR SALE\n{ffffff}Price: {ffff00}$%d\n{ffffff}Use '{ffff00}/house buy{ffffff}' to purchase this house",houseid,HouseInfo[houseid][Price]);
  216.                         Streamer_SetIntData(STREAMER_TYPE_PICKUP,HousePickup[houseid],E_STREAMER_MODEL_ID,1273);
  217.                         UpdateDynamic3DTextLabelText(HouseLabel[houseid],0x00FFFFAA,longString);
  218.                         format(string,sizeof(string),"HOUSE: {ffffff}House with {ffff00}id %d {ffffff}has been put up for sale",houseid);
  219.                         SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
  220.                     }
  221.                     else SEM(playerid,"ERROR: This house is not owned by anybody!");
  222.                 }
  223.                 else SEM(playerid,"ERROR: Invalid houseid!");
  224.             }
  225.             case 5:
  226.             {
  227.                 if(GetPlayerHouse(playerid) == INVALID_HOUSE_ID)
  228.                 {
  229.                     new houseid = GetPlayerNearestHouse(playerid);
  230.                     if(houseid == INVALID_HOUSE_ID) return SEM(playerid,"ERROR: You are not near any houses!");
  231.                     if(HouseInfo[houseid][OwnerID] == 0)
  232.                     {
  233.                         new playername[MAX_PLAYER_NAME];
  234.                         if(GetPlayerCash(playerid) < HouseInfo[houseid][Price]) return SEM(playerid,"ERROR: You dont have enough money!"); // ini perlu diubah mungkin kondisinya
  235.                         GivePlayerCash(playerid,-HouseInfo[houseid][Price]);
  236.                         GetPlayerName(playerid,playername,MAX_PLAYER_NAME);
  237.                         HouseInfo[houseid][OwnerID] = PlayerInfo[playerid][ID];
  238.                         strmid(HouseInfo[houseid][Owner],playername,0,strlen(playername),MAX_PLAYER_NAME);
  239.                         orm_update(HouseInfo[houseid][ORM_ID]);
  240.                        
  241.                         format(string,sizeof(string),"[id:%d]\n{ffffff}Owner: {ffff00}%s",houseid,HouseInfo[houseid][Owner]);
  242.                         Streamer_SetIntData(STREAMER_TYPE_PICKUP,HousePickup[houseid],E_STREAMER_MODEL_ID,1272);
  243.                         UpdateDynamic3DTextLabelText(HouseLabel[houseid],0x00FFFFAA,string);
  244.                     }
  245.                     else SEM(playerid,"ERROR: This house is not for sell!");
  246.                 }
  247.                 else SEM(playerid,"ERROR: You already own a house!");
  248.             }
  249.             case 6:
  250.             {
  251.                 if(GetPlayerHouse(playerid) != INVALID_HOUSE_ID)
  252.                 {
  253.                     if(strcmp(string,"confirm",true))
  254.                     {
  255.                         format(string,sizeof(string),"HOUSE: {ffffff}You are about to sell your house for {ffff00}$%d",(HouseInfo[houseid][Price]/2));
  256.                         SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
  257.                         SendClientMessage(playerid,COLOR_LIGHTBLUE,"HINT: {ffffff}Use command '{ffff00}/house sell confirm{ffffff}' to confirm sell");
  258.                     }
  259.                     else
  260.                     {
  261.                         new longString[256];
  262.                         GivePlayerCash(playerid,(HouseInfo[houseid][Price]/2));
  263.                         HouseInfo[houseid][OwnerID] = 0;
  264.                         orm_update(HouseInfo[houseid][ORM_ID]);
  265.  
  266.                         format(longString,sizeof(longString),"[id:%d]\n{ff0000}FOR SALE\n{ffffff}Price: {ffff00}$%d\n{ffffff}Use '{ffff00}/house buy{ffffff}' to purchase this house",houseid,HouseInfo[houseid][Price]);
  267.                         Streamer_SetIntData(STREAMER_TYPE_PICKUP,HousePickup[houseid],E_STREAMER_MODEL_ID,1273);
  268.                         UpdateDynamic3DTextLabelText(HouseLabel[houseid],0x00FFFFAA,longString);
  269.                     }
  270.                 }
  271.                 else SEM(playerid,"ERROR: You do not have any house!");
  272.             }
  273.             default: SEM(playerid,"<USAGE>: /house [create/delete/price/asell/buy/sell]");
  274.         }
  275.     }
  276.     return 1;
  277. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement