· 6 years ago · Jul 17, 2019, 07:40 AM
1#define FILTERSCRIPT
2#include <a_samp>
3#include <sqlitei>
4#include <mSelection>
5#include <streamer>
6#include <zcmd>
7
8#if !defined GetConsoleVarAsString
9 #error "You need 0.3.7 R2-1 to compile this script."
10#endif
11
12#define MAX_COP_OBJECTS (300)
13#define COPOBJECTS_DIALOG (6450)
14#define SPEEDCAM_RANGE (30.0)
15
16enum _:e_object_types
17{
18 OBJECT_TYPE_ROADBLOCK,
19 OBJECT_TYPE_SIGN,
20 OBJECT_TYPE_POLICELINE,
21 OBJECT_TYPE_SPIKE,
22 OBJECT_TYPE_SPEEDCAM
23}
24
25enum e_object_data
26{
27 Owner[MAX_PLAYER_NAME],
28 Type,
29 ObjData,
30 ObjModel,
31 Float: ObjX,
32 Float: ObjY,
33 Float: ObjZ,
34 Float: ObjRX,
35 Float: ObjRY,
36 Float: ObjRZ,
37 ObjInterior,
38 ObjVirtualWorld,
39 ObjID,
40 Text3D: ObjLabel,
41 ObjArea,
42 bool: ObjCreated
43}
44
45new
46 CopObjectData[MAX_COP_OBJECTS][e_object_data],
47 EditingCopObjectID[MAX_PLAYERS] = {-1, ...},
48 RoadblockList = mS_INVALID_LISTID,
49 SignList = mS_INVALID_LISTID;
50
51new
52 Float: zOffsets[5] = {1.35, 3.25, 0.35, 0.4, 5.35},
53 Float: streamDistances[5] = {10.0, 10.0, 5.0, 3.0, SPEEDCAM_RANGE};
54
55new
56 DB: ObjectDB,
57 DBStatement: LoadObjects,
58 DBStatement: AddObject,
59 DBStatement: UpdateObject,
60 DBStatement: RemoveObject;
61
62stock IsACopSkin(skinid)
63{
64 // includes corrupt cops from singleplayer, SWAT, FBI and Army skin and 0.3.7 cop ones
65 switch(skinid)
66 {
67 case 265..267, 280..288, 300..302, 306, 307, 309..311: return 1;
68 default: return 0;
69 }
70
71 return 0;
72}
73
74stock GetFreeObjectID()
75{
76 new id = -1;
77 for(new i; i < MAX_COP_OBJECTS; i++)
78 {
79 if(!CopObjectData[i][ObjCreated])
80 {
81 id = i;
82 break;
83 }
84 }
85
86 return id;
87}
88
89stock GetPlayerSpeed(playerid)
90{
91 new Float:vx, Float:vy, Float:vz, Float:vel;
92 vel = GetVehicleVelocity(GetPlayerVehicleID(playerid), vx, vy, vz);
93 vel = (floatsqroot(((vx*vx)+(vy*vy))+(vz*vz))* 181.5);
94 return floatround(vel);
95}
96
97stock InsertObjectToDB(id)
98{
99 stmt_bind_value(AddObject, 0, DB::TYPE_INTEGER, id);
100 stmt_bind_value(AddObject, 1, DB::TYPE_STRING, CopObjectData[id][Owner]);
101 stmt_bind_value(AddObject, 2, DB::TYPE_INTEGER, CopObjectData[id][Type]);
102 stmt_bind_value(AddObject, 3, DB::TYPE_INTEGER, CopObjectData[id][ObjData]);
103 stmt_bind_value(AddObject, 4, DB::TYPE_INTEGER, CopObjectData[id][ObjModel]);
104 stmt_bind_value(AddObject, 5, DB::TYPE_FLOAT, CopObjectData[id][ObjX]);
105 stmt_bind_value(AddObject, 6, DB::TYPE_FLOAT, CopObjectData[id][ObjY]);
106 stmt_bind_value(AddObject, 7, DB::TYPE_FLOAT, CopObjectData[id][ObjZ]);
107 stmt_bind_value(AddObject, 8, DB::TYPE_FLOAT, CopObjectData[id][ObjRX]);
108 stmt_bind_value(AddObject, 9, DB::TYPE_FLOAT, CopObjectData[id][ObjRY]);
109 stmt_bind_value(AddObject, 10, DB::TYPE_FLOAT, CopObjectData[id][ObjRZ]);
110 stmt_bind_value(AddObject, 11, DB::TYPE_INTEGER, CopObjectData[id][ObjInterior]);
111 stmt_bind_value(AddObject, 12, DB::TYPE_INTEGER, CopObjectData[id][ObjVirtualWorld]);
112 stmt_execute(AddObject);
113 return 1;
114}
115
116stock SaveObjectToDB(id)
117{
118 stmt_bind_value(UpdateObject, 0, DB::TYPE_FLOAT, CopObjectData[id][ObjX]);
119 stmt_bind_value(UpdateObject, 1, DB::TYPE_FLOAT, CopObjectData[id][ObjY]);
120 stmt_bind_value(UpdateObject, 2, DB::TYPE_FLOAT, CopObjectData[id][ObjZ]);
121 stmt_bind_value(UpdateObject, 3, DB::TYPE_FLOAT, CopObjectData[id][ObjRX]);
122 stmt_bind_value(UpdateObject, 4, DB::TYPE_FLOAT, CopObjectData[id][ObjRY]);
123 stmt_bind_value(UpdateObject, 5, DB::TYPE_FLOAT, CopObjectData[id][ObjRZ]);
124 stmt_bind_value(UpdateObject, 6, DB::TYPE_INTEGER, id);
125 stmt_execute(UpdateObject);
126 return 1;
127}
128
129encode_tires(tire1, tire2, tire3, tire4) return tire1 | (tire2 << 1) | (tire3 << 2) | (tire4 << 3);
130
131public OnFilterScriptInit()
132{
133 RoadblockList = LoadModelSelectionMenu("roadblocks.txt");
134 SignList = LoadModelSelectionMenu("signs.txt");
135
136 ObjectDB = db_open("cop_objects.db");
137 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)");
138
139 LoadObjects = db_prepare(ObjectDB, "SELECT * FROM objects");
140 AddObject = db_prepare(ObjectDB, "INSERT INTO objects (id, owner, type, data, model, posx, posy, posz, rotx, roty, rotz, interior, virtualworld) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
141 UpdateObject = db_prepare(ObjectDB, "UPDATE objects SET posx=?, posy=?, posz=?, rotx=?, roty=?, rotz=? WHERE id=?");
142 RemoveObject = db_prepare(ObjectDB, "DELETE FROM objects WHERE id=?");
143
144 new id, type, data, model, owner[MAX_PLAYER_NAME], Float: pos[3], Float: rot[3], interior, vworld;
145 stmt_bind_result_field(LoadObjects, 0, DB::TYPE_INTEGER, id);
146 stmt_bind_result_field(LoadObjects, 1, DB::TYPE_STRING, owner, MAX_PLAYER_NAME);
147 stmt_bind_result_field(LoadObjects, 2, DB::TYPE_INTEGER, type);
148 stmt_bind_result_field(LoadObjects, 3, DB::TYPE_INTEGER, data);
149 stmt_bind_result_field(LoadObjects, 4, DB::TYPE_INTEGER, model);
150 stmt_bind_result_field(LoadObjects, 5, DB::TYPE_FLOAT, pos[0]);
151 stmt_bind_result_field(LoadObjects, 6, DB::TYPE_FLOAT, pos[1]);
152 stmt_bind_result_field(LoadObjects, 7, DB::TYPE_FLOAT, pos[2]);
153 stmt_bind_result_field(LoadObjects, 8, DB::TYPE_FLOAT, rot[0]);
154 stmt_bind_result_field(LoadObjects, 9, DB::TYPE_FLOAT, rot[1]);
155 stmt_bind_result_field(LoadObjects, 10, DB::TYPE_FLOAT, rot[2]);
156 stmt_bind_result_field(LoadObjects, 11, DB::TYPE_INTEGER, interior);
157 stmt_bind_result_field(LoadObjects, 12, DB::TYPE_INTEGER, vworld);
158
159 if(stmt_execute(LoadObjects))
160 {
161 new label[96];
162 while(stmt_fetch_row(LoadObjects))
163 {
164 CopObjectData[id][ObjCreated] = true;
165 CopObjectData[id][Owner] = owner;
166 CopObjectData[id][Type] = type;
167 CopObjectData[id][ObjData] = data;
168 CopObjectData[id][ObjModel] = model;
169 CopObjectData[id][ObjInterior] = interior;
170 CopObjectData[id][ObjVirtualWorld] = vworld;
171 CopObjectData[id][ObjX] = pos[0];
172 CopObjectData[id][ObjY] = pos[1];
173 CopObjectData[id][ObjZ] = pos[2];
174 CopObjectData[id][ObjRX] = rot[0];
175 CopObjectData[id][ObjRY] = rot[1];
176 CopObjectData[id][ObjRZ] = rot[2];
177 CopObjectData[id][ObjID] = CreateDynamicObject(model, pos[0], pos[1], pos[2], rot[0], rot[1], rot[2], vworld, interior);
178 CopObjectData[id][ObjArea] = -1;
179
180 switch(type)
181 {
182 case OBJECT_TYPE_ROADBLOCK: format(label, sizeof(label), "Roadblock (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
183 case OBJECT_TYPE_SIGN: format(label, sizeof(label), "Sign (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
184 case OBJECT_TYPE_POLICELINE: format(label, sizeof(label), "Police Line (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
185 case OBJECT_TYPE_SPIKE:
186 {
187 format(label, sizeof(label), "Spike Strip (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
188 CopObjectData[id][ObjArea] = CreateDynamicSphere(pos[0], pos[1], pos[2], 2.5, vworld, interior);
189 }
190
191 case OBJECT_TYPE_SPEEDCAM:
192 {
193 format(label, sizeof(label), "Speed Camera (ID: %d)\n{FFFFFF}Speed Limit: {E74C3C}%d\n{FFFFFF}Placed by %s", id, data, CopObjectData[id][Owner]);
194 CopObjectData[id][ObjArea] = CreateDynamicSphere(pos[0], pos[1], pos[2], SPEEDCAM_RANGE, vworld, interior);
195 }
196 }
197
198 CopObjectData[id][ObjLabel] = CreateDynamic3DTextLabel(label, 0x3498DBFF, pos[0], pos[1], pos[2] + zOffsets[type], streamDistances[type], _, _, _, vworld, interior);
199 }
200 }
201
202 return 1;
203}
204
205public OnFilterScriptExit()
206{
207 db_close(ObjectDB);
208 return 1;
209}
210
211public OnPlayerConnect(playerid)
212{
213 EditingCopObjectID[playerid] = -1;
214 return 1;
215}
216
217public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
218{
219 if(dialogid == COPOBJECTS_DIALOG)
220 {
221 if(!response) return 1;
222 if(listitem == 0) ShowModelSelectionMenu(playerid, RoadblockList, "Roadblocks", 0x393939BB, 0x3498DBBB);
223 if(listitem == 1) ShowModelSelectionMenu(playerid, SignList, "Signs", 0x393939BB, 0x3498DBBB);
224
225 if(listitem == 2)
226 {
227 new id = GetFreeObjectID();
228 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Cop object limit reached.");
229 CopObjectData[id][ObjCreated] = true;
230 GetPlayerName(playerid, CopObjectData[id][Owner], MAX_PLAYER_NAME);
231 CopObjectData[id][Type] = OBJECT_TYPE_POLICELINE;
232 CopObjectData[id][ObjModel] = 19834;
233 CopObjectData[id][ObjInterior] = GetPlayerInterior(playerid);
234 CopObjectData[id][ObjVirtualWorld] = GetPlayerVirtualWorld(playerid);
235
236 new Float: x, Float: y, Float: z, Float: a;
237 GetPlayerPos(playerid, x, y, z);
238 GetPlayerFacingAngle(playerid, a);
239 x += (2.0 * floatsin(-a, degrees));
240 y += (2.0 * floatcos(-a, degrees));
241 CopObjectData[id][ObjX] = x;
242 CopObjectData[id][ObjY] = y;
243 CopObjectData[id][ObjZ] = z;
244 CopObjectData[id][ObjRX] = 0.0;
245 CopObjectData[id][ObjRY] = 0.0;
246 CopObjectData[id][ObjRZ] = a;
247 CopObjectData[id][ObjID] = CreateDynamicObject(19834, x, y, z, 0.0, 0.0, a, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
248 CopObjectData[id][ObjArea] = -1;
249
250 new string[96];
251 format(string, sizeof(string), "Police Line (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
252 CopObjectData[id][ObjLabel] = CreateDynamic3DTextLabel(string, 0x3498DBFF, x, y, z + 0.35, 5.0, _, _, _, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
253 InsertObjectToDB(id);
254 }
255
256 if(listitem == 3)
257 {
258 new id = GetFreeObjectID();
259 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Cop object limit reached.");
260 CopObjectData[id][ObjCreated] = true;
261 GetPlayerName(playerid, CopObjectData[id][Owner], MAX_PLAYER_NAME);
262 CopObjectData[id][Type] = OBJECT_TYPE_SPIKE;
263 CopObjectData[id][ObjModel] = 2899;
264 CopObjectData[id][ObjInterior] = GetPlayerInterior(playerid);
265 CopObjectData[id][ObjVirtualWorld] = GetPlayerVirtualWorld(playerid);
266
267 new Float: x, Float: y, Float: z, Float: a;
268 GetPlayerPos(playerid, x, y, z);
269 GetPlayerFacingAngle(playerid, a);
270 x += (2.0 * floatsin(-a, degrees));
271 y += (2.0 * floatcos(-a, degrees));
272
273 CopObjectData[id][ObjX] = x;
274 CopObjectData[id][ObjY] = y;
275 CopObjectData[id][ObjZ] = z - 0.85;
276 CopObjectData[id][ObjRX] = 0.0;
277 CopObjectData[id][ObjRY] = 0.0;
278 CopObjectData[id][ObjRZ] = a + 90.0;
279 CopObjectData[id][ObjID] = CreateDynamicObject(2899, x, y, z - 0.85, 0.0, 0.0, a + 90.0, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
280 CopObjectData[id][ObjArea] = CreateDynamicSphere(x, y, z - 0.85, 2.5, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
281
282 new string[96];
283 format(string, sizeof(string), "Spike Strip (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
284 CopObjectData[id][ObjLabel] = CreateDynamic3DTextLabel(string, 0x3498DBFF, x, y, z - 0.4, 3.0, _, _, _, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
285 InsertObjectToDB(id);
286 }
287
288 if(listitem == 4) ShowPlayerDialog(playerid, COPOBJECTS_DIALOG+1, DIALOG_STYLE_INPUT, "Speed Camera Setup", "Write a speed limit for this speed camera:", "Create", "Cancel");
289 return 1;
290 }
291
292 if(dialogid == COPOBJECTS_DIALOG+1)
293 {
294 if(!response) return 1;
295 if(!strlen(inputtext)) return ShowPlayerDialog(playerid, COPOBJECTS_DIALOG+1, DIALOG_STYLE_INPUT, "Speed Camera Setup", "Write a speed limit for this speed camera:", "Create", "Cancel");
296 new id = GetFreeObjectID(), limit = strval(inputtext);
297 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Cop object limit reached.");
298 CopObjectData[id][ObjCreated] = true;
299 GetPlayerName(playerid, CopObjectData[id][Owner], MAX_PLAYER_NAME);
300 CopObjectData[id][Type] = OBJECT_TYPE_SPEEDCAM;
301 CopObjectData[id][ObjData] = limit;
302 CopObjectData[id][ObjModel] = 18880;
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 - 1.5;
314 CopObjectData[id][ObjRX] = 0.0;
315 CopObjectData[id][ObjRY] = 0.0;
316 CopObjectData[id][ObjRZ] = 0.0;
317 CopObjectData[id][ObjID] = CreateDynamicObject(18880, x, y, z - 1.5, 0.0, 0.0, 0.0, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
318 CopObjectData[id][ObjArea] = CreateDynamicSphere(x, y, z - 1.5, SPEEDCAM_RANGE, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
319
320 new string[128];
321 format(string, sizeof(string), "Speed Camera (ID: %d)\n{FFFFFF}Speed Limit: {E74C3C}%d\n{FFFFFF}Placed by %s", id, limit, CopObjectData[id][Owner]);
322 CopObjectData[id][ObjLabel] = CreateDynamic3DTextLabel(string, 0x3498DBFF, x, y, z + 3.85, SPEEDCAM_RANGE, _, _, _, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
323 InsertObjectToDB(id);
324 return 1;
325 }
326
327 return 0;
328}
329
330public OnPlayerModelSelection(playerid, response, listid, modelid)
331{
332 if(listid == RoadblockList)
333 {
334 if(!response) return 1;
335 new id = GetFreeObjectID();
336 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Cop object limit reached.");
337 CopObjectData[id][ObjCreated] = true;
338 GetPlayerName(playerid, CopObjectData[id][Owner], MAX_PLAYER_NAME);
339 CopObjectData[id][Type] = OBJECT_TYPE_ROADBLOCK;
340 CopObjectData[id][ObjModel] = modelid;
341 CopObjectData[id][ObjInterior] = GetPlayerInterior(playerid);
342 CopObjectData[id][ObjVirtualWorld] = GetPlayerVirtualWorld(playerid);
343
344 new Float: x, Float: y, Float: z, Float: a;
345 GetPlayerPos(playerid, x, y, z);
346 GetPlayerFacingAngle(playerid, a);
347 x += (2.0 * floatsin(-a, degrees));
348 y += (2.0 * floatcos(-a, degrees));
349 CopObjectData[id][ObjX] = x;
350 CopObjectData[id][ObjY] = y;
351 CopObjectData[id][ObjZ] = z;
352 CopObjectData[id][ObjRX] = 0.0;
353 CopObjectData[id][ObjRY] = 0.0;
354 CopObjectData[id][ObjRZ] = a;
355 CopObjectData[id][ObjID] = CreateDynamicObject(modelid, x, y, z, 0.0, 0.0, a, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
356 CopObjectData[id][ObjArea] = -1;
357
358 new string[96];
359 format(string, sizeof(string), "Roadblock (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
360 CopObjectData[id][ObjLabel] = CreateDynamic3DTextLabel(string, 0x3498DBFF, x, y, z + 1.35, 10.0, _, _, _, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
361 InsertObjectToDB(id);
362 }
363
364 if(listid == SignList)
365 {
366 if(!response) return 1;
367 new id = GetFreeObjectID();
368 if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Cop object limit reached.");
369 CopObjectData[id][ObjCreated] = true;
370 GetPlayerName(playerid, CopObjectData[id][Owner], MAX_PLAYER_NAME);
371 CopObjectData[id][Type] = OBJECT_TYPE_SIGN;
372 CopObjectData[id][ObjModel] = modelid;
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.25;
384 CopObjectData[id][ObjRX] = 0.0;
385 CopObjectData[id][ObjRY] = 0.0;
386 CopObjectData[id][ObjRZ] = a;
387 CopObjectData[id][ObjID] = CreateDynamicObject(modelid, x, y, z - 1.25, 0.0, 0.0, a, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
388 CopObjectData[id][ObjArea] = -1;
389
390 new string[96];
391 format(string, sizeof(string), "Sign (ID: %d)\n{FFFFFF}Placed by %s", id, CopObjectData[id][Owner]);
392 CopObjectData[id][ObjLabel] = CreateDynamic3DTextLabel(string, 0x3498DBFF, x, y, z + 2.0, 10.0, _, _, _, CopObjectData[id][ObjVirtualWorld], CopObjectData[id][ObjInterior]);
393 InsertObjectToDB(id);
394 }
395
396 return 1;
397}
398
399public OnPlayerEnterDynamicArea(playerid, areaid)
400{
401 if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
402 {
403 for(new i; i < MAX_COP_OBJECTS; i++)
404 {
405 if(!CopObjectData[i][ObjCreated]) continue;
406 if(areaid == CopObjectData[i][ObjArea])
407 {
408 switch(CopObjectData[i][Type])
409 {
410 case OBJECT_TYPE_SPIKE:
411 {
412 new panels, doors, lights, tires;
413 GetVehicleDamageStatus(GetPlayerVehicleID(playerid), panels, doors, lights, tires);
414 UpdateVehicleDamageStatus(GetPlayerVehicleID(playerid), panels, doors, lights, encode_tires(1, 1, 1, 1));
415 PlayerPlaySound(playerid, 1190, 0.0, 0.0, 0.0);
416 }
417
418 case OBJECT_TYPE_SPEEDCAM:
419 {
420 new speed = GetPlayerSpeed(playerid);
421 if(speed > CopObjectData[i][ObjData])
422 {
423 // detected by a speed camera
424 PlayerPlaySound(playerid, 1132, 0.0, 0.0, 0.0);
425 SendClientMessage(playerid, -1, "You got busted! Slow down.");
426 }
427 }
428 }
429
430 break;
431 }
432 }
433 }
434
435 return 1;
436}
437
438public OnPlayerEditDynamicObject(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
439{
440 if(EditingCopObjectID[playerid] != -1)
441 {
442 new id = EditingCopObjectID[playerid];
443
444 switch(response)
445 {
446 case EDIT_RESPONSE_FINAL:
447 {
448 CopObjectData[id][ObjX] = x;
449 CopObjectData[id][ObjY] = y;
450 CopObjectData[id][ObjZ] = z;
451 CopObjectData[id][ObjRX] = rx;
452 CopObjectData[id][ObjRY] = ry;
453 CopObjectData[id][ObjRZ] = rz;
454 SetDynamicObjectPos(objectid, x, y, z);
455 SetDynamicObjectRot(objectid, rx, ry, rz);
456
457 Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, CopObjectData[id][ObjLabel], E_STREAMER_X, x);
458 Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, CopObjectData[id][ObjLabel], E_STREAMER_Y, y);
459 Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, CopObjectData[id][ObjLabel], E_STREAMER_Z, z + zOffsets[ CopObjectData[id][Type] ]);
460
461 if(IsValidDynamicArea(CopObjectData[id][ObjArea]))
462 {
463 Streamer_SetFloatData(STREAMER_TYPE_AREA, CopObjectData[id][ObjArea], E_STREAMER_X, x);
464 Streamer_SetFloatData(STREAMER_TYPE_AREA, CopObjectData[id][ObjArea], E_STREAMER_Y, y);
465 Streamer_SetFloatData(STREAMER_TYPE_AREA, CopObjectData[id][ObjArea], E_STREAMER_Z, z + zOffsets[ CopObjectData[id][Type] ]);
466 }
467
468 SaveObjectToDB(id);
469 EditingCopObjectID[playerid] = -1;
470 }
471
472 case EDIT_RESPONSE_CANCEL:
473 {
474 SetDynamicObjectPos(objectid, CopObjectData[id][ObjX], CopObjectData[id][ObjY], CopObjectData[id][ObjZ]);
475 SetDynamicObjectRot(objectid, CopObjectData[id][ObjRX], CopObjectData[id][ObjRY], CopObjectData[id][ObjRZ]);
476 EditingCopObjectID[playerid] = -1;
477 }
478 }
479 }
480
481 return 1;
482}
483
484CMD:placeobject(playerid, params[])
485{
486 if(!IsACopSkin(GetPlayerSkin(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only cops can use this command.");
487 if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You can't use this command in a vehicle.");
488 ShowPlayerDialog(playerid, COPOBJECTS_DIALOG, DIALOG_STYLE_LIST, "Cop Objects: Choose Category", "Roadblocks\nSigns\nPolice Line\nSpike Strip\nSpeed Camera", "Choose", "Cancel");
489 return 1;
490}
491
492CMD:editobject(playerid, params[])
493{
494 if(!IsPlayerAdmin(playerid) && !IsACopSkin(GetPlayerSkin(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only cops can use this command.");
495 if(EditingCopObjectID[playerid] != -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You're already editing an object.");
496 if(isnull(params)) return SendClientMessage(playerid, 0xF39C12FF, "USAGE: {FFFFFF}/editobject [id]");
497 new id = strval(params[0]);
498 if(!(0 <= id <= MAX_COP_OBJECTS - 1)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Invalid object ID.");
499 if(!CopObjectData[id][ObjCreated]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Object doesn't exist.");
500 if(!IsPlayerInRangeOfPoint(playerid, 16.0, CopObjectData[id][ObjX], CopObjectData[id][ObjY], CopObjectData[id][ObjZ])) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You're not near the object you want to edit.");
501 new name[MAX_PLAYER_NAME];
502 GetPlayerName(playerid, name, MAX_PLAYER_NAME);
503 if(!IsPlayerAdmin(playerid) && strcmp(CopObjectData[id][Owner], name)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}This object isn't yours, you can't edit it.");
504 EditingCopObjectID[playerid] = id;
505 EditDynamicObject(playerid, CopObjectData[id][ObjID]);
506 return 1;
507}
508
509CMD:gotoobject(playerid, params[])
510{
511 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
512 if(isnull(params)) return SendClientMessage(playerid, 0xF39C12FF, "USAGE: {FFFFFF}/gotoobject [id]");
513 new id = strval(params[0]);
514 if(!(0 <= id <= MAX_COP_OBJECTS - 1)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Invalid object ID.");
515 if(!CopObjectData[id][ObjCreated]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Object doesn't exist.");
516 SetPlayerPos(playerid, CopObjectData[id][ObjX], CopObjectData[id][ObjY], CopObjectData[id][ObjZ] + 1.75);
517 SetPlayerInterior(playerid, CopObjectData[id][ObjInterior]);
518 SetPlayerVirtualWorld(playerid, CopObjectData[id][ObjVirtualWorld]);
519 SendClientMessage(playerid, -1, "Teleported to object.");
520 return 1;
521}
522
523CMD:removeobject(playerid, params[])
524{
525 if(!IsPlayerAdmin(playerid) && !IsACopSkin(GetPlayerSkin(playerid))) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only cops can use this command.");
526 if(isnull(params)) return SendClientMessage(playerid, 0xF39C12FF, "USAGE: {FFFFFF}/editobject [id]");
527 new id = strval(params[0]);
528 if(!(0 <= id <= MAX_COP_OBJECTS - 1)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Invalid object ID.");
529 if(!CopObjectData[id][ObjCreated]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Object doesn't exist.");
530 if(EditingCopObjectID[playerid] == id) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You can't remove an object you're editing.");
531 new name[MAX_PLAYER_NAME];
532 GetPlayerName(playerid, name, MAX_PLAYER_NAME);
533 if(!IsPlayerAdmin(playerid) && strcmp(CopObjectData[id][Owner], name)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}This object isn't yours, you can't remove it.");
534 CopObjectData[id][ObjCreated] = false;
535 DestroyDynamicObject(CopObjectData[id][ObjID]);
536 DestroyDynamic3DTextLabel(CopObjectData[id][ObjLabel]);
537 if(IsValidDynamicArea(CopObjectData[id][ObjArea])) DestroyDynamicArea(CopObjectData[id][ObjArea]);
538 CopObjectData[id][ObjID] = -1;
539 CopObjectData[id][ObjLabel] = Text3D: -1;
540 CopObjectData[id][ObjArea] = -1;
541 stmt_bind_value(RemoveObject, 0, DB::TYPE_INTEGER, id);
542 stmt_execute(RemoveObject);
543
544 SendClientMessage(playerid, -1, "Object removed.");
545 return 1;
546}