· 8 years ago · Jan 22, 2018, 12:22 PM
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
20enum 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};
30new BinData[MAX_BINS][bin_data];
31
32stock 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
40stock 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
68stock 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
83stock 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
104stock 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
187public 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
202public OnFilterScriptExit()
203{
204 #if defined USE_DATABASE
205 db_close(database);
206 #endif
207 return 1;
208}
209
210CMD: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
227CMD: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}