Advertisement
Guest User

Cop Objects [Roadblocks, Signs & More]

a guest
Nov 9th, 2015
1,865
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 23.32 KB | None | 0 0
  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.  
  16. enum    _: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.  
  25. enum    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.  
  45. new
  46.     CopObjectData[MAX_COP_OBJECTS][e_object_data],
  47.     EditingCopObjectID[MAX_PLAYERS] = {-1, ...},
  48.     RoadblockList = mS_INVALID_LISTID,
  49.     SignList = mS_INVALID_LISTID;
  50.  
  51. new
  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.  
  55. new
  56.     DB: ObjectDB,
  57.     DBStatement: LoadObjects,
  58.     DBStatement: AddObject,
  59.     DBStatement: UpdateObject,
  60.     DBStatement: RemoveObject;
  61.  
  62. stock 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.  
  74. stock 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.  
  89. stock 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.  
  97. stock 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.  
  116. stock 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.  
  129. encode_tires(tire1, tire2, tire3, tire4) return tire1 | (tire2 << 1) | (tire3 << 2) | (tire4 << 3);
  130.  
  131. public 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.  
  205. public OnFilterScriptExit()
  206. {
  207.     db_close(ObjectDB);
  208.     return 1;
  209. }
  210.  
  211. public OnPlayerConnect(playerid)
  212. {
  213.     EditingCopObjectID[playerid] = -1;
  214.     return 1;
  215. }
  216.  
  217. public 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.  
  330. public 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.  
  399. public 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.  
  438. public 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.  
  484. CMD: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.  
  492. CMD: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.  
  509. CMD: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.  
  523. CMD: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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement