· 5 years ago · Feb 19, 2020, 03:48 PM
1#pragma tabsize 0
2
3#define FILTERSCRIPT
4#include <a_samp>
5#include <sqlitei>
6#include <mSelection>
7#include <streamer>
8#include <zcmd>
9
10
11#define MAX_COP_OBJECTS (300)
12#define COPOBJECTS_DIALOG (6450)
13#define SPEEDCAM_RANGE (30.0)
14
15enum rInfo
16{
17 rCreated,
18 Float:rX,
19 Float:rY,
20 Float:rZ,
21 rObject,
22};
23new RoadBlockInfo[MAX_COP_OBJECTS][rInfo];
24
25enum _:e_object_types
26{
27 OBJECT_TYPE_ROADBLOCK,
28 OBJECT_TYPE_SIGN,
29 OBJECT_TYPE_POLICELINE,
30 OBJECT_TYPE_SPIKE,
31 OBJECT_TYPE_SPEEDCAM,
32 OBJECT_TYPE_CONE
33}
34
35enum e_object_data
36{
37 Owner[MAX_PLAYER_NAME],
38 Type,
39 ObjData,
40 ObjModel,
41 Float: ObjX,
42 Float: ObjY,
43 Float: ObjZ,
44 Float: ObjRX,
45 Float: ObjRY,
46 Float: ObjRZ,
47 ObjInterior,
48 ObjVirtualWorld,
49 ObjID,
50 Text3D: ObjLabel,
51 ObjArea,
52 bool: ObjCreated
53}
54
55enum E_DATA_ADVERTISEMENT
56{
57 E_ROADBLOCK_ID
58}
59
60new
61 CopObjectData[MAX_COP_OBJECTS][e_object_data],
62 EditingCopObjectID[MAX_PLAYERS] = {-1, ...},
63 RoadblockList = mS_INVALID_LISTID,
64 SignList = mS_INVALID_LISTID;
65
66new
67 Float: zOffsets[5] = {1.35, 3.25, 0.35, 0.4, 5.35},
68 Float: streamDistances[5] = {10.0, 10.0, 5.0, 3.0, SPEEDCAM_RANGE};
69
70new
71 DB: ObjectDB,
72 DBStatement: LoadObjects,
73 DBStatement: AddObject,
74 DBStatement: UpdateObject,
75 DBStatement: RemoveObject;
76new pInfo;
77stock DeleteAllRBS()
78{
79 for(new i = 0; i < sizeof(RoadBlockInfo); i++)
80 {
81 if(RoadBlockInfo[i][rCreated] == 1)
82 {
83 RoadBlockInfo[i][rCreated]=0;
84 RoadBlockInfo[i][rX]=0.0;
85 RoadBlockInfo[i][rY]=0.0;
86 RoadBlockInfo[i][rZ]=0.0;
87 DestroyObject(RoadBlockInfo[i][rObject]);
88 }
89 }
90 return 0;
91}
92
93
94stock CreateRB(Float:x,Float:y,Float:z,Float:Angle)
95{
96 for(new i = 0; i < sizeof(RoadBlockInfo); i++)
97 {
98 if(RoadBlockInfo[i][rCreated] == 0)
99 {
100 RoadBlockInfo[i][rCreated]=1;
101 RoadBlockInfo[i][rX]=x;
102 RoadBlockInfo[i][rY]=y;
103 RoadBlockInfo[i][rZ]=z-0.7;
104 RoadBlockInfo[i][rObject] = CreateObject(973, x, y, z-0.9, 0, 0, Angle-90);
105 return 1;
106 }
107 }
108 return 0;
109}
110
111
112/*stock IsACopSkin(skinid)
113{
114 // cop skins, ma gandeam sa fac o verificare
115 switch(skinid)
116 {
117 case 265..267, 280..288, 300..302, 306, 307, 309..311: return 1;
118 default: return 0;
119 }
120
121 return 0;
122}*/
123
124stock GetFreeObjectID()
125{
126 new id = -1;
127 for(new i; i < MAX_COP_OBJECTS; i++)
128 {
129 if(!CopObjectData[i][ObjCreated])
130 {
131 id = i;
132 break;
133 }
134 }
135
136 return id;
137}
138
139stock GetPlayerSpeed(playerid)
140{
141 new Float:vx, Float:vy, Float:vz, Float:vel;
142 vel = GetVehicleVelocity(GetPlayerVehicleID(playerid), vx, vy, vz);
143 vel = (floatsqroot(((vx*vx)+(vy*vy))+(vz*vz))* 181.5);
144 return floatround(vel);
145}
146
147stock InsertObjectToDB(id)
148{
149 stmt_bind_value(AddObject, 0, DB::TYPE_INTEGER, id);
150 stmt_bind_value(AddObject, 1, DB::TYPE_STRING, CopObjectData[id][Owner]);
151 stmt_bind_value(AddObject, 2, DB::TYPE_INTEGER, CopObjectData[id][Type]);
152 stmt_bind_value(AddObject, 3, DB::TYPE_INTEGER, CopObjectData[id][ObjData]);
153 stmt_bind_value(AddObject, 4, DB::TYPE_INTEGER, CopObjectData[id][ObjModel]);
154 stmt_bind_value(AddObject, 5, DB::TYPE_FLOAT, CopObjectData[id][ObjX]);
155 stmt_bind_value(AddObject, 6, DB::TYPE_FLOAT, CopObjectData[id][ObjY]);
156 stmt_bind_value(AddObject, 7, DB::TYPE_FLOAT, CopObjectData[id][ObjZ]);
157 stmt_bind_value(AddObject, 8, DB::TYPE_FLOAT, CopObjectData[id][ObjRX]);
158 stmt_bind_value(AddObject, 9, DB::TYPE_FLOAT, CopObjectData[id][ObjRY]);
159 stmt_bind_value(AddObject, 10, DB::TYPE_FLOAT, CopObjectData[id][ObjRZ]);
160 stmt_bind_value(AddObject, 11, DB::TYPE_INTEGER, CopObjectData[id][ObjInterior]);
161 stmt_bind_value(AddObject, 12, DB::TYPE_INTEGER, CopObjectData[id][ObjVirtualWorld]);
162 stmt_execute(AddObject);
163 return 1;
164}
165
166stock SaveObjectToDB(id)
167{
168 stmt_bind_value(UpdateObject, 0, DB::TYPE_FLOAT, CopObjectData[id][ObjX]);
169 stmt_bind_value(UpdateObject, 1, DB::TYPE_FLOAT, CopObjectData[id][ObjY]);
170 stmt_bind_value(UpdateObject, 2, DB::TYPE_FLOAT, CopObjectData[id][ObjZ]);
171 stmt_bind_value(UpdateObject, 3, DB::TYPE_FLOAT, CopObjectData[id][ObjRX]);
172 stmt_bind_value(UpdateObject, 4, DB::TYPE_FLOAT, CopObjectData[id][ObjRY]);
173 stmt_bind_value(UpdateObject, 5, DB::TYPE_FLOAT, CopObjectData[id][ObjRZ]);
174 stmt_bind_value(UpdateObject, 6, DB::TYPE_INTEGER, id);
175 stmt_execute(UpdateObject);
176 return 1;
177}
178stock DeleteClosestRB(playerid)
179{
180 for(new i = 0; i < sizeof(RoadBlockInfo); i++)
181 {
182 if(IsPlayerInRangeOfPoint(playerid, 2.0, RoadBlockInfo[i][rX], RoadBlockInfo[i][rY], RoadBlockInfo[i][rZ]))
183 {
184 if(RoadBlockInfo[i][rCreated] == 1)
185 {
186 RoadBlockInfo[i][rCreated]=0;
187 RoadBlockInfo[i][rX]=0.0;
188 RoadBlockInfo[i][rY]=0.0;
189 RoadBlockInfo[i][rZ]=0.0;
190 DestroyObject(RoadBlockInfo[i][rObject]);
191 return 1;
192 }
193 }
194 }
195 return 0;
196}
197
198encode_tires(tire1, tire2, tire3, tire4) return tire1 | (tire2 << 1) | (tire3 << 2) | (tire4 << 3);
199
200public OnFilterScriptInit()
201{
202 RoadblockList = LoadModelSelectionMenu("roadblocks.txt");
203 SignList = LoadModelSelectionMenu("signs.txt");
204
205 ObjectDB = db_open("cop_objects.db");
206 db_query(ObjectDB, "CREATE TABLE IF NOT EXISTS objects (id INTEGER, owner TEXT, type INTEGER, data INTEGER, model INTEGER, posx FLOAT, posy FLOAT, posz FLOAT, rotx FLOAT, roty FLOAT, rotz FLOAT, interior INTEGER, virtualworld INTEGER)");
207
208 LoadObjects = db_prepare(ObjectDB, "SELECT * FROM objects");
209 AddObject = db_prepare(ObjectDB, "INSERT INTO objects (id, owner, type, data, model, posx, posy, posz, rotx, roty, rotz, interior, virtualworld) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
210 UpdateObject = db_prepare(ObjectDB, "UPDATE objects SET posx=?, posy=?, posz=?, rotx=?, roty=?, rotz=? WHERE id=?");
211 RemoveObject = db_prepare(ObjectDB, "DELETE FROM objects WHERE id=?");
212
213 new id, type, data, model, owner[MAX_PLAYER_NAME], Float: pos[3], Float: rot[3], interior, vworld;
214 stmt_bind_result_field(LoadObjects, 0, DB::TYPE_INTEGER, id);
215 stmt_bind_result_field(LoadObjects, 1, DB::TYPE_STRING, owner, MAX_PLAYER_NAME);
216 stmt_bind_result_field(LoadObjects, 2, DB::TYPE_INTEGER, type);
217 stmt_bind_result_field(LoadObjects, 3, DB::TYPE_INTEGER, data);
218 stmt_bind_result_field(LoadObjects, 4, DB::TYPE_INTEGER, model);
219 stmt_bind_result_field(LoadObjects, 5, DB::TYPE_FLOAT, pos[0]);
220 stmt_bind_result_field(LoadObjects, 6, DB::TYPE_FLOAT, pos[1]);
221 stmt_bind_result_field(LoadObjects, 7, DB::TYPE_FLOAT, pos[2]);
222 stmt_bind_result_field(LoadObjects, 8, DB::TYPE_FLOAT, rot[0]);
223 stmt_bind_result_field(LoadObjects, 9, DB::TYPE_FLOAT, rot[1]);
224 stmt_bind_result_field(LoadObjects, 10, DB::TYPE_FLOAT, rot[2]);
225 stmt_bind_result_field(LoadObjects, 11, DB::TYPE_INTEGER, interior);
226 stmt_bind_result_field(LoadObjects, 12, DB::TYPE_INTEGER, vworld);
227
228 if(stmt_execute(LoadObjects))
229 {
230 new label[96];
231 while(stmt_fetch_row(LoadObjects))
232 {
233 CopObjectData[id][ObjCreated] = true;
234 CopObjectData[id][Owner] = owner;
235 CopObjectData[id][Type] = type;
236 CopObjectData[id][ObjData] = data;
237 CopObjectData[id][ObjModel] = model;
238 CopObjectData[id][ObjInterior] = interior;
239 CopObjectData[id][ObjVirtualWorld] = vworld;
240 CopObjectData[id][ObjX] = pos[0];
241 CopObjectData[id][ObjY] = pos[1];
242 CopObjectData[id][ObjZ] = pos[2];
243 CopObjectData[id][ObjRX] = rot[0];
244 CopObjectData[id][ObjRY] = rot[1];
245 CopObjectData[id][ObjRZ] = rot[2];
246 CopObjectData[id][ObjID] = CreateDynamicObject(model, pos[0], pos[1], pos[2], rot[0], rot[1], rot[2], vworld, interior);
247 CopObjectData[id][ObjArea] = -1;
248
249 switch(type)
250 {
251 case OBJECT_TYPE_ROADBLOCK: format(label, sizeof(label), "Roadblock (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
252 case OBJECT_TYPE_SIGN: format(label, sizeof(label), "Sign (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
253 case OBJECT_TYPE_POLICELINE: format(label, sizeof(label), "Police Line (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
254 case OBJECT_TYPE_SPIKE:
255 {
256 format(label, sizeof(label), "Spike Strip (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
257 CopObjectData[id][ObjArea] = CreateDynamicSphere(pos[0], pos[1], pos[2], 2.5, vworld, interior);
258 }
259
260 case OBJECT_TYPE_SPEEDCAM:
261 {
262 format(label, sizeof(label), "Speed Camera (ID: %d)\n{FFFFFF}Speed Limit: {E74C3C}%d\n{FFFFFF}Placed by %s", id, data, CopObjectData[id][Owner]);
263 CopObjectData[id][ObjArea] = CreateDynamicSphere(pos[0], pos[1], pos[2], SPEEDCAM_RANGE, vworld, interior);
264 }
265 }
266
267 CopObjectData[id][ObjLabel] = CreateDynamic3DTextLabel(label, 0x3498DBFF, pos[0], pos[1], pos[2] + zOffsets[type], streamDistances[type], _, _, _, vworld, interior);
268 }
269 }
270 //new label[126];
271 //case OBJECT_TYPE_CONE: format(label, sizeof(label), "Cone (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
272 return 1;
273}
274
275public OnFilterScriptExit()
276{
277 db_close(ObjectDB);
278 return 1;
279}
280
281public OnPlayerConnect(playerid)
282{
283 EditingCopObjectID[playerid] = -1;
284 return 1;
285}
286
287public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
288{
289 if(dialogid == COPOBJECTS_DIALOG)
290 {
291 if(!response) return 1;
292 if(listitem == 0) ShowModelSelectionMenu(playerid, RoadblockList, "Roadblocks", 0x393939BB, 0x3498DBBB);
293 if(listitem == 1) ShowModelSelectionMenu(playerid, SignList, "Signs", 0x393939BB, 0x3498DBBB);
294
295 if(listitem == 2)
296 {
297 new id = GetFreeObjectID();
298 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Ai atins limita de obiecte.");
299 CopObjectData[id][ObjCreated] = true;
300 GetPlayerName(playerid, CopObjectData[id][Owner], MAX_PLAYER_NAME);
301 CopObjectData[id][Type] = OBJECT_TYPE_POLICELINE;
302 CopObjectData[id][ObjModel] = 19834;
303 CopObjectData[id][ObjInterior] = GetPlayerInterior(playerid);
304 CopObjectData[id][ObjVirtualWorld] = GetPlayerVirtualWorld(playerid);
305
306 new Float: x, Float: y, Float: z, Float: a;
307 GetPlayerPos(playerid, x, y, z);
308 GetPlayerFacingAngle(playerid, a);
309 x += (2.0 * floatsin(-a, degrees));
310 y += (2.0 * floatcos(-a, degrees));
311 CopObjectData[id][ObjX] = x;
312 CopObjectData[id][ObjY] = y;
313 CopObjectData[id][ObjZ] = z;
314 CopObjectData[id][ObjRX] = 0.0;
315 CopObjectData[id][ObjRY] = 0.0;
316 CopObjectData[id][ObjRZ] = a;
317 CopObjectData[id][ObjID] = CreateDynamicObject(19834, x, y, z, 0.0, 0.0, a, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
318 CopObjectData[id][ObjArea] = -1;
319
320 new string[96];
321 format(string, sizeof(string), "Police Line (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
322 CopObjectData[id][ObjLabel] = CreateDynamic3DTextLabel(string, 0x3498DBFF, x, y, z + 0.35, 5.0, _, _, _, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
323 InsertObjectToDB(id);
324 }
325
326 if(listitem == 3)
327 {
328 new id = GetFreeObjectID();
329 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Ai atins limita de obiecte.");
330 CopObjectData[id][ObjCreated] = true;
331 GetPlayerName(playerid, CopObjectData[id][Owner], MAX_PLAYER_NAME);
332 CopObjectData[id][Type] = OBJECT_TYPE_SPIKE;
333 CopObjectData[id][ObjModel] = 2899;
334 CopObjectData[id][ObjInterior] = GetPlayerInterior(playerid);
335 CopObjectData[id][ObjVirtualWorld] = GetPlayerVirtualWorld(playerid);
336
337 new Float: x, Float: y, Float: z, Float: a;
338 GetPlayerPos(playerid, x, y, z);
339 GetPlayerFacingAngle(playerid, a);
340 x += (2.0 * floatsin(-a, degrees));
341 y += (2.0 * floatcos(-a, degrees));
342
343 CopObjectData[id][ObjX] = x;
344 CopObjectData[id][ObjY] = y;
345 CopObjectData[id][ObjZ] = z - 0.85;
346 CopObjectData[id][ObjRX] = 0.0;
347 CopObjectData[id][ObjRY] = 0.0;
348 CopObjectData[id][ObjRZ] = a + 90.0;
349 CopObjectData[id][ObjID] = CreateDynamicObject(2899, x, y, z - 0.85, 0.0, 0.0, a + 90.0, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
350 CopObjectData[id][ObjArea] = CreateDynamicSphere(x, y, z - 0.85, 2.5, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
351
352 new string[96];
353 format(string, sizeof(string), "Spike Strip (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
354 CopObjectData[id][ObjLabel] = CreateDynamic3DTextLabel(string, 0x3498DBFF, x, y, z - 0.4, 3.0, _, _, _, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
355 InsertObjectToDB(id);
356 }
357
358 if(listitem == 4) ShowPlayerDialog(playerid, COPOBJECTS_DIALOG+1, DIALOG_STYLE_INPUT, "Speed Camera Setup", "Scrie o limita de viteza pentru aceasta speed camera:", "Create", "Cancel");
359 return 1;
360 }
361
362 if(dialogid == COPOBJECTS_DIALOG+1)
363 {
364 if(!response) return 1;
365 if(!strlen(inputtext)) return ShowPlayerDialog(playerid, COPOBJECTS_DIALOG+1, DIALOG_STYLE_INPUT, "Speed Camera Setup", "Scrie o limita de viteza pentru aceasta speed camera:", "Create", "Cancel");
366 new id = GetFreeObjectID(), limit = strval(inputtext);
367 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Ai atins limita de obiecte.");
368 CopObjectData[id][ObjCreated] = true;
369 GetPlayerName(playerid, CopObjectData[id][Owner], MAX_PLAYER_NAME);
370 CopObjectData[id][Type] = OBJECT_TYPE_SPEEDCAM;
371 CopObjectData[id][ObjData] = limit;
372 CopObjectData[id][ObjModel] = 18880;
373 CopObjectData[id][ObjInterior] = GetPlayerInterior(playerid);
374 CopObjectData[id][ObjVirtualWorld] = GetPlayerVirtualWorld(playerid);
375
376 new Float: x, Float: y, Float: z, Float: a;
377 GetPlayerPos(playerid, x, y, z);
378 GetPlayerFacingAngle(playerid, a);
379 x += (2.0 * floatsin(-a, degrees));
380 y += (2.0 * floatcos(-a, degrees));
381 CopObjectData[id][ObjX] = x;
382 CopObjectData[id][ObjY] = y;
383 CopObjectData[id][ObjZ] = z - 1.5;
384 CopObjectData[id][ObjRX] = 0.0;
385 CopObjectData[id][ObjRY] = 0.0;
386 CopObjectData[id][ObjRZ] = 0.0;
387 CopObjectData[id][ObjID] = CreateDynamicObject(18880, x, y, z - 1.5, 0.0, 0.0, 0.0, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
388 CopObjectData[id][ObjArea] = CreateDynamicSphere(x, y, z - 1.5, SPEEDCAM_RANGE, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
389
390 new string[128];
391 format(string, sizeof(string), "Speed Camera (ID: %d)\n{FFFFFF}Speed Limit: {E74C3C}%d\n{FFFFFF}Placed by %s", id, limit, CopObjectData[id][Owner]);
392 CopObjectData[id][ObjLabel] = CreateDynamic3DTextLabel(string, 0x3498DBFF, x, y, z + 3.85, SPEEDCAM_RANGE, _, _, _, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
393 InsertObjectToDB(id);
394 return 1;
395 }
396
397 return 0;
398}
399
400public OnPlayerModelSelection(playerid, response, listid, modelid)
401{
402 if(listid == RoadblockList)
403 {
404 if(!response) return 1;
405 new id = GetFreeObjectID();
406 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Ai atins limita de obiecte.");
407 CopObjectData[id][ObjCreated] = true;
408 GetPlayerName(playerid, CopObjectData[id][Owner], MAX_PLAYER_NAME);
409 CopObjectData[id][Type] = OBJECT_TYPE_ROADBLOCK;
410 CopObjectData[id][ObjModel] = modelid;
411 CopObjectData[id][ObjInterior] = GetPlayerInterior(playerid);
412 CopObjectData[id][ObjVirtualWorld] = GetPlayerVirtualWorld(playerid);
413
414 new Float: x, Float: y, Float: z, Float: a;
415 GetPlayerPos(playerid, x, y, z);
416 GetPlayerFacingAngle(playerid, a);
417 x += (2.0 * floatsin(-a, degrees));
418 y += (2.0 * floatcos(-a, degrees));
419 CopObjectData[id][ObjX] = x;
420 CopObjectData[id][ObjY] = y;
421 CopObjectData[id][ObjZ] = z;
422 CopObjectData[id][ObjRX] = 0.0;
423 CopObjectData[id][ObjRY] = 0.0;
424 CopObjectData[id][ObjRZ] = a;
425 CopObjectData[id][ObjID] = CreateDynamicObject(modelid, x, y, z, 0.0, 0.0, a, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
426 CopObjectData[id][ObjArea] = -1;
427
428 new string[96];
429 format(string, sizeof(string), "Roadblock (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
430 CopObjectData[id][ObjLabel] = CreateDynamic3DTextLabel(string, 0x3498DBFF, x, y, z + 1.35, 10.0, _, _, _, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
431 InsertObjectToDB(id);
432 }
433
434 if(listid == SignList)
435 {
436 if(!response) return 1;
437 new id = GetFreeObjectID();
438 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Ai atins limita de obiecte.");
439 CopObjectData[id][ObjCreated] = true;
440 GetPlayerName(playerid, CopObjectData[id][Owner], MAX_PLAYER_NAME);
441 CopObjectData[id][Type] = OBJECT_TYPE_SIGN;
442 CopObjectData[id][ObjModel] = modelid;
443 CopObjectData[id][ObjInterior] = GetPlayerInterior(playerid);
444 CopObjectData[id][ObjVirtualWorld] = GetPlayerVirtualWorld(playerid);
445
446 new Float: x, Float: y, Float: z, Float: a;
447 GetPlayerPos(playerid, x, y, z);
448 GetPlayerFacingAngle(playerid, a);
449 x += (2.0 * floatsin(-a, degrees));
450 y += (2.0 * floatcos(-a, degrees));
451 CopObjectData[id][ObjX] = x;
452 CopObjectData[id][ObjY] = y;
453 CopObjectData[id][ObjZ] = z - 1.25;
454 CopObjectData[id][ObjRX] = 0.0;
455 CopObjectData[id][ObjRY] = 0.0;
456 CopObjectData[id][ObjRZ] = a;
457 CopObjectData[id][ObjID] = CreateDynamicObject(modelid, x, y, z - 1.25, 0.0, 0.0, a, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
458 CopObjectData[id][ObjArea] = -1;
459
460 new string[96];
461 format(string, sizeof(string), "Sign (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
462 CopObjectData[id][ObjLabel] = CreateDynamic3DTextLabel(string, 0x3498DBFF, x, y, z + 2.0, 10.0, _, _, _, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
463 InsertObjectToDB(id);
464 }
465 return 1;
466}
467
468public OnPlayerEnterDynamicArea(playerid, areaid)
469{
470 if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
471 {
472 for(new i; i < MAX_COP_OBJECTS; i++)
473 {
474 if(!CopObjectData[i][ObjCreated]) continue;
475 if(areaid == CopObjectData[i][ObjArea])
476 {
477 switch(CopObjectData[i][Type])
478 {
479 case OBJECT_TYPE_SPIKE:
480 {
481 new panels, doors, lights, tires;
482 GetVehicleDamageStatus(GetPlayerVehicleID(playerid), panels, doors, lights, tires);
483 UpdateVehicleDamageStatus(GetPlayerVehicleID(playerid), panels, doors, lights, encode_tires(1, 1, 1, 1));
484 PlayerPlaySound(playerid, 1190, 0.0, 0.0, 0.0);
485 }
486
487 case OBJECT_TYPE_SPEEDCAM:
488 {
489 new speed = GetPlayerSpeed(playerid);
490 if(speed > CopObjectData[i][ObjData])
491 {
492 // detected by a speed camera
493 PlayerPlaySound(playerid, 1132, 0.0, 0.0, 0.0);
494 SendClientMessage(playerid, -1, "You got busted! Slow down.");
495 }
496 }
497 }
498
499 break;
500 }
501 }
502 }
503
504 return 1;
505}
506
507public OnPlayerEditDynamicObject(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
508{
509 if(EditingCopObjectID[playerid] != -1)
510 {
511 new id = EditingCopObjectID[playerid];
512
513 switch(response)
514 {
515 case EDIT_RESPONSE_FINAL:
516 {
517 CopObjectData[id][ObjX] = x;
518 CopObjectData[id][ObjY] = y;
519 CopObjectData[id][ObjZ] = z;
520 CopObjectData[id][ObjRX] = rx;
521 CopObjectData[id][ObjRY] = ry;
522 CopObjectData[id][ObjRZ] = rz;
523 SetDynamicObjectPos(objectid, x, y, z);
524 SetDynamicObjectRot(objectid, rx, ry, rz);
525
526 Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, CopObjectData[id][ObjLabel], E_STREAMER_X, x);
527 Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, CopObjectData[id][ObjLabel], E_STREAMER_Y, y);
528 Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, CopObjectData[id][ObjLabel], E_STREAMER_Z, z + zOffsets[ CopObjectData[id][Type] ]);
529
530 if(IsValidDynamicArea(CopObjectData[id][ObjArea]))
531 {
532 Streamer_SetFloatData(STREAMER_TYPE_AREA, CopObjectData[id][ObjArea], E_STREAMER_X, x);
533 Streamer_SetFloatData(STREAMER_TYPE_AREA, CopObjectData[id][ObjArea], E_STREAMER_Y, y);
534 Streamer_SetFloatData(STREAMER_TYPE_AREA, CopObjectData[id][ObjArea], E_STREAMER_Z, z + zOffsets[ CopObjectData[id][Type] ]);
535 }
536
537 SaveObjectToDB(id);
538 EditingCopObjectID[playerid] = -1;
539 }
540
541 case EDIT_RESPONSE_CANCEL:
542 {
543 SetDynamicObjectPos(objectid, CopObjectData[id][ObjX], CopObjectData[id][ObjY], CopObjectData[id][ObjZ]);
544 SetDynamicObjectRot(objectid, CopObjectData[id][ObjRX], CopObjectData[id][ObjRY], CopObjectData[id][ObjRZ]);
545 EditingCopObjectID[playerid] = -1;
546 }
547 }
548 }
549
550 return 1;
551}
552
553CMD:rb(playerid, params[])
554{
555 if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Nu poti utiliza aceasta comanda daca esti in masina.");
556 ShowPlayerDialog(playerid, COPOBJECTS_DIALOG, DIALOG_STYLE_LIST, "Roadblocks: Alege categorie", "Roadblocks\nSigns\nPolice Line", "Choose", "Cancel");
557 return 1;
558}
559
560CMD:rbedit(playerid, params[])
561{
562 //if(!IsPlayerAdmin(playerid) && !IsACopSkin(GetPlayerSkin(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Doar politistii pot utiliza aceasta comanda.");
563 //if(EditingCopObjectID[playerid] != -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Deja editezi un obiect.");
564 if(isnull(params)) return SendClientMessage(playerid, 0xF39C12FF, "USAGE: {FFFFFF}/editobject [id]");
565 new id = strval(params[0]);
566 if(!(0 <= id <= MAX_COP_OBJECTS - 1)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Invalid object ID.");
567 if(!CopObjectData[id][ObjCreated]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Object doesn't exist.");
568 if(!IsPlayerInRangeOfPoint(playerid, 16.0, CopObjectData[id][ObjX], CopObjectData[id][ObjY], CopObjectData[id][ObjZ])) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Nu esti aproape de obiectul pe care vrei sa-l editezi.");
569 new name[MAX_PLAYER_NAME];
570 GetPlayerName(playerid, name, MAX_PLAYER_NAME);
571 if(!IsPlayerAdmin(playerid) && strcmp(CopObjectData[id][Owner], name)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Acest obiect nu este plasat de tine, nu-l poti edita.");
572 EditingCopObjectID[playerid] = id;
573 EditDynamicObject(playerid, CopObjectData[id][ObjID]);
574 return 1;
575}
576
577CMD:gotoobject(playerid, params[])
578{
579 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
580 if(isnull(params)) return SendClientMessage(playerid, 0xF39C12FF, "USAGE: {FFFFFF}/gotoobject [id]");
581 new id = strval(params[0]);
582 if(!(0 <= id <= MAX_COP_OBJECTS - 1)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Invalid object ID.");
583 if(!CopObjectData[id][ObjCreated]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Object doesn't exist.");
584 SetPlayerPos(playerid, CopObjectData[id][ObjX], CopObjectData[id][ObjY], CopObjectData[id][ObjZ] + 1.75);
585 SetPlayerInterior(playerid, CopObjectData[id][ObjInterior]);
586 SetPlayerVirtualWorld(playerid, CopObjectData[id][ObjVirtualWorld]);
587 SendClientMessage(playerid, -1, "Teleported to object.");
588 return 1;
589}
590
591/*CMD:rrb(playerid, params[])
592{
593 if(isnull(params)) return SendClientMessage(playerid, 0xF39C12FF, "USAGE: {FFFFFF}/editobject [id]");
594 new id = strval(params[0]);
595 if(!(0 <= id <= MAX_COP_OBJECTS - 1)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Invalid object ID.");
596 if(!CopObjectData[id][ObjCreated]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Object doesn't exist.");
597 if(EditingCopObjectID[playerid] == id) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You can't remove an object you're editing.");
598 new name[MAX_PLAYER_NAME];
599 GetPlayerName(playerid, name, MAX_PLAYER_NAME);
600 CopObjectData[id][ObjCreated] = false;
601 DestroyDynamicObject(CopObjectData[id][ObjID]);
602 DestroyDynamic3DTextLabel(CopObjectData[id][ObjLabel]);
603 if(IsValidDynamicArea(CopObjectData[id][ObjArea])) DestroyDynamicArea(CopObjectData[id][ObjArea]);
604 CopObjectData[id][ObjID] = -1;
605 CopObjectData[id][ObjLabel] = Text3D: -1;
606 CopObjectData[id][ObjArea] = -1;
607 stmt_bind_value(RemoveObject, 0, DB::TYPE_INTEGER, id);
608 stmt_execute(RemoveObject);
609
610 SendClientMessage(playerid, -1, "Object removed.");
611 return 1;
612}*/
613CMD:cone(playerid, params[])
614{
615 new id = GetFreeObjectID();
616 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Ai atins limita de obiecte.");
617 CopObjectData[id][ObjCreated] = true;
618 GetPlayerName(playerid, CopObjectData[id][Owner], MAX_PLAYER_NAME);
619 CopObjectData[id][Type] = OBJECT_TYPE_CONE;
620 CopObjectData[id][ObjModel] = 19834;
621 CopObjectData[id][ObjInterior] = GetPlayerInterior(playerid);
622 CopObjectData[id][ObjVirtualWorld] = GetPlayerVirtualWorld(playerid);
623
624 //new id = GetFreeObjectID();
625 new Float: x, Float: y, Float: z, Float: a;
626 GetPlayerPos(playerid, x, y, z);
627 GetPlayerFacingAngle(playerid, a);
628 x += (2.0 * floatsin(-a, degrees));
629 y += (2.0 * floatcos(-a, degrees));
630 CopObjectData[id][ObjX] = x;
631 CopObjectData[id][ObjY] = y;
632 CopObjectData[id][ObjZ] = z - 1.25;
633 CopObjectData[id][ObjRX] = 0.0;
634 CopObjectData[id][ObjRY] = 0.0;
635 CopObjectData[id][ObjRZ] = a;
636 CopObjectData[id][ObjID] = CreateDynamicObject(1238, x, y, z - 1.25, 0.0, 0.0, a, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
637 CopObjectData[id][ObjArea] = -1;
638
639 new string[96];
640 SendClientMessage(playerid, 0xE74C3CFF, "Ai plasat un 'CONE', tasteaza /rbedit [id] pentru a ii modifica pozitia.");
641 format(string, sizeof(string), "Cone (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
642 CopObjectData[id][ObjLabel] = CreateDynamic3DTextLabel(string, 0x3498DBFF, x, y, z + 2.0, 10.0, _, _, _, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
643 InsertObjectToDB(id);
644 return 1;
645}
646 /*if(listitem == 2)
647 {
648 new id = GetFreeObjectID();
649 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Ai atins limita de obiecte.");
650 CopObjectData[id][ObjCreated] = true;
651 GetPlayerName(playerid, CopObjectData[id][Owner], MAX_PLAYER_NAME);
652 CopObjectData[id][Type] = OBJECT_TYPE_POLICELINE;
653 CopObjectData[id][ObjModel] = 19834;
654 CopObjectData[id][ObjInterior] = GetPlayerInterior(playerid);
655 CopObjectData[id][ObjVirtualWorld] = GetPlayerVirtualWorld(playerid);
656
657 new Float: x, Float: y, Float: z, Float: a;
658 GetPlayerPos(playerid, x, y, z);
659 GetPlayerFacingAngle(playerid, a);
660 x += (2.0 * floatsin(-a, degrees));
661 y += (2.0 * floatcos(-a, degrees));
662 CopObjectData[id][ObjX] = x;
663 CopObjectData[id][ObjY] = y;
664 CopObjectData[id][ObjZ] = z;
665 CopObjectData[id][ObjRX] = 0.0;
666 CopObjectData[id][ObjRY] = 0.0;
667 CopObjectData[id][ObjRZ] = a;
668 CopObjectData[id][ObjID] = CreateDynamicObject(19834, x, y, z, 0.0, 0.0, a, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
669 CopObjectData[id][ObjArea] = -1;
670
671 new string[96];
672 format(string, sizeof(string), "Police Line (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
673 CopObjectData[id][ObjLabel] = CreateDynamic3DTextLabel(string, 0x3498DBFF, x, y, z + 0.35, 5.0, _, _, _, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
674 InsertObjectToDB(id);
675 }*/
676
677CMD:rrb(playerid, params[])
678{
679 if(isnull(params)) return SendClientMessage(playerid, 0xF39C12FF, "USAGE: {FFFFFF}/removeobject(roadblock) [id]");
680 new id = strval(params[0]);
681 if(!(0 <= id <= MAX_COP_OBJECTS - 1)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Invalid object ID.");
682 if(!CopObjectData[id][ObjCreated]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Acest obiect nu exista.");
683 if(EditingCopObjectID[playerid] == id) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Nu poti sterge un obiect pe care-l editezi.");
684 new name[MAX_PLAYER_NAME];
685 GetPlayerName(playerid, name, MAX_PLAYER_NAME);
686 CopObjectData[id][ObjCreated] = false;
687 DestroyDynamicObject(CopObjectData[id][ObjID]);
688 DestroyDynamic3DTextLabel(CopObjectData[id][ObjLabel]);
689 if(IsValidDynamicArea(CopObjectData[id][ObjArea])) DestroyDynamicArea(CopObjectData[id][ObjArea]);
690 CopObjectData[id][ObjID] = -1;
691 CopObjectData[id][ObjLabel] = Text3D: -1;
692 CopObjectData[id][ObjArea] = -1;
693 stmt_bind_value(RemoveObject, 0, DB::TYPE_INTEGER, id);
694 stmt_execute(RemoveObject);
695 SendClientMessage(playerid, -1, "SERVER: {FFFFFF}Deleted succes.");
696 return 1;
697}