Advertisement
Guest User

Dynamic Gates

a guest
Dec 4th, 2015
1,481
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 19.96 KB | None | 0 0
  1. #define     FILTERSCRIPT
  2. #include    <a_samp>
  3. #include    <sqlitei>
  4. #include    <sscanf2>
  5. #include    <streamer>
  6. #include    <YSI\y_iterate>
  7. #include    <zcmd>
  8.  
  9. #define     MAX_GATES           100
  10. #define     GATE_PASS_LEN       8
  11. #define     MOVE_SPEED          (1.65)
  12.  
  13. enum    _:e_gatestates
  14. {
  15.     GATE_STATE_CLOSED,
  16.     GATE_STATE_OPEN
  17. }
  18.  
  19. enum    _:e_gatedialogs
  20. {
  21.     DIALOG_GATE_PASSWORD = 12250,
  22.     DIALOG_GATE_EDITMENU,
  23.     DIALOG_GATE_NEWPASSWORD
  24. }
  25.  
  26. enum    e_gate
  27. {
  28.     GateModel,
  29.     GatePassword[GATE_PASS_LEN],
  30.     Float: GatePos[3],
  31.     Float: GateRot[3],
  32.     Float: GateOpenPos[3],
  33.     Float: GateOpenRot[3],
  34.     GateState,
  35.     bool: GateEditing,
  36.     GateObject,
  37.     Text3D: GateLabel
  38. }
  39.  
  40. new
  41.     GateData[MAX_GATES][e_gate],
  42.     Iterator: Gates<MAX_GATES>,
  43.     EditingGateID[MAX_PLAYERS] = {-1, ...},
  44.     EditingGateType[MAX_PLAYERS] = {-1, ...},
  45.     bool: HasGateAuth[MAX_PLAYERS][MAX_GATES];
  46.    
  47. new
  48.     GateStates[2][16] = {"{E74C3C}Closed", "{2ECC71}Open"};
  49.  
  50. new
  51.     DB: GateDB,
  52.     DBStatement: LoadGates,
  53.     DBStatement: AddGate,
  54.     DBStatement: UpdateGate,
  55.     DBStatement: RemoveGate;
  56.  
  57. stock GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
  58. {
  59.     new Float:a;
  60.     GetPlayerPos(playerid, x, y, a);
  61.     GetPlayerFacingAngle(playerid, a);
  62.     if (GetPlayerVehicleID(playerid))
  63.     {
  64.         GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
  65.     }
  66.     x += (distance * floatsin(-a, degrees));
  67.     y += (distance * floatcos(-a, degrees));
  68. }
  69.  
  70. stock GetClosestGate(playerid, Float: range = 5.0)
  71. {
  72.     new id = -1, Float: playerdist, Float: tempdist = 9999.0;
  73.     foreach(new i : Gates)
  74.     {
  75.         playerdist = GetPlayerDistanceFromPoint(playerid, GateData[i][GatePos][0], GateData[i][GatePos][1], GateData[i][GatePos][2]);
  76.         if(playerdist > range) continue;
  77.         if(playerdist <= tempdist)
  78.         {
  79.             tempdist = playerdist;
  80.             id = i;
  81.         }
  82.     }
  83.    
  84.     return id;
  85. }
  86.  
  87. stock SetGateState(id, gate_state, move = 1)
  88. {
  89.     new string[32];
  90.     format(string, sizeof(string), "Gate #%d\n%s", id, GateStates[gate_state]);
  91.     UpdateDynamic3DTextLabelText(GateData[id][GateLabel], 0xECF0F1FF, string);
  92.     GateData[id][GateState] = gate_state;
  93.    
  94.     switch(move)
  95.     {
  96.         case 1:
  97.         {
  98.             if(gate_state == GATE_STATE_CLOSED) {
  99.                 MoveDynamicObject(GateData[id][GateObject], GateData[id][GatePos][0], GateData[id][GatePos][1], GateData[id][GatePos][2], MOVE_SPEED, GateData[id][GateRot][0], GateData[id][GateRot][1], GateData[id][GateRot][2]);
  100.             }else{
  101.                 MoveDynamicObject(GateData[id][GateObject], GateData[id][GateOpenPos][0], GateData[id][GateOpenPos][1], GateData[id][GateOpenPos][2], MOVE_SPEED, GateData[id][GateOpenRot][0], GateData[id][GateOpenRot][1], GateData[id][GateOpenRot][2]);
  102.             }
  103.         }
  104.  
  105.         case 2:
  106.         {
  107.             if(gate_state == GATE_STATE_CLOSED) {
  108.                 SetDynamicObjectPos(GateData[id][GateObject], GateData[id][GatePos][0], GateData[id][GatePos][1], GateData[id][GatePos][2]);
  109.                 SetDynamicObjectRot(GateData[id][GateObject], GateData[id][GateRot][0], GateData[id][GateRot][1], GateData[id][GateRot][2]);
  110.             }else{
  111.                 SetDynamicObjectPos(GateData[id][GateObject], GateData[id][GateOpenPos][0], GateData[id][GateOpenPos][1], GateData[id][GateOpenPos][2]);
  112.                 SetDynamicObjectRot(GateData[id][GateObject], GateData[id][GateOpenRot][0], GateData[id][GateOpenRot][1], GateData[id][GateOpenRot][2]);
  113.             }
  114.         }
  115.     }
  116.    
  117.     return 1;
  118. }
  119.  
  120. stock ToggleGateState(id, move = 1)
  121. {
  122.     if(GateData[id][GateState] == GATE_STATE_CLOSED) {
  123.         SetGateState(id, GATE_STATE_OPEN, move);
  124.     }else{
  125.         SetGateState(id, GATE_STATE_CLOSED, move);
  126.     }
  127.    
  128.     return 1;
  129. }
  130.  
  131. stock ShowEditMenu(playerid, id)
  132. {
  133.     new string[128];
  134.     format(string, sizeof(string), "Gate State\t%s\nGate Password\t%s\nEdit Gate Position\nEdit Opening Position\nRemove Gate", GateStates[ GateData[id][GateState] ], GateData[id][GatePassword]);
  135.     ShowPlayerDialog(playerid, DIALOG_GATE_EDITMENU, DIALOG_STYLE_TABLIST, "Gate Editing", string, "Choose", "Cancel");
  136.     return 1;
  137. }
  138.  
  139. stock SaveGate(id)
  140. {
  141.     stmt_bind_value(UpdateGate, 0, DB::TYPE_STRING, GateData[id][GatePassword]);
  142.     stmt_bind_value(UpdateGate, 1, DB::TYPE_FLOAT, GateData[id][GatePos][0]);
  143.     stmt_bind_value(UpdateGate, 2, DB::TYPE_FLOAT, GateData[id][GatePos][1]);
  144.     stmt_bind_value(UpdateGate, 3, DB::TYPE_FLOAT, GateData[id][GatePos][2]);
  145.     stmt_bind_value(UpdateGate, 4, DB::TYPE_FLOAT, GateData[id][GateRot][0]);
  146.     stmt_bind_value(UpdateGate, 5, DB::TYPE_FLOAT, GateData[id][GateRot][1]);
  147.     stmt_bind_value(UpdateGate, 6, DB::TYPE_FLOAT, GateData[id][GateRot][2]);
  148.     stmt_bind_value(UpdateGate, 7, DB::TYPE_FLOAT, GateData[id][GateOpenPos][0]);
  149.     stmt_bind_value(UpdateGate, 8, DB::TYPE_FLOAT, GateData[id][GateOpenPos][1]);
  150.     stmt_bind_value(UpdateGate, 9, DB::TYPE_FLOAT, GateData[id][GateOpenPos][2]);
  151.     stmt_bind_value(UpdateGate, 10, DB::TYPE_FLOAT, GateData[id][GateOpenRot][0]);
  152.     stmt_bind_value(UpdateGate, 11, DB::TYPE_FLOAT, GateData[id][GateOpenRot][1]);
  153.     stmt_bind_value(UpdateGate, 12, DB::TYPE_FLOAT, GateData[id][GateOpenRot][2]);
  154.     stmt_bind_value(UpdateGate, 13, DB::TYPE_INTEGER, id);
  155.     stmt_execute(UpdateGate);
  156.     return 1;
  157. }
  158.  
  159. public OnFilterScriptInit()
  160. {
  161.     GateDB = db_open("dyn_gates.db");
  162.     db_query(GateDB, "CREATE TABLE IF NOT EXISTS gates (id INTEGER, model INTEGER, password TEXT, def_posx FLOAT, def_posy FLOAT, def_posz FLOAT, def_rotx FLOAT, def_roty FLOAT, def_rotz FLOAT, open_posx FLOAT, open_posy FLOAT, open_posz FLOAT, open_rotx FLOAT, open_roty FLOAT, open_rotz FLOAT)");
  163.  
  164.     LoadGates = db_prepare(GateDB, "SELECT * FROM gates");
  165.     AddGate = db_prepare(GateDB, "INSERT INTO gates (id, model, password, def_posx, def_posy, def_posz) VALUES (?, ?, ?, ?, ?, ?)");
  166.     UpdateGate = db_prepare(GateDB, "UPDATE gates SET password=?, def_posx=?, def_posy=?, def_posz=?, def_rotx=?, def_roty=?, def_rotz=?, open_posx=?, open_posy=?, open_posz=?, open_rotx=?, open_roty=?, open_rotz=? WHERE id=?");
  167.     RemoveGate = db_prepare(GateDB, "DELETE FROM gates WHERE id=?");
  168.    
  169.     new id, model, password[GATE_PASS_LEN], Float: pos[3], Float: rot[3], Float: openpos[3], Float: openrot[3];
  170.     stmt_bind_result_field(LoadGates, 0, DB::TYPE_INTEGER, id);
  171.     stmt_bind_result_field(LoadGates, 1, DB::TYPE_INTEGER, model);
  172.     stmt_bind_result_field(LoadGates, 2, DB::TYPE_STRING, password, GATE_PASS_LEN);
  173.     stmt_bind_result_field(LoadGates, 3, DB::TYPE_FLOAT, pos[0]);
  174.     stmt_bind_result_field(LoadGates, 4, DB::TYPE_FLOAT, pos[1]);
  175.     stmt_bind_result_field(LoadGates, 5, DB::TYPE_FLOAT, pos[2]);
  176.     stmt_bind_result_field(LoadGates, 6, DB::TYPE_FLOAT, rot[0]);
  177.     stmt_bind_result_field(LoadGates, 7, DB::TYPE_FLOAT, rot[1]);
  178.     stmt_bind_result_field(LoadGates, 8, DB::TYPE_FLOAT, rot[2]);
  179.     stmt_bind_result_field(LoadGates, 9, DB::TYPE_FLOAT, openpos[0]);
  180.     stmt_bind_result_field(LoadGates, 10, DB::TYPE_FLOAT, openpos[1]);
  181.     stmt_bind_result_field(LoadGates, 11, DB::TYPE_FLOAT, openpos[2]);
  182.     stmt_bind_result_field(LoadGates, 12, DB::TYPE_FLOAT, openrot[0]);
  183.     stmt_bind_result_field(LoadGates, 13, DB::TYPE_FLOAT, openrot[1]);
  184.     stmt_bind_result_field(LoadGates, 14, DB::TYPE_FLOAT, openrot[2]);
  185.  
  186.     if(stmt_execute(LoadGates))
  187.     {
  188.         new label[32];
  189.         while(stmt_fetch_row(LoadGates))
  190.         {
  191.             GateData[id][GateModel] = model;
  192.             GateData[id][GatePassword] = password;
  193.             GateData[id][GatePos][0] = pos[0];
  194.             GateData[id][GatePos][1] = pos[1];
  195.             GateData[id][GatePos][2] = pos[2];
  196.             GateData[id][GateRot][0] = rot[0];
  197.             GateData[id][GateRot][1] = rot[1];
  198.             GateData[id][GateRot][2] = rot[2];
  199.             GateData[id][GateOpenPos][0] = openpos[0];
  200.             GateData[id][GateOpenPos][1] = openpos[1];
  201.             GateData[id][GateOpenPos][2] = openpos[2];
  202.             GateData[id][GateOpenRot][0] = openrot[0];
  203.             GateData[id][GateOpenRot][1] = openrot[1];
  204.             GateData[id][GateOpenRot][2] = openrot[2];
  205.            
  206.             format(label, sizeof(label), "Gate #%d\n%s", id, GateStates[GATE_STATE_CLOSED]);
  207.             GateData[id][GateObject] = CreateDynamicObject(model, pos[0], pos[1], pos[2], rot[0], rot[1], rot[2]);
  208.             GateData[id][GateLabel] = CreateDynamic3DTextLabel(label, 0xECF0F1FF, pos[0], pos[1], pos[2], 10.0);
  209.             Iter_Add(Gates, id);
  210.         }
  211.     }
  212.    
  213.     return 1;
  214. }
  215.  
  216. public OnFilterScriptExit()
  217. {
  218.     db_close(GateDB);
  219.     return 1;
  220. }
  221.  
  222. public OnPlayerConnect(playerid)
  223. {
  224.     EditingGateID[playerid] = -1;
  225.     EditingGateType[playerid] = -1;
  226.     for(new i; i < MAX_GATES; i++) HasGateAuth[playerid][i] = false;
  227.     return 1;
  228. }
  229.  
  230. public OnPlayerDisconnect(playerid, reason)
  231. {
  232.     if(EditingGateID[playerid] != -1) GateData[ EditingGateID[playerid] ][GateEditing] = false;
  233.     return 1;
  234. }
  235.  
  236. public OnPlayerEditDynamicObject(playerid, STREAMER_TAG_OBJECT objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
  237. {
  238.     if(EditingGateID[playerid] == -1) return 1;
  239.     switch(response)
  240.     {
  241.         case EDIT_RESPONSE_FINAL:
  242.         {
  243.             new id = EditingGateID[playerid];
  244.             GateData[id][GateEditing] = false;
  245.            
  246.             switch(EditingGateType[playerid])
  247.             {
  248.                 case GATE_STATE_CLOSED:
  249.                 {
  250.                     Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, GateData[id][GateLabel], E_STREAMER_X, x);
  251.                     Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, GateData[id][GateLabel], E_STREAMER_Y, y);
  252.                     Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, GateData[id][GateLabel], E_STREAMER_Z, z);
  253.                     SetDynamicObjectPos(objectid, x, y, z);
  254.                     SetDynamicObjectRot(objectid, rx, ry, rz);
  255.                     GateData[id][GatePos][0] = x;
  256.                     GateData[id][GatePos][1] = y;
  257.                     GateData[id][GatePos][2] = z;
  258.                     GateData[id][GateRot][0] = rx;
  259.                     GateData[id][GateRot][1] = ry;
  260.                     GateData[id][GateRot][2] = rz;
  261.                     SendClientMessage(playerid, 0x2ECC71FF, "INFO: {FFFFFF}Edited gate's default position.");
  262.                    
  263.                     if(GateData[id][GateOpenPos][0] == 0.0 && GateData[id][GateOpenRot][0] == 0.0) {
  264.                         GateData[id][GateEditing] = true;
  265.                         EditingGateType[playerid] = GATE_STATE_OPEN;
  266.                         EditDynamicObject(playerid, objectid);
  267.                        
  268.                         SendClientMessage(playerid, 0xF39C12FF, "WARNING: {FFFFFF}This gate doesn't have an opening position.");
  269.                         SendClientMessage(playerid, 0xF39C12FF, "WARNING: {FFFFFF}You can define an opening position now or you can do it later.");
  270.                         SendClientMessage(playerid, 0xF39C12FF, "WARNING: {FFFFFF}People won't be able to open this gate until you define an opening position.");
  271.                     }else{
  272.                         EditingGateID[playerid] = -1;
  273.                         EditingGateType[playerid] = -1;
  274.                     }
  275.                    
  276.                     SaveGate(id);
  277.                 }
  278.                
  279.                 case GATE_STATE_OPEN:
  280.                 {
  281.                     SendClientMessage(playerid, 0x2ECC71FF, "INFO: {FFFFFF}Edited gate's opening position.");
  282.                     SetGateState(id, GATE_STATE_CLOSED, 2);
  283.                     GateData[id][GateOpenPos][0] = x;
  284.                     GateData[id][GateOpenPos][1] = y;
  285.                     GateData[id][GateOpenPos][2] = z;
  286.                     GateData[id][GateOpenRot][0] = rx;
  287.                     GateData[id][GateOpenRot][1] = ry;
  288.                     GateData[id][GateOpenRot][2] = rz;
  289.  
  290.                     EditingGateID[playerid] = -1;
  291.                     EditingGateType[playerid] = -1;
  292.                     SaveGate(id);
  293.                 }
  294.             }
  295.         }
  296.        
  297.         case EDIT_RESPONSE_CANCEL:
  298.         {
  299.             new id = EditingGateID[playerid];
  300.             GateData[id][GateEditing] = false;
  301.            
  302.             switch(EditingGateType[playerid])
  303.             {
  304.                 case GATE_STATE_CLOSED:
  305.                 {
  306.                     SetDynamicObjectPos(objectid, GateData[id][GatePos][0], GateData[id][GatePos][1], GateData[id][GatePos][2]);
  307.                     SetDynamicObjectRot(objectid, GateData[id][GateRot][0], GateData[id][GateRot][1], GateData[id][GateRot][2]);
  308.                     GateData[id][GatePos][0] = x;
  309.                     GateData[id][GatePos][1] = y;
  310.                     GateData[id][GatePos][2] = z;
  311.                     GateData[id][GateRot][0] = rx;
  312.                     GateData[id][GateRot][1] = ry;
  313.                     GateData[id][GateRot][2] = rz;
  314.                     SendClientMessage(playerid, 0x2ECC71FF, "INFO: {FFFFFF}Cancelled editing gate's default position.");
  315.                 }
  316.  
  317.                 case GATE_STATE_OPEN:
  318.                 {
  319.                     SendClientMessage(playerid, 0x2ECC71FF, "INFO: {FFFFFF}Cancelled editing gate's opening position.");
  320.                    
  321.                     if(GateData[id][GateOpenPos][0] == 0.0 && GateData[id][GateOpenRot][0] == 0.0)
  322.                     {
  323.                         SendClientMessage(playerid, 0xF39C12FF, "WARNING: {FFFFFF}This gate doesn't have an opening position.");
  324.                         SendClientMessage(playerid, 0xF39C12FF, "WARNING: {FFFFFF}People won't be able to open it until you define an opening position.");
  325.                     }
  326.  
  327.                     SetGateState(id, GATE_STATE_CLOSED, 2);
  328.                     EditingGateID[playerid] = -1;
  329.                     EditingGateType[playerid] = -1;
  330.                 }
  331.             }
  332.         }
  333.     }
  334.    
  335.     return 1;
  336. }
  337.  
  338. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  339. {
  340.     if(dialogid == DIALOG_GATE_PASSWORD)
  341.     {
  342.         if(!response) return 1;
  343.         if(!strlen(inputtext)) return ShowPlayerDialog(playerid, DIALOG_GATE_PASSWORD, DIALOG_STYLE_PASSWORD, "Gate Password", "{E74C3C}You didn't write a password.\n{FFFFFF}Please enter this gate's password:", "Done", "Cancel");
  344.         new id = GetClosestGate(playerid);
  345.         if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You're not near a gate.");
  346.         if(strcmp(GateData[id][GatePassword], inputtext)) return ShowPlayerDialog(playerid, DIALOG_GATE_PASSWORD, DIALOG_STYLE_PASSWORD, "Gate Password", "{E74C3C}Wrong password.\n{FFFFFF}Please enter this gate's password:", "Done", "Cancel");
  347.         HasGateAuth[playerid][id] = true;
  348.         ToggleGateState(id);
  349.         return 1;
  350.     }
  351.    
  352.     if(dialogid == DIALOG_GATE_EDITMENU)
  353.     {
  354.         if(!IsPlayerAdmin(playerid)) return 1;
  355.         if(!response)
  356.         {
  357.             if(EditingGateID[playerid] != -1) GateData[ EditingGateID[playerid] ][GateEditing] = false;
  358.             EditingGateID[playerid] = -1;
  359.             return 1;
  360.         }
  361.        
  362.         new id = EditingGateID[playerid];
  363.         if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You're not editing a gate.");
  364.         if(listitem == 0)
  365.         {
  366.             ToggleGateState(id);
  367.             ShowEditMenu(playerid, id);
  368.         }
  369.        
  370.         if(listitem == 1) ShowPlayerDialog(playerid, DIALOG_GATE_NEWPASSWORD, DIALOG_STYLE_INPUT, "Change Gate Password", "Write a new password for selected gate:\nYou can leave this empty if you want to remove gate's password.", "Update", "Cancel");
  371.         if(listitem == 2)
  372.         {
  373.             SetGateState(id, GATE_STATE_CLOSED, 2);
  374.             EditingGateType[playerid] = GATE_STATE_CLOSED;
  375.             EditDynamicObject(playerid, GateData[id][GateObject]);
  376.             SendClientMessage(playerid, 0x2ECC71FF, "INFO: {FFFFFF}Editing gate's default position.");
  377.         }
  378.        
  379.         if(listitem == 3)
  380.         {
  381.             SetGateState(id, GATE_STATE_OPEN, 2);
  382.             EditingGateType[playerid] = GATE_STATE_OPEN;
  383.             EditDynamicObject(playerid, GateData[id][GateObject]);
  384.             SendClientMessage(playerid, 0x2ECC71FF, "INFO: {FFFFFF}Editing gate's opening position.");
  385.         }
  386.        
  387.         if(listitem == 4)
  388.         {
  389.             GateData[id][GateEditing] = false;
  390.             GateData[id][GatePos][0] = GateData[id][GatePos][1] = GateData[id][GatePos][2] = 0.0;
  391.             GateData[id][GateRot][0] = GateData[id][GateRot][1] = GateData[id][GateRot][2] = 0.0;
  392.             GateData[id][GateOpenPos][0] = GateData[id][GateOpenPos][1] = GateData[id][GateOpenPos][2] = 0.0;
  393.             GateData[id][GateOpenRot][0] = GateData[id][GateOpenRot][1] = GateData[id][GateOpenRot][2] = 0.0;
  394.             DestroyDynamicObject(GateData[id][GateObject]);
  395.             DestroyDynamic3DTextLabel(GateData[id][GateLabel]);
  396.             Iter_Remove(Gates, id);
  397.            
  398.             stmt_bind_value(RemoveGate, 0, DB::TYPE_INTEGER, id);
  399.             stmt_execute(RemoveGate);
  400.            
  401.             foreach(new i : Player) if(EditingGateID[i] == id) EditingGateID[i] = -1;
  402.             SendClientMessage(playerid, 0x2ECC71FF, "INFO: {FFFFFF}Gate removed.");
  403.         }
  404.        
  405.         return 1;
  406.     }
  407.    
  408.     if(dialogid == DIALOG_GATE_NEWPASSWORD)
  409.     {
  410.         if(!IsPlayerAdmin(playerid)) return 1;
  411.         new id = EditingGateID[playerid];
  412.         if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You're not editing a gate.");
  413.         if(!response) return ShowEditMenu(playerid, id);
  414.         format(GateData[id][GatePassword], GATE_PASS_LEN, "%s", inputtext);
  415.         foreach(new i : Player) HasGateAuth[i][id] = false;
  416.         SendClientMessage(playerid, 0x2ECC71FF, "INFO: {FFFFFF}Password updated.");
  417.         SaveGate(id);
  418.         ShowEditMenu(playerid, id);
  419.         return 1;
  420.     }
  421.    
  422.     return 0;
  423. }
  424.  
  425. CMD:gate(playerid, params[])
  426. {
  427.     new id = GetClosestGate(playerid);
  428.     if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You're not near a gate.");
  429.     if(GateData[id][GateEditing]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}This gate is being edited, you can't use it.");
  430.     if(GateData[id][GateOpenPos][0] == 0.0 && GateData[id][GateOpenRot][0] == 0.0) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}This gate has no opening position.");
  431.     if(!strlen(GateData[id][GatePassword])) {
  432.         ToggleGateState(id);
  433.     }else{
  434.         if(HasGateAuth[playerid][id]) {
  435.             ToggleGateState(id);
  436.         }else{
  437.             ShowPlayerDialog(playerid, DIALOG_GATE_PASSWORD, DIALOG_STYLE_PASSWORD, "Gate Password", "This gate is password protected.\nPlease enter this gate's password:", "Done", "Cancel");
  438.         }
  439.     }
  440.    
  441.     return 1;
  442. }
  443.  
  444. CMD:creategate(playerid, params[])
  445. {
  446.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
  447.     if(EditingGateID[playerid] != -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You can't create a gate while editing one.");
  448.     new id = Iter_Free(Gates);
  449.     if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Gate limit reached, you can't place any more gates.");
  450.     new model, password[GATE_PASS_LEN];
  451.     if(sscanf(params, "iS()["#GATE_PASS_LEN"]", model, password)) return SendClientMessage(playerid, 0xF39C12FF, "USAGE: {FFFFFF}/creategate [model id] [password (optional)]");
  452.     GateData[id][GateModel] = model;
  453.     GateData[id][GatePassword] = password;
  454.    
  455.     new Float: x, Float: y, Float: z;
  456.     GetPlayerPos(playerid, x, y, z);
  457.     GetXYInFrontOfPlayer(playerid, x, y, 3.0);
  458.    
  459.     GateData[id][GatePos][0] = x;
  460.     GateData[id][GatePos][1] = y;
  461.     GateData[id][GatePos][2] = z;
  462.     GateData[id][GateRot][0] = GateData[id][GateRot][1] = GateData[id][GateRot][2] = 0.0;
  463.     GateData[id][GateOpenPos][0] = GateData[id][GateOpenPos][1] = GateData[id][GateOpenPos][2] = 0.0;
  464.     GateData[id][GateOpenRot][0] = GateData[id][GateOpenRot][1] = GateData[id][GateOpenRot][2] = 0.0;
  465.     GateData[id][GateState] = GATE_STATE_CLOSED;
  466.     GateData[id][GateEditing] = true;
  467.     GateData[id][GateObject] = CreateDynamicObject(model, x, y, z, 0.0, 0.0, 0.0);
  468.     new string[32];
  469.     format(string, sizeof(string), "Gate #%d\n%s", id, GateStates[GATE_STATE_CLOSED]);
  470.     GateData[id][GateLabel] = CreateDynamic3DTextLabel(string, 0xECF0F1FF, x, y, z, 10.0);
  471.     Iter_Add(Gates, id);
  472.    
  473.     stmt_bind_value(AddGate, 0, DB::TYPE_INTEGER, id);
  474.     stmt_bind_value(AddGate, 1, DB::TYPE_INTEGER, model);
  475.     stmt_bind_value(AddGate, 2, DB::TYPE_STRING, password);
  476.     stmt_bind_value(AddGate, 3, DB::TYPE_FLOAT, x);
  477.     stmt_bind_value(AddGate, 4, DB::TYPE_FLOAT, y);
  478.     stmt_bind_value(AddGate, 5, DB::TYPE_FLOAT, z);
  479.     stmt_execute(AddGate);
  480.    
  481.     EditingGateID[playerid] = id;
  482.     EditingGateType[playerid] = GATE_STATE_CLOSED;
  483.     EditDynamicObject(playerid, GateData[id][GateObject]);
  484.     SendClientMessage(playerid, 0x2ECC71FF, "INFO: {FFFFFF}Gate created, now you can edit it.");
  485.     return 1;
  486. }
  487.  
  488. CMD:editgate(playerid, params[])
  489. {
  490.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
  491.     if(EditingGateID[playerid] != -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You're already editing a gate.");
  492.     new id;
  493.     sscanf(params, "I(-2)", id);
  494.     if(id == -2) id = GetClosestGate(playerid);
  495.     if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You're not near a gate.");
  496.     if(GateData[id][GateEditing]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Gate is being edited.");
  497.     if(!IsPlayerInRangeOfPoint(playerid, 20.0, GateData[id][GatePos][0], GateData[id][GatePos][1], GateData[id][GatePos][2])) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You're not near the gate you want to edit.");
  498.     GateData[id][GateEditing] = true;
  499.     EditingGateID[playerid] = id;
  500.     ShowEditMenu(playerid, id);
  501.     return 1;
  502. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement