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