Advertisement
Guest User

Dynamic Fire Bin System by Weponz

a guest
Jan 22nd, 2018
552
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 7.34 KB | None | 0 0
  1. /* Dynamic Fire Bin System by Weponz (2018) */
  2. #define FILTERSCRIPT
  3. #include <a_samp>
  4. #include <streamer>
  5. #include <zcmd>
  6.  
  7. #define MAX_BINS 500//Default: 500 Max
  8. #define DRAW_DIST 250//Default: 250 Metres
  9.  
  10. #define USE_STREAMER//Comment out to use CreateObject (Default: CreateDynamicObject)
  11. #define USE_DATABASE//Comment out to prevent using SQLite to save/load bins. (Location: firebins.db)
  12.  
  13. #define LOG_CODE//Comment out to prevent object code from logging. (Location: firebins.txt)
  14.  
  15. #if defined USE_DATABASE
  16.     new DB:database;
  17.     new DBResult:result;
  18. #endif
  19.  
  20. enum bin_data
  21. {
  22.     bin_db,
  23.     bin_id,
  24.     bin_fire,
  25.     Float:bin_x,
  26.     Float:bin_y,
  27.     Float:bin_z,
  28.     bool:bin_active
  29. };
  30. new BinData[MAX_BINS][bin_data];
  31.  
  32. stock IsPointInRangeOfPoint(Float:x, Float:y, Float:z, Float:x2, Float:y2, Float:z2, Float:range)
  33. {
  34.     x2 -= x;
  35.     y2 -= y;
  36.     z2 -= z;
  37.     return ((x2 * x2) + (y2 * y2) + (z2 * z2)) < (range * range);
  38. }
  39.  
  40. stock GetFreeBinSlot()
  41. {
  42.     for(new i = 0; i < MAX_BINS; i++)
  43.     {
  44.         if(BinData[i][bin_active] == false) return i;
  45.     }
  46.     return -1;
  47. }
  48.  
  49. #if defined USE_DATABASE
  50.     stock GetFreeDatabaseSlot()
  51.     {
  52.         for(new i = 0; i < MAX_BINS; i++)
  53.         {
  54.             new query[128];
  55.             format(query, sizeof(query), "SELECT `ID` FROM `BINS` WHERE `ID` = '%d'", i);
  56.             result = db_query(database, query);
  57.             if(!db_num_rows(result))
  58.             {
  59.                 db_free_result(result);
  60.                 return i;
  61.             }
  62.             db_free_result(result);
  63.         }
  64.         return -1;
  65.     }
  66. #endif
  67.  
  68. stock CheckValidPos(Float:x, Float:y, Float:z)
  69. {
  70.     for(new i = 0; i < MAX_BINS; i++)
  71.     {
  72.         if(BinData[i][bin_active] == true)
  73.         {
  74.             if(IsPointInRangeOfPoint(x, y, z, BinData[i][bin_x], BinData[i][bin_y], BinData[i][bin_z], 2.0))
  75.             {
  76.                 return 0;
  77.             }
  78.         }
  79.     }
  80.     return 1;
  81. }
  82.  
  83. stock DeleteFireBin(binid)
  84. {
  85.     #if defined USE_STREAMER
  86.         if(IsValidDynamicObject(BinData[binid][bin_id])) { DestroyDynamicObject(BinData[binid][bin_id]); }
  87.         if(IsValidDynamicObject(BinData[binid][bin_fire])) { DestroyDynamicObject(BinData[binid][bin_fire]); }
  88.     #else
  89.         if(IsValidObject(BinData[binid][bin_id])) { DestroyObject(BinData[binid][bin_id]); }
  90.         if(IsValidObject(BinData[binid][bin_fire])) { DestroyObject(BinData[binid][bin_fire]); }
  91.     #endif
  92.    
  93.     BinData[binid][bin_active] = false;
  94.    
  95.     #if defined USE_DATABASE
  96.         new query[128];
  97.         format(query, sizeof(query), "DELETE FROM `BINS` WHERE `ID` = '%d'", BinData[binid][bin_db]);
  98.         result = db_query(database, query);
  99.         db_free_result(result);
  100.     #endif
  101.     return 1;
  102. }
  103.  
  104. stock CreateFireBin(binid, Float:x, Float:y, Float:z)
  105. {
  106.     BinData[binid][bin_x] = x;
  107.     BinData[binid][bin_y] = y;
  108.     BinData[binid][bin_z] = z;
  109.  
  110.     BinData[binid][bin_active] = true;
  111.    
  112.     #if defined USE_STREAMER
  113.         BinData[binid][bin_id] = CreateDynamicObject(1362, x, y, z - 0.4, 0.0, 0.0, 0.0, -1, -1, -1, DRAW_DIST);//Bin
  114.         BinData[binid][bin_fire] = CreateDynamicObject(3461, x, y, z - 1.4, 0.0, 0.0, 0.0, -1, -1, -1, DRAW_DIST);//Fire
  115.     #else
  116.         BinData[binid][bin_id] = CreateObject(1362, x, y, z - 0.4, 0.0, 0.0, 0.0, DRAW_DIST);//Bin
  117.         BinData[binid][bin_fire] = CreateObject(3461, x, y, z - 1.4, 0.0, 0.0, 0.0, DRAW_DIST);//Fire
  118.     #endif
  119.    
  120.     #if defined USE_DATABASE
  121.         new query[128], slot = GetFreeDatabaseSlot();
  122.         if(slot != -1)
  123.         {
  124.             BinData[binid][bin_db] = slot;
  125.            
  126.             format(query, sizeof(query), "INSERT INTO `BINS` (`ID`, `X`, `Y`, `Z`) VALUES ('%d', '%f', '%f', '%f')", binid, x, y, z);
  127.             result = db_query(database, query);
  128.             db_free_result(result);
  129.         }
  130.     #endif
  131.  
  132.     #if defined LOG_CODE
  133.         new File:log = fopen("firebins.txt", io_append), string[400];
  134.         if(log)
  135.         {
  136.             #if defined USE_STREAMER
  137.                 format(string, sizeof(string), "CreateDynamicObject(1362, %f, %f, %f - 0.4, 0.0, 0.0, 0.0, -1, -1, -1, %f);//Fire Bin %i (BIN)\r\nCreateDynamicObject(3461, %f, %f, %f - 1.4, 0.0, 0.0, 0.0, -1, -1, -1, %f);//Fire Bin %i (FIRE)\r\n", x, y, z, DRAW_DIST, (binid + 1), x, y, z, DRAW_DIST, (binid + 1));
  138.                 fwrite(log, string);
  139.                 fclose(log);
  140.             #else
  141.                 format(string, sizeof(string), "CreateObject(1362, %f, %f, %f - 0.4, 0.0, 0.0, 0.0, %f);//Fire Bin %i (BIN)\r\nCreateObject(3461, %f, %f, %f - 1.4, 0.0, 0.0, 0.0, %f);//Fire Bin %i (FIRE)\r\n", x, y, z, DRAW_DIST, (binid + 1), x, y, z, DRAW_DIST, (binid + 1));
  142.                 fwrite(log, string);
  143.                 fclose(log);
  144.             #endif
  145.         }
  146.     #endif
  147.     return binid;
  148. }
  149.  
  150. #if defined USE_DATABASE
  151.     stock LoadFireBins()
  152.     {
  153.         new query[128], field[32];
  154.         for(new i = 0; i < MAX_BINS; i++)
  155.         {
  156.             format(query, sizeof(query), "SELECT * FROM `BINS` WHERE `ID` = '%d'", i);
  157.             result = db_query(database, query);
  158.             if(db_num_rows(result))
  159.             {
  160.                 BinData[i][bin_active] = true;
  161.  
  162.                 db_get_field_assoc(result, "ID", field, sizeof(field));
  163.                 BinData[i][bin_db] = strval(field);
  164.  
  165.                 db_get_field_assoc(result, "X", field, sizeof(field));
  166.                 BinData[i][bin_x] = floatstr(field);
  167.  
  168.                 db_get_field_assoc(result, "Y", field, sizeof(field));
  169.                 BinData[i][bin_y] = floatstr(field);
  170.  
  171.                 db_get_field_assoc(result, "Z", field, sizeof(field));
  172.                 BinData[i][bin_z] = floatstr(field);
  173.  
  174.                 #if defined USE_STREAMER
  175.                     BinData[i][bin_id] = CreateDynamicObject(1362, BinData[i][bin_x], BinData[i][bin_y], BinData[i][bin_z] - 0.4, 0.0, 0.0, 0.0, -1, -1, -1, DRAW_DIST);//Bin
  176.                     BinData[i][bin_fire] = CreateDynamicObject(3461, BinData[i][bin_x], BinData[i][bin_y], BinData[i][bin_z] - 1.4, 0.0, 0.0, 0.0, -1, -1, -1, DRAW_DIST);//Fire
  177.                 #else
  178.                     BinData[i][bin_id] = CreateObject(1362, BinData[i][bin_x], BinData[i][bin_y], BinData[i][bin_z] - 0.4, 0.0, 0.0, 0.0, DRAW_DIST);//Bin
  179.                     BinData[i][bin_fire] = CreateObject(3461, BinData[i][bin_x], BinData[i][bin_y], BinData[i][bin_z] - 1.4, 0.0, 0.0, 0.0, DRAW_DIST);//Fire
  180.                 #endif
  181.             }
  182.         }
  183.         return 1;
  184.     }
  185. #endif
  186.  
  187. public OnFilterScriptInit()
  188. {
  189.     for(new i = 0; i < MAX_BINS; i++)
  190.     {
  191.         BinData[i][bin_active] = false;
  192.     }
  193.    
  194.     #if defined USE_DATABASE
  195.         database = db_open("firebins.db");
  196.         db_query(database, "CREATE TABLE IF NOT EXISTS `BINS` (`ID`, `X`, `Y`, `Z`)");
  197.         LoadFireBins();
  198.     #endif
  199.     return 1;
  200. }
  201.  
  202. public OnFilterScriptExit()
  203. {
  204.     #if defined USE_DATABASE
  205.         db_close(database);
  206.     #endif
  207.     return 1;
  208. }
  209.  
  210. CMD:deletebin(playerid, params[])
  211. {
  212.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, -1, "SERVER: You must be logged into RCON to use this command.");
  213.     for(new i = 0; i < MAX_BINS; i++)
  214.     {
  215.         if(BinData[i][bin_active] == true)
  216.         {
  217.             if(IsPlayerInRangeOfPoint(playerid, 1.5, BinData[i][bin_x], BinData[i][bin_y], BinData[i][bin_z]))
  218.             {
  219.                 return DeleteFireBin(i);
  220.             }
  221.         }
  222.     }
  223.     SendClientMessage(playerid, -1, "SERVER: You are currently not near any fire bins.");
  224.     return 1;
  225. }
  226.  
  227. CMD:createbin(playerid, params[])
  228. {
  229.     new Float:pos[3], slot = GetFreeBinSlot();
  230.     GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
  231.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, -1, "SERVER: You must be logged into RCON to use this command.");
  232.     if(slot == -1) return SendClientMessage(playerid, -1, "SERVER: The server has reached the maximum aloud fire bins.");
  233.     if(CheckValidPos(pos[0], pos[1], pos[2]) == 0) return SendClientMessage(playerid, -1, "SERVER: You cannot create a fire bin within 2 metres of any other fire bin.");
  234.     CreateFireBin(slot, pos[0], pos[1], pos[2]);
  235.     return 1;
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement