Advertisement
Guest User

Liga - Florian

a guest
Sep 30th, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 48.86 KB | None | 0 0
  1. #include <a_samp>
  2. #include <mapandreas>
  3. #include <sscanf2>
  4.  
  5. #define RA_FILE_NAME    "rails.txt"
  6. #define EQ_FILE_NAME    "equip.txt"
  7. #define MAX_RAILCHECK   258
  8. #define DIALOG_MANAGE   15
  9.  
  10. enum en_ed {
  11.     Float: ed_pos[4],
  12.     ed_objects[22],
  13.     bool: ed_state[2],
  14.     o_ed_state[2],
  15.     bool: ed_spawned
  16. };
  17.  
  18. new File: rail_file,
  19.     v, g,
  20.     Float: rails[MAX_RAILCHECK][3],
  21.     gstring[320],
  22.     equipment_data[MAX_RAILCHECK][en_ed],
  23.     eq_timer,
  24.     rails_recursive,
  25.     pd_command[32],
  26.     on_admin,
  27.     train_vehicle;
  28.  
  29. static const pre_rails[MAX_RAILCHECK][2] = {
  30.     {929, 968}, {948, 970}, {969, 972}, {990, 976}, {1011, 982}, {1040, 992}, {1071, 1006}, {1097, 1020}, {1126, 1039}, {1166, 1069},
  31.     {1191, 1090}, {1219, 1114}, {1249, 1142}, {1277, 1168}, {1309, 1190}, {1355, 1194}, {1399, 1194},
  32.     {692, 442}, {731, 435}, {770, 426}, {809, 419}, {851, 411}, {891, 411}, {932, 415}, {967, 424}, {1005, 430},
  33.     {1048, 425}, {1081, 410}, {1111, 391}, {1122, 357}, {1121, 316}, {1120, 274}, {1120, 233}, {1119, 197}, {1115, 157}, {1122, 117},
  34.     {1141, 85}, {1171, 58}, {1206, 57}, {1235, 75}, {1274, 88}, {1327, 87}, {1366, 87}, {1398, 87}, {1443, 74}, {1506, 73},
  35.     {1551, 73}, {1598, 75}, {1642, 76}, {1662, 102}, {1665, 155}, {1678, 188}, {1704, 206}, {1732, 233}, {1733, 283}, {1731, 325},
  36.     {1759, 358}, {1758, 391}, {1759, 427}, {1748, 450}, {1728, 471}, {1729, 522}, {1727, 572}, {1729, 626}, {1734, 668}, {1748, 704},
  37.     {1748, 749}, {1726, 785}, {1699, 790}, {1656, 789}, {1616, 788}, {1598, 794}, {311, 793}, {313, 759}, {315, 724}, {316, 685},
  38.     {325, 651}, {352, 629}, {383, 614}, {426, 592}, {464, 570}, {506, 547}, {541, 526}, {575, 509}, {605, 487}, {640, 469},
  39.     {665, 456}, {322, 697}, {330, 726}, {357, 729}, {390, 728}, {410, 712}, {436, 691}, {307, 818}, {308, 855}, {306, 886},
  40.     {309, 919}, {308, 953}, {309, 988}, {320, 1013}, {343, 1033}, {366, 1058}, {396, 1072}, {431, 1082}, {464, 1086}, {494, 1086},
  41.     {529, 1086}, {557, 1087}, {594, 1087}, {629, 1079}, {647, 1052}, {654, 1014}, {678, 995}, {708, 994}, {735, 1011}, {763, 1026},
  42.     {792, 1018}, {814, 996}, {846, 973}, {885, 968}, {925, 968}, {1407, 1194}, {1441, 1193}, {1480, 1194}, {1513, 1195}, {1542, 1194},
  43.     {1558, 1182}, {1560, 1153}, {1560, 1128}, {1570, 1102}, {1583, 1076}, {1586, 1045}, {1585, 1015}, {1582, 984}, {1581, 954}, {1581, 923},
  44.     {1568, 898}, {1539, 879}, {1513, 863}, {1499, 842}, {1507, 815}, {1540, 812}, {1573, 807}, {1590, 800}, {1534, 1198}, {1554, 1212},
  45.     {1573, 1230}, {1592, 1244}, {1583, 1264}, {1561, 1282}, {1420, 1207}, {1412, 1202}, {1585, 1002}, {1585, 979}, {1581, 951}, {1580, 926},
  46.     {1570, 901}, {1538, 881}, {1514, 862}, {1500, 837}, {1516, 816}, {1546, 812}, {1575, 809}, {1592, 798}, {1619, 787}, {1654, 791}, {1686, 791},
  47.     {1715, 791}, {1731, 775}, {1746, 752}, {1749, 722}, {1745, 698}, {1736, 666}, {1733, 635}, {1729, 599}, {1730, 568}, {1726, 540}, {1731, 507},
  48.     {1727, 474}, {1736, 463}, {1749, 447}, {1760, 428}, {1761, 392}, {1761, 364}, {1746, 339}, {1735, 321}, {1736, 295}, {1736, 265}, {1732, 239},
  49.     {1728, 223}, {1714, 212}, {1691, 197}, {1671, 180}, {1663, 135}, {1662, 114}, {1653, 86}, {1606, 73}, {1566, 78}, {1526, 74}, {1491, 75}, {1452, 76},
  50.     {1419, 80}, {1382, 87}, {1345, 89}, {1308, 91}, {1264, 87}, {1238, 74}, {1211, 61}, {1172, 61}, {1150, 75}, {1134, 103}, {1120, 128},
  51.     {695, 995}, {702, 995}, {711, 998}, {718, 1002}, {725, 1004}, {731, 1007}, {735, 1011}, {740, 1015}, {746, 1019},
  52.     {754, 1023}, {763, 1026}, {770, 1026}, {778, 1027}, {786, 1023}, {793, 1020}, {799, 1015}, {805, 1009}, {810, 1002}, {815, 996},
  53.     {820, 991}, {826, 983}, {821, 987}, {832, 981}, {837, 979}, {842, 976}, {847, 975}, {855, 971}, {864, 970}, {852, 972},
  54.     {872, 969}, {880, 967}, {887, 969}, {894, 969}, {900, 967}, {908, 967}, {915, 969}, {923, 967}, {931, 967}, {689, 994},
  55.     {681, 995}, {674, 998}, {667, 1004}, {663, 1009}, {657, 1015}, {653, 1023}, {651, 1030}
  56. };
  57.  
  58. static const l_models[3] = { 19123, 19125, 19124 };
  59.  
  60. forward UpdateSafety();
  61. forward Float: GetDistanceFromPointToPoint( Float:X,Float:Y,Float:Z,Float:tX,Float:tY,Float:tZ );
  62.  
  63. public OnFilterScriptInit() {
  64.     MapAndreas_Init( MAP_ANDREAS_MODE_FULL );
  65.  
  66.     new temp[2];
  67.  
  68.     rail_file = fopen( RA_FILE_NAME, io_readwrite );
  69.     // ----
  70.  
  71.     if( rail_file ) {
  72.         fread( rail_file, temp );
  73.  
  74.         if( !temp[0] ) {
  75.             fclose( rail_file );
  76.  
  77.             CreateRailChecks( "/pd-eq" );
  78.         }
  79.         else {
  80.             fclose( rail_file );
  81.  
  82.             LoadRailChecks();
  83.         }
  84.     }
  85.    
  86.     rails_recursive = 0;
  87.    
  88.     v = 0;
  89.     for( ; v < GetMaxPlayers(); v ++ ) {
  90.         if( !IsPlayerConnected(v) ) continue;
  91.        
  92.         OnPlayerSpawn( v );
  93.         SetPlayerTime( v, 21, 0 );
  94.     }
  95.    
  96.     train_vehicle = AddStaticVehicle(538, 1738.7935, -1954.1925, 12.6451, 48.6520, -1, -1);
  97.    
  98.     LoadEquipments();
  99.    
  100.     eq_timer = SetTimer( "UpdateSafety", 100, true );
  101. }
  102.  
  103. public OnFilterScriptExit() {
  104.     v = 0;
  105.     for( ; v < MAX_RAILCHECK; v ++ ) {
  106.         if( !equipment_data[v][ed_spawned] ) continue;
  107.        
  108.         g = 0;
  109.         for( ; g < 22; g ++ ) {
  110.             DestroyObject( equipment_data[v][ed_objects][g] );
  111.         }
  112.        
  113.         equipment_data[v][ed_spawned] = false;
  114.     }
  115.    
  116.     DestroyVehicle( train_vehicle );
  117.    
  118.     KillTimer( eq_timer );
  119. }
  120.  
  121. public UpdateSafety() {
  122.     if( CountEquipment() < 3 ) return 0;
  123.    
  124.     new Float: sp[9],
  125.         sign[2][64],
  126.         ret = CountEquipment()-1;
  127.    
  128.     v = 0;
  129.     for( ; v < MAX_RAILCHECK; v ++ ) {
  130.         if( !equipment_data[v][ed_spawned] ) continue;
  131.         sp[0] = equipment_data[v][ed_pos][0];
  132.         sp[1] = equipment_data[v][ed_pos][1];
  133.         sp[2] = equipment_data[v][ed_pos][3];
  134.         sp[3] = equipment_data[v][ed_pos][0];
  135.         sp[4] = equipment_data[v][ed_pos][1];
  136.         sp[5] = equipment_data[v][ed_pos][0];
  137.         sp[6] = equipment_data[v][ed_pos][1];
  138.         sp[7] = equipment_data[v][ed_pos][0];
  139.         sp[8] = equipment_data[v][ed_pos][1];
  140.         // ----------------------------------
  141.        
  142.         sp[0] += (5.0 * floatsin(-sp[2], degrees));
  143.         sp[1] += (5.0 * floatcos(-sp[2], degrees));
  144.         sp[0] += (2.05 * floatsin(-sp[2]-90, degrees));
  145.         sp[1] += (2.05 * floatcos(-sp[2]-90, degrees));
  146.        
  147.         sp[5] += (5.0 * floatsin(-sp[2] + 180, degrees));
  148.         sp[6] += (5.0 * floatcos(-sp[2] + 180, degrees));
  149.         sp[5] += (2.05 * floatsin(-sp[2]-90, degrees));
  150.         sp[6] += (2.05 * floatcos(-sp[2]-90, degrees));
  151.        
  152.         sp[3] += (5.0 * floatsin(-(sp[2] + 180), degrees));
  153.         sp[4] += (5.0 * floatcos(-(sp[2] + 180), degrees));
  154.         sp[3] += (2.05 * floatsin(-sp[2]+90, degrees));
  155.         sp[4] += (2.05 * floatcos(-sp[2]+90, degrees));
  156.        
  157.         sp[7] += (5.0 * floatsin(-(sp[2]), degrees));
  158.         sp[8] += (5.0 * floatcos(-(sp[2]), degrees));
  159.         sp[7] += (2.05 * floatsin(-sp[2]+90, degrees));
  160.         sp[8] += (2.05 * floatcos(-sp[2]+90, degrees));
  161.        
  162.         g = 0;
  163.         for( ; g < MAX_VEHICLES; g ++ ) {
  164.             if( !GetVehicleModel(g) ) continue;
  165.             if( 536 > GetVehicleModel(g) < 539 ) continue;
  166.             // ----------------------------------------------------------
  167.  
  168.             if( IsVehicleInRangeOfPoint(g, 2.5, sp[0], sp[1], equipment_data[v][ed_pos][2]) ) {
  169.                 if( v == 0 ) {
  170.                     if( equipment_data[v+1][ed_state][0] ) {
  171.                         equipment_data[v+1][ed_state][0] = false;
  172.                         equipment_data[v][ed_state][0] = false;
  173.                     }
  174.                 }
  175.                 if( v-1 >= 0 ) {
  176.                     if( equipment_data[v-1][ed_state][0] ) {
  177.                         equipment_data[v-1][ed_state][0] = false;
  178.                     }
  179.                 }
  180.                 if( v+1 <= ret ) {
  181.                     if( equipment_data[v+1][ed_state][0] ) {
  182.                         equipment_data[v+1][ed_state][0] = false;
  183.                     }
  184.                 }
  185.                
  186.                 equipment_data[v][ed_state][0] = true;
  187.  
  188.                 break;
  189.             }
  190.             else if( IsVehicleInRangeOfPoint(g, 2.5, sp[5], sp[6], equipment_data[v][ed_pos][2]) ) {
  191.                 if( equipment_data[v][ed_state][0] ) {
  192.                     equipment_data[v][ed_state][0] = false;
  193.                     if( v != 0 ) {
  194.                         equipment_data[v-1][ed_state][0] = true;
  195.                     }
  196.                     else {
  197.                         if( rails_recursive ) {
  198.                             equipment_data[ret][ed_state][0] = true;
  199.                         }
  200.                     }
  201.                 }
  202.             }
  203.             else if( IsVehicleInRangeOfPoint(g, 2.5, sp[3], sp[4], equipment_data[v][ed_pos][2]) ) {
  204.                 if( v == 0 ) {
  205.                     if( equipment_data[v+1][ed_state][1] ) {
  206.                         equipment_data[v+1][ed_state][1] = false;
  207.                         equipment_data[v][ed_state][1] = false;
  208.                     }
  209.                 }
  210.                 if( v-1 >= 0 ) {
  211.                     if( equipment_data[v-1][ed_state][1] ) {
  212.                         equipment_data[v-1][ed_state][1] = false;
  213.                     }
  214.                 }
  215.                 if( v+1 <= ret ) {
  216.                     if( equipment_data[v+1][ed_state][1] ) {
  217.                         equipment_data[v+1][ed_state][1] = false;
  218.                     }
  219.                 }
  220.  
  221.                 equipment_data[v][ed_state][1] = true;
  222.  
  223.                 break;
  224.             }
  225.             else if( IsVehicleInRangeOfPoint(g, 2.5, sp[7], sp[8], equipment_data[v][ed_pos][2]) ) {
  226.                 if( equipment_data[v][ed_state][1] ) {
  227.                     equipment_data[v][ed_state][1] = false;
  228.                     if( v <= ret ) {
  229.                         equipment_data[v+1][ed_state][1] = true;
  230.                      }
  231.                 }
  232.             }
  233.         }
  234.  
  235.         // -----------
  236.         if( !rails_recursive ) {
  237.             if( (v + 1) <= ret+1 ) {
  238.                 if( equipment_data[v][ed_state][0] == false && equipment_data[v + 1][ed_state][0] == false && equipment_data[v][o_ed_state][0] != 0 ) {
  239.                     format( sign[0], 64, "{ffffff}-------------\n{cfffc6}CLEAR\n{ffffff}-------------" );
  240.                     SetObjectMaterialText( equipment_data[v][ed_objects][0], sign[0], 0, OBJECT_MATERIAL_SIZE_512x256, "Arial", 100, 1, 0xffffffFF, 416788, 1 );
  241.                     equipment_data[v][o_ed_state][0] = 0;
  242.                     RefreshLights( v, 0, equipment_data[v][o_ed_state][0] );
  243.                 }
  244.             }
  245.         }
  246.         else {
  247.             if( v == ret ) {
  248.                 if( equipment_data[v][ed_state][0] == false && equipment_data[0][ed_state][0] == false && equipment_data[v][o_ed_state][0] != 0 ) {
  249.                     format( sign[0], 64, "{ffffff}-------------\n{cfffc6}CLEAR\n{ffffff}-------------" );
  250.                     SetObjectMaterialText( equipment_data[v][ed_objects][0], sign[0], 0, OBJECT_MATERIAL_SIZE_512x256, "Arial", 100, 1, 0xffffffFF, 416788, 1 );
  251.                     equipment_data[v][o_ed_state][0] = 0;
  252.                     RefreshLights( v, 0, equipment_data[v][o_ed_state][0] );
  253.                 }
  254.             }
  255.             else if( (v + 1) <= ret+1 ) {
  256.                 if( equipment_data[v][ed_state][0] == false && equipment_data[v + 1][ed_state][0] == false && equipment_data[v][o_ed_state][0] != 0 ) {
  257.                     format( sign[0], 64, "{ffffff}-------------\n{cfffc6}CLEAR\n{ffffff}-------------" );
  258.                     SetObjectMaterialText( equipment_data[v][ed_objects][0], sign[0], 0, OBJECT_MATERIAL_SIZE_512x256, "Arial", 100, 1, 0xffffffFF, 416788, 1 );
  259.                     equipment_data[v][o_ed_state][0] = 0;
  260.                     RefreshLights( v, 0, equipment_data[v][o_ed_state][0] );
  261.                 }
  262.             }
  263.         }
  264.        
  265.         if( (v + 1) <= ret ) {
  266.             if( equipment_data[v + 1][ed_state][0] == true && equipment_data[v][o_ed_state][0] != 1 ) {
  267.                 if( v == 0 && equipment_data[ret][o_ed_state][0] != 0 ) {
  268.                     if( rails_recursive ) {
  269.                         format( sign[0], 64, "{ffffff}-------------\n{cfffc6}CLEAR\n{ffffff}-------------" );
  270.                         SetObjectMaterialText( equipment_data[ret][ed_objects][0], sign[0], 0, OBJECT_MATERIAL_SIZE_512x256, "Arial", 100, 1, 0xffffffFF, 416788, 1 );
  271.                         equipment_data[ret][o_ed_state][0] = 0;
  272.                         RefreshLights( ret, 0, equipment_data[ret][o_ed_state][0] );
  273.                     }
  274.                 }
  275.                 // -----
  276.                 format( sign[0], 64, "{ffffff}-------------\n{ffea00}SLOW!\n{ffffff}-------------" );
  277.                 SetObjectMaterialText( equipment_data[v][ed_objects][0], sign[0], 0, OBJECT_MATERIAL_SIZE_512x256, "Arial", 100, 1, 0xffffffFF, 416788, 1 );
  278.                 equipment_data[v][o_ed_state][0] = 1;
  279.                 RefreshLights( v, 0, equipment_data[v][o_ed_state][0] );
  280.             }
  281.         }
  282.         if( equipment_data[v][ed_state][0] == true && equipment_data[v][o_ed_state][0] != 2 ) {
  283.             if( rails_recursive ) {
  284.                 if( v == 0 && equipment_data[ret][o_ed_state][0] != 1 ) {
  285.                     equipment_data[ret][ed_state][0] = false;
  286.                     format( sign[0], 64, "{ffffff}-------------\n{ffea00}SLOW!\n{ffffff}-------------" );
  287.                     SetObjectMaterialText( equipment_data[ret][ed_objects][0], sign[0], 0, OBJECT_MATERIAL_SIZE_512x256, "Arial", 100, 1, 0xffffffFF, 416788, 1 );
  288.                     equipment_data[ret][o_ed_state][0] = 1;
  289.                     RefreshLights( ret, 0, equipment_data[ret][o_ed_state][0] );
  290.                 }
  291.                 else {
  292.                     if( v == ret && equipment_data[v][o_ed_state][0] != 2 ) {
  293.                         format( sign[0], 64, "{ffffff}-------------\n{ff8181}STOP!\n{ffffff}-------------" );
  294.                         SetObjectMaterialText( equipment_data[v][ed_objects][0], sign[0], 0, OBJECT_MATERIAL_SIZE_512x256, "Arial", 100, 1, 0xffffffFF, 416788, 1 );
  295.                         equipment_data[v][o_ed_state][0] = 2;
  296.                         RefreshLights( v, 0, equipment_data[v][o_ed_state][0] );
  297.                     }
  298.                     else {
  299.                         format( sign[0], 64, "{ffffff}-------------\n{ff8181}STOP!\n{ffffff}-------------" );
  300.                         SetObjectMaterialText( equipment_data[v][ed_objects][0], sign[0], 0, OBJECT_MATERIAL_SIZE_512x256, "Arial", 100, 1, 0xffffffFF, 416788, 1 );
  301.                         equipment_data[v][o_ed_state][0] = 2;
  302.                         RefreshLights( v, 0, equipment_data[v][o_ed_state][0] );
  303.                     }
  304.                 }
  305.             }
  306.             // -----
  307.             else {
  308.                 format( sign[0], 64, "{ffffff}-------------\n{ff8181}STOP!\n{ffffff}-------------" );
  309.                 SetObjectMaterialText( equipment_data[v][ed_objects][0], sign[0], 0, OBJECT_MATERIAL_SIZE_512x256, "Arial", 100, 1, 0xffffffFF, 416788, 1 );
  310.                 equipment_data[v][o_ed_state][0] = 2;
  311.                 RefreshLights( v, 0, equipment_data[v][o_ed_state][0] );
  312.             }
  313.         }
  314.         // --------------------------------------------------------------------------------
  315.         if( v == 0 ) {
  316.             if( equipment_data[v][ed_state][1] == false  && equipment_data[v][o_ed_state][1] != 0 ) {
  317.                 format( sign[1], 64, "{ffffff}-------------\n{cfffc6}CLEAR\n{ffffff}-------------" );
  318.                 SetObjectMaterialText( equipment_data[v][ed_objects][1], sign[1], 0, OBJECT_MATERIAL_SIZE_512x256, "Arial", 100, 1, 0xffffffFF, 416788, 1 );
  319.                 equipment_data[v][o_ed_state][1] = 0;
  320.                 RefreshLights( v, 1, equipment_data[v][o_ed_state][1] );
  321.             }
  322.         }
  323.         if( (v - 1) >= 0 ) {
  324.             if( equipment_data[v][ed_state][1] == false  && equipment_data[v - 1][ed_state][1] == false && equipment_data[v][o_ed_state][1] != 0 ) {
  325.                 format( sign[1], 64, "{ffffff}-------------\n{cfffc6}CLEAR\n{ffffff}-------------" );
  326.                 SetObjectMaterialText( equipment_data[v][ed_objects][1], sign[1], 0, OBJECT_MATERIAL_SIZE_512x256, "Arial", 100, 1, 0xffffffFF, 416788, 1 );
  327.                 equipment_data[v][o_ed_state][1] = 0;
  328.                 RefreshLights( v, 1, equipment_data[v][o_ed_state][1] );
  329.             }
  330.         }
  331.         if( (v - 1) >= 0 ) {
  332.             if( equipment_data[v - 1][ed_state][1] == true && equipment_data[v][o_ed_state][1] != 1 ) {
  333.                 format( sign[1], 64, "{ffffff}-------------\n{ffea00}SLOW!\n{ffffff}-------------" );
  334.                 SetObjectMaterialText( equipment_data[v][ed_objects][1], sign[1], 0, OBJECT_MATERIAL_SIZE_512x256, "Arial", 100, 1, 0xffffffFF, 416788, 1 );
  335.                 equipment_data[v][o_ed_state][1] = 1;
  336.                 RefreshLights( v, 1, equipment_data[v][o_ed_state][1] );
  337.             }
  338.         }
  339.         if( equipment_data[v][ed_state][1] == true && equipment_data[v][o_ed_state][1] != 2 ) {
  340.             format( sign[1], 64, "{ffffff}-------------\n{ff8181}STOP!\n{ffffff}-------------" );
  341.             SetObjectMaterialText( equipment_data[v][ed_objects][1], sign[1], 0, OBJECT_MATERIAL_SIZE_512x256, "Arial", 100, 1, 0xffffffFF, 416788, 1 );
  342.             equipment_data[v][o_ed_state][1] = 2;
  343.             RefreshLights( v, 1, equipment_data[v][o_ed_state][1] );
  344.         }
  345.     }
  346.    
  347.     return 1;
  348. }
  349.  
  350. public OnPlayerCommandText( playerid, cmdtext[] ) {
  351.     if( !strcmp(cmdtext, pd_command) ) {
  352.         if( on_admin ) { if( !IsPlayerAdmin(playerid) ) { return SendClientMessage( playerid, 0x7e0000AA, "ERROR: {acacac}You must have admin privileges to use this command." ); } }
  353.         if( !IsPlayerAtRail(playerid) ) return SendClientMessage( playerid, 0x7e0000AA, "ERROR: {acacac}You must be close to the railway." );
  354.        
  355.         new eq_id = CreateSafetyEquipmentOnPlayer( playerid );
  356.         if( eq_id == -1 ) return SendClientMessage( playerid, 0x7e0000AA, "ERROR: {acacac}Unknown error occured, maybe limit reached?" );
  357.  
  358.         format( gstring, sizeof(gstring), "SUCCESS: {acacac}Equipment no. %d placed successfully.", eq_id );
  359.         SendClientMessage( playerid, 0x298700AA, gstring );
  360.  
  361.         return 1;
  362.     }
  363.     else if( !strcmp(cmdtext, "/manage") ) {
  364.         if( on_admin ) { if( !IsPlayerAdmin(playerid) ) { return SendClientMessage( playerid, 0x7e0000AA, "ERROR: {acacac}You must have admin privileges to use this command." ); } }
  365.    
  366.         ShowManageWindow( playerid );
  367.        
  368.         return 1;
  369.     }
  370.     else if( !strcmp(cmdtext, "/back") ) {
  371.         if( on_admin ) { if( !IsPlayerAdmin(playerid) ) { return SendClientMessage( playerid, 0x7e0000AA, "ERROR: {acacac}You must have admin privileges to use this command." ); } }
  372.         if( !CountEquipment() ) return SendClientMessage( playerid, 0x7e0000AA, "ERROR: {acacac}Place some equipment first." );
  373.  
  374.         g = 0;
  375.         for( ; g < 22; g ++ ) {
  376.             DestroyObject( equipment_data[CountEquipment()-1][ed_objects][g] );
  377.         }
  378.  
  379.         equipment_data[CountEquipment()-1][ed_spawned] = false;
  380.  
  381.         format( gstring, sizeof(gstring), "SUCCESS: {acacac}Equipment no. %d undoed successfully.", CountEquipment() );
  382.         SendClientMessage( playerid, 0x298700AA, gstring );
  383.  
  384.         return 1;
  385.     }
  386.     else if( !strcmp(cmdtext, "/id") ) {
  387.         if( on_admin ) { if( !IsPlayerAdmin(playerid) ) { return SendClientMessage( playerid, 0x7e0000AA, "ERROR: {acacac}You must have admin privileges to use this command." ); } }
  388.        
  389.         new e_id = GetClosestEQID( playerid );
  390.        
  391.         if( e_id == -1 ) return SendClientMessage( playerid, 0x7e0000AA, "ERROR: {acacac}There is no equipment in your area." );
  392.  
  393.         format( gstring, sizeof(gstring), "Closest equipment's ID: {acacac}%d", e_id );
  394.         SendClientMessage( playerid, 0xd8e75dAA, gstring );
  395.        
  396.         return 1;
  397.     }
  398.     else if( !strcmp(cmdtext, "/help") ) {
  399.         format( gstring, sizeof(gstring), "Avaible commands: {acacac}/manage, %s, /back, /id, /help.", pd_command );
  400.         SendClientMessage( playerid, 0xd8e75dAA, gstring );
  401.  
  402.         return 1;
  403.     }
  404.    
  405.     return 1;
  406. }
  407.  
  408. public OnDialogResponse( playerid, dialogid, response, listitem, inputtext[] ) {
  409.     switch( dialogid ) {
  410.         case DIALOG_MANAGE: {
  411.             if( !response ) return 1;
  412.             // ---
  413.            
  414.             switch( listitem ) {
  415.                 case 2: {
  416.                     if( CountEquipment() > 2 ) { rails_recursive = !rails_recursive; }
  417.                    
  418.                     if( rails_recursive ) {
  419.                         v = 0;
  420.                         for( ; v < MAX_RAILCHECK; v ++ ) {
  421.                             if( !equipment_data[v][ed_spawned] ) continue;
  422.  
  423.                             equipment_data[v][ed_state][0] = false;
  424.                             equipment_data[v][ed_state][1] = false;
  425.                         }
  426.                     }
  427.                    
  428.                     ShowManageWindow( playerid );
  429.                 }
  430.                 case 3: {
  431.                     ShowManageWindow( playerid, 1 );
  432.                 }
  433.                 case 4: {
  434.                     on_admin = !on_admin;
  435.                     ShowManageWindow( playerid );
  436.                 }
  437.                 case 8: {
  438.                     if( !CountEquipment() ) return SendClientMessage( playerid, 0x7e0000AA, "ERROR: {acacac}Place some equipment first." ), ShowManageWindow( playerid );
  439.                    
  440.                     v = 0;
  441.                     for( ; v < MAX_RAILCHECK; v ++ ) {
  442.                         if( !equipment_data[v][ed_spawned] ) continue;
  443.  
  444.                         g = 0;
  445.                         for( ; g < 22; g ++ ) {
  446.                             DestroyObject( equipment_data[v][ed_objects][g] );
  447.                         }
  448.  
  449.                         equipment_data[v][ed_spawned] = false;
  450.                     }
  451.                    
  452.                     fremove( EQ_FILE_NAME );
  453.                    
  454.                     SendClientMessage( playerid, 0x298700AA, "SUCCESS: {acacac}All equipment deleted."  );
  455.                     ShowManageWindow( playerid );
  456.                 }
  457.                 case 9: {
  458.                     if( CountEquipment() > 0 ) { SaveEquipments(); SendClientMessage( playerid, 0x298700AA, "SUCCESS: {acacac}All equipment saved."  ); }
  459.                    
  460.                     ShowManageWindow( playerid );
  461.                 }
  462.                 case 10: {
  463.                     if( CountEquipment() > 2 ) ShowManageWindow( playerid, 2 );
  464.                     else ShowManageWindow( playerid );
  465.                 }
  466.                 default: ShowManageWindow( playerid );
  467.             }
  468.         }
  469.         case DIALOG_MANAGE + 1: {
  470.             if( !response ) return ShowManageWindow( playerid );
  471.             // ---
  472.            
  473.             if( strlen(inputtext) < 2 || inputtext[0] != '/' ) return ShowManageWindow( playerid, 1 );
  474.            
  475.             format( pd_command, sizeof(pd_command), "%s", inputtext );
  476.             CreateRailChecks( pd_command );
  477.             ShowManageWindow( playerid );
  478.         }
  479.         case DIALOG_MANAGE + 2: {
  480.             if( !response ) return ShowManageWindow( playerid );
  481.             // ---
  482.            
  483.             if( !IsNumeric(inputtext) ) return ShowManageWindow( playerid, 2 );
  484.             if( strval(inputtext) < 0 || strval(inputtext) >= CountEquipment() ) return ShowManageWindow( playerid, 2 );
  485.            
  486.             v = strval(inputtext);
  487.             for( ; v < MAX_RAILCHECK; v ++ ) {
  488.                 if( !equipment_data[v][ed_spawned] ) continue;
  489.  
  490.                 g = 0;
  491.                 for( ; g < 22; g ++ ) {
  492.                     DestroyObject( equipment_data[v][ed_objects][g] );
  493.                 }
  494.  
  495.                 equipment_data[v][ed_spawned] = false;
  496.             }
  497.            
  498.             SendClientMessage( playerid, 0x298700AA, "SUCCESS: {acacac}Railway interrupted at position."  );
  499.             ShowManageWindow( playerid );
  500.         }
  501.     }
  502.    
  503.     return 1;
  504. }
  505.  
  506. public OnPlayerSpawn( playerid ) {
  507.     SetPlayerPos( playerid, 1734.9142, -1949.0009, 14.1172 );
  508.     SetPlayerFacingAngle( playerid, 180 );
  509.     SetCameraBehindPlayer( playerid );
  510.  
  511.     return 1;
  512. }
  513.  
  514. CreateRailChecks( newcommand[] ) {
  515.     rail_file = fopen( RA_FILE_NAME, io_readwrite );
  516.    
  517.     format( pd_command, 32, newcommand );
  518.     on_admin = 1;
  519.    
  520.     format( gstring, 40, "%i %s\r\n", on_admin, pd_command );
  521.     fwrite( rail_file, gstring );
  522.    
  523.     v = 0;
  524.     for( ; v < MAX_RAILCHECK; v++ ) {
  525.         ConvertPosFromPicture( pre_rails[v][0], pre_rails[v][1], rails[v][0], rails[v][1], rails[v][2] );
  526.        
  527.         format( gstring, 37, "%.4f %.4f %.4f\r\n", rails[v][0], rails[v][1], rails[v][2] );
  528.         fwrite( rail_file, gstring );
  529.     }
  530.    
  531.     fclose( rail_file );
  532.    
  533.     printf( " %d railcheck successfully created and loaded. ", v );
  534. }
  535.  
  536. LoadRailChecks() {
  537.     rail_file = fopen( RA_FILE_NAME, io_readwrite );
  538.    
  539.     v = 0;
  540.     if( rail_file ) {
  541.         while( fread(rail_file, gstring) ) {
  542.             if( v > 0 ) {
  543.                 sscanf( gstring, "fff", rails[v - 1][0], rails[v - 1][1], rails[v - 1][2] );
  544.             }
  545.             else {
  546.                 sscanf( gstring, "is[32]", on_admin, pd_command );
  547.                 strdel( pd_command, strlen(pd_command) - 2, strlen(pd_command) );
  548.             }
  549.            
  550.             v ++;
  551.         }
  552.     }
  553.    
  554.     fclose( rail_file );
  555.  
  556.     printf( " %d railcheck successfully loaded. ", v );
  557. }
  558.  
  559. stock ShowManageWindow( playerid, mstate = 0 ) {
  560.     switch( mstate ) {
  561.         case 0: {
  562.             format( gstring, sizeof(gstring), "{573d25}Informations{ffffff}\t \n \t \
  563.             \n\
  564.             Rail Connection\t{b0b0b0}%s{ffffff}\n\
  565.             Equipment Command\t{b0b0b0}%s{ffffff}\n\
  566.             Only Admin\t{b0b0b0}%s{ffffff}\n \t \
  567.             \n\
  568.             {573d25}Data Management{ffffff}\t \n \t \
  569.             \n\
  570.             Delete Equipments\t \n\
  571.             Save Equipments\t \n\
  572.             {640505}- Rail Interruption -\t \n", (rails_recursive ? ("Enabled") : ("Disabled")), pd_command, (on_admin ? ("Yes") : ("No")) );
  573.            
  574.             ShowPlayerDialog( playerid, DIALOG_MANAGE, 4, "Railway Safety SYS", gstring, "Okay", "Back" );
  575.         }
  576.         case 1: {
  577.             format( gstring, sizeof(gstring), "Current command to put down equipment: %s\n \nPlease write down a new one or press Back button.\nExample: /pd-eq" );
  578.            
  579.             ShowPlayerDialog( playerid, DIALOG_MANAGE + 1, DIALOG_STYLE_INPUT, "Railway Safety SYS - Command changing", gstring, "Okay", "Back" );
  580.         }
  581.         case 2: {
  582.             format( gstring, sizeof(gstring), "Write the rail's ID. (Where you want to interrupt the railway.)" );
  583.  
  584.             ShowPlayerDialog( playerid, DIALOG_MANAGE + 2, DIALOG_STYLE_INPUT, "Railway Safety SYS - Interruption", gstring, "Okay", "Back" );
  585.         }
  586.     }
  587.    
  588.     return 1;
  589. }
  590.  
  591. stock CountEquipment() {
  592.     new temp, t;
  593.  
  594.     t = 0;
  595.     for( ; t < MAX_RAILCHECK; t ++ ) {
  596.         if( !equipment_data[t][ed_spawned] ) continue;
  597.  
  598.         temp ++;
  599.     }
  600.  
  601.     return temp;
  602. }
  603.  
  604. stock ConvertPosFromPicture( desk_x, desk_y, &Float: x, &Float: y, &Float: z ) {
  605.     x = floatmul( (desk_x - 900), floatdiv(3000, 900) );
  606.     y = floatmul( floatmul((desk_y - 723), floatdiv(3000, 723)), -1 );
  607.  
  608.     MapAndreas_FindZ_For2DCoord( x, y, z );
  609.  
  610.     return 1;
  611. }
  612.  
  613. stock IsPlayerAtRail( playerid ) {
  614.     new t;
  615.    
  616.     t = 0;
  617.     for( ; t < MAX_RAILCHECK; t++ ) {
  618.         if( IsPlayerInRangeOfPoint(playerid, 100.0, rails[t][0], rails[t][1], rails[t][2]) ) {
  619.             return true;
  620.         }
  621.     }
  622.  
  623.     return false;
  624. }
  625.  
  626. stock GetXYByPos( Float: gx, Float:gy, Float: ga, direction, &Float:x, &Float:y, Float:distance ) {
  627.     new Float:a = ga;
  628.    
  629.     switch( direction ) {
  630.         case 1: {
  631.             a += 180.0;
  632.         }
  633.         case 2: {
  634.             a += 90.0;
  635.         }
  636.         case 3: {
  637.             a -= 90.0;
  638.         }
  639.     }
  640.  
  641.     x = gx;
  642.     y = gy;
  643.  
  644.     x += (distance * floatsin(-a, degrees));
  645.     y += (distance * floatcos(-a, degrees));
  646.  
  647.     return 1;
  648. }
  649.  
  650. stock GetXYByPlayer( playerid, direction, &Float:x, &Float:y, Float:distance ) {
  651.     new Float:a;
  652.  
  653.     GetPlayerPos(playerid, x, y, a);
  654.     GetPlayerFacingAngle(playerid, a);
  655.  
  656.     if (GetPlayerVehicleID(playerid))
  657.     {
  658.         GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
  659.     }
  660.     // ------------
  661.  
  662.     switch( direction ) {
  663.         case 1: {
  664.             a += 180.0;
  665.         }
  666.         case 2: {
  667.             a += 90.0;
  668.         }
  669.         case 3: {
  670.             a -= 90.0;
  671.         }
  672.     }
  673.  
  674.     x += (distance * floatsin(-a, degrees));
  675.     y += (distance * floatcos(-a, degrees));
  676.  
  677.     return 1;
  678. }
  679.  
  680. stock RefreshLights( equipment, light, l_state ) {
  681.     new Float: op[3];
  682.    
  683.     switch( light ) {
  684.         case 0: {
  685.             GetObjectPos( equipment_data[equipment][ed_objects][3], op[0], op[1], op[2] );
  686.             DestroyObject( equipment_data[equipment][ed_objects][3] );
  687.             equipment_data[equipment][ed_objects][3] = CreateObject(l_models[l_state], op[0], op[1], op[2],   0.00000, 0.00000, 0.00000);
  688.             GetObjectPos( equipment_data[equipment][ed_objects][4], op[0], op[1], op[2] );
  689.             DestroyObject( equipment_data[equipment][ed_objects][4] );
  690.             equipment_data[equipment][ed_objects][4] = CreateObject(l_models[l_state], op[0], op[1], op[2],   0.00000, 0.00000, 0.00000);
  691.             GetObjectPos( equipment_data[equipment][ed_objects][5], op[0], op[1], op[2] );
  692.             DestroyObject( equipment_data[equipment][ed_objects][5] );
  693.             equipment_data[equipment][ed_objects][5] = CreateObject(l_models[l_state], op[0], op[1], op[2],   0.00000, 0.00000, 0.00000);
  694.         }
  695.         case 1: {
  696.             GetObjectPos( equipment_data[equipment][ed_objects][13], op[0], op[1], op[2] );
  697.             DestroyObject( equipment_data[equipment][ed_objects][13] );
  698.             equipment_data[equipment][ed_objects][13] = CreateObject(l_models[l_state], op[0], op[1], op[2],   0.00000, 0.00000, 0.00000);
  699.             GetObjectPos( equipment_data[equipment][ed_objects][14], op[0], op[1], op[2] );
  700.             DestroyObject( equipment_data[equipment][ed_objects][14] );
  701.             equipment_data[equipment][ed_objects][14] = CreateObject(l_models[l_state], op[0], op[1], op[2],   0.00000, 0.00000, 0.00000);
  702.             GetObjectPos( equipment_data[equipment][ed_objects][15], op[0], op[1], op[2] );
  703.             DestroyObject( equipment_data[equipment][ed_objects][15] );
  704.             equipment_data[equipment][ed_objects][15] = CreateObject(l_models[l_state], op[0], op[1], op[2],   0.00000, 0.00000, 0.00000);
  705.         }
  706.     }
  707.  
  708.     return 1;
  709. }
  710.  
  711. stock CreateSafetyEquipmentOnPlayer( playerid ) {
  712.     new Float: c_fp[2],
  713.         e_id = -1;
  714.  
  715.     v = 0;
  716.     for( ; v < MAX_RAILCHECK; v ++ ) {
  717.         if( !equipment_data[v][ed_spawned] ) { e_id = v; break; }
  718.     }
  719.    
  720.     // --------
  721.    
  722.     GetPlayerPos( playerid, equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][2] );
  723.     GetPlayerFacingAngle( playerid, equipment_data[e_id][ed_pos][3] );
  724.    
  725.     if( IsPlayerInAnyVehicle(playerid) ) GetVehicleZAngle( GetPlayerVehicleID(playerid), equipment_data[e_id][ed_pos][3] );
  726.     // --------
  727.  
  728.     rails_recursive = 0;
  729.  
  730.     equipment_data[e_id][ed_spawned] = true;
  731.     equipment_data[e_id][o_ed_state][0] = -1;
  732.     equipment_data[e_id][o_ed_state][1] = -1;
  733.    
  734.     GetXYByPlayer( playerid, 2, c_fp[0], c_fp[1], 4.5 );
  735.     equipment_data[e_id][ed_objects][0] = CreateObject(7246, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 2.5,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]);
  736.     GetXYByPlayer( playerid, 3, c_fp[0], c_fp[1], 4.5 );
  737.     equipment_data[e_id][ed_objects][1] = CreateObject(7246, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 2.5,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3] + 180.00000);
  738.  
  739.     GetXYByPlayer( playerid, 2, c_fp[0], c_fp[1], 5.55 );
  740.     c_fp[0] += (0.3 * floatsin(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  741.     c_fp[1] += (0.3 * floatcos(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  742.     equipment_data[e_id][ed_objects][2] = CreateObject(940, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5.35,   0.00000, 90.00000, equipment_data[e_id][ed_pos][3] + 90.00000);
  743.     GetXYByPlayer( playerid, 2, c_fp[0], c_fp[1], 5.55 );
  744.     c_fp[0] += (0.1 * floatsin(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  745.     c_fp[1] += (0.1 * floatcos(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  746.     equipment_data[e_id][ed_objects][3] = CreateObject(19123, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5.85,   0.00000, 0.00000, 0.00000);
  747.     GetXYByPlayer( playerid, 2, c_fp[0], c_fp[1], 5.55 );
  748.     c_fp[0] += (0.1 * floatsin(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  749.     c_fp[1] += (0.1 * floatcos(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  750.     equipment_data[e_id][ed_objects][4] = CreateObject(19123, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5.05,   0.00000, 0.00000, 0.00000);
  751.     GetXYByPlayer( playerid, 2, c_fp[0], c_fp[1], 5.55 );
  752.     c_fp[0] += (0.1 * floatsin(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  753.     c_fp[1] += (0.1 * floatcos(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  754.     equipment_data[e_id][ed_objects][5] = CreateObject(19123, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 4.25,   0.00000, 0.00000, 0.00000);
  755.     GetXYByPlayer( playerid, 2, c_fp[0], c_fp[1], 5.5601 );
  756.     c_fp[0] -= (0.242 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  757.     c_fp[1] -= (0.242 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  758.     equipment_data[e_id][ed_objects][6] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 6,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]-90.00000);
  759.     GetXYByPlayer( playerid, 2, c_fp[0], c_fp[1], 5.56 );
  760.     c_fp[0] -= (0.24 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  761.     c_fp[1] -= (0.24 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  762.     equipment_data[e_id][ed_objects][7] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]-90.00000);
  763.     GetXYByPlayer( playerid, 2, c_fp[0], c_fp[1], 5.5602 );
  764.     c_fp[0] -= (0.241 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  765.     c_fp[1] -= (0.241 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  766.     equipment_data[e_id][ed_objects][8] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 4,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]-90.00000);
  767.     GetXYByPlayer( playerid, 2, c_fp[0], c_fp[1], 5.5502 );
  768.     c_fp[0] += (0.041 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  769.     c_fp[1] += (0.041 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  770.     equipment_data[e_id][ed_objects][9] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 6,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]+90.00000);
  771.     GetXYByPlayer( playerid, 2, c_fp[0], c_fp[1], 5.55 );
  772.     c_fp[0] += (0.04 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  773.     c_fp[1] += (0.04 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  774.     equipment_data[e_id][ed_objects][10] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]+90.00000);
  775.     GetXYByPlayer( playerid, 2, c_fp[0], c_fp[1], 5.5501 );
  776.     c_fp[0] += (0.042 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  777.     c_fp[1] += (0.042 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  778.     equipment_data[e_id][ed_objects][11] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 4,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]+90.00000);
  779.  
  780.     // ---
  781.    
  782.     GetXYByPlayer( playerid, 3, c_fp[0], c_fp[1], 5.55 );
  783.     c_fp[0] -= (0.3 * floatsin(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  784.     c_fp[1] -= (0.3 * floatcos(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  785.     equipment_data[e_id][ed_objects][12] = CreateObject(940, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5.35,   0.00000, 90.00000, equipment_data[e_id][ed_pos][3] + 90.00000 + 180);
  786.     GetXYByPlayer( playerid, 3, c_fp[0], c_fp[1], 5.55 );
  787.     c_fp[0] -= (0.1 * floatsin(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  788.     c_fp[1] -= (0.1 * floatcos(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  789.     equipment_data[e_id][ed_objects][13] = CreateObject(19123, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5.85,   0.00000, 0.00000, 0.00000+ 180);
  790.     GetXYByPlayer( playerid, 3, c_fp[0], c_fp[1], 5.55 );
  791.     c_fp[0] -= (0.1 * floatsin(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  792.     c_fp[1] -= (0.1 * floatcos(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  793.     equipment_data[e_id][ed_objects][14] = CreateObject(19123, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5.05,   0.00000, 0.00000, 0.00000+ 180);
  794.     GetXYByPlayer( playerid, 3, c_fp[0], c_fp[1], 5.55 );
  795.     c_fp[0] -= (0.1 * floatsin(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  796.     c_fp[1] -= (0.1 * floatcos(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  797.     equipment_data[e_id][ed_objects][15] = CreateObject(19123, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 4.25,   0.00000, 0.00000, 0.00000+ 180);
  798.     GetXYByPlayer( playerid, 3, c_fp[0], c_fp[1], 5.5601 );
  799.     c_fp[0] += (0.242 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  800.     c_fp[1] += (0.242 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  801.     equipment_data[e_id][ed_objects][16] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 6,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]-90.00000+ 180);
  802.     GetXYByPlayer( playerid, 3, c_fp[0], c_fp[1], 5.56 );
  803.     c_fp[0] += (0.24 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  804.     c_fp[1] += (0.24 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  805.     equipment_data[e_id][ed_objects][17] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]-90.00000+ 180);
  806.     GetXYByPlayer( playerid, 3, c_fp[0], c_fp[1], 5.5602 );
  807.     c_fp[0] += (0.241 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  808.     c_fp[1] += (0.241 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  809.     equipment_data[e_id][ed_objects][18] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 4,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]-90.00000+ 180);
  810.     GetXYByPlayer( playerid, 3, c_fp[0], c_fp[1], 5.5502 );
  811.     c_fp[0] -= (0.041 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  812.     c_fp[1] -= (0.041 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  813.     equipment_data[e_id][ed_objects][19] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 6,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]+90.00000+ 180);
  814.     GetXYByPlayer( playerid, 3, c_fp[0], c_fp[1], 5.55 );
  815.     c_fp[0] -= (0.04 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  816.     c_fp[1] -= (0.04 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  817.     equipment_data[e_id][ed_objects][20] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]+90.00000+ 180);
  818.     GetXYByPlayer( playerid, 3, c_fp[0], c_fp[1], 5.5501 );
  819.     c_fp[0] -= (0.042 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  820.     c_fp[1] -= (0.042 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  821.     equipment_data[e_id][ed_objects][21] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 4,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]+90.00000+ 180);
  822.  
  823.     return e_id;
  824. }
  825.  
  826. stock SaveEquipments() {
  827.     rail_file = fopen( EQ_FILE_NAME, io_readwrite );
  828.    
  829.     format( gstring, 20, "%i\r\n", rails_recursive );
  830.     fwrite( rail_file, gstring );
  831.    
  832.     v = 0;
  833.     for( ; v < MAX_RAILCHECK; v ++ ) {
  834.         if( !equipment_data[v][ed_spawned] ) continue;
  835.        
  836.         format( gstring, 64, "%.4f %.4f %.4f %.4f\r\n", equipment_data[v][ed_pos][0], equipment_data[v][ed_pos][1], equipment_data[v][ed_pos][2], equipment_data[v][ed_pos][3] );
  837.         fwrite( rail_file, gstring );
  838.     }
  839.  
  840.     fclose( rail_file );
  841.  
  842.     return 1;
  843. }
  844.  
  845. stock LoadEquipments() {
  846.     new e_id,
  847.         Float: c_fp[2];
  848.    
  849.     rail_file = fopen( EQ_FILE_NAME, io_readwrite );
  850.  
  851.     v = 0;
  852.     if( rail_file ) {
  853.         while( fread(rail_file, gstring) ) {
  854.             if( v > 0 ) {
  855.                 e_id = v-1;
  856.                
  857.                 sscanf( gstring, "ffff", equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][2], equipment_data[e_id][ed_pos][3] );
  858.                 // ------
  859.                
  860.                 equipment_data[e_id][ed_spawned] = true;
  861.                 equipment_data[e_id][o_ed_state][0] = -1;
  862.                 equipment_data[e_id][o_ed_state][1] = -1;
  863.  
  864.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 2, c_fp[0], c_fp[1], 4.5 );
  865.                 equipment_data[e_id][ed_objects][0] = CreateObject(7246, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 2.5,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]);
  866.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 3, c_fp[0], c_fp[1], 4.5 );
  867.                 equipment_data[e_id][ed_objects][1] = CreateObject(7246, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 2.5,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3] + 180.00000);
  868.  
  869.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 2, c_fp[0], c_fp[1], 5.55 );
  870.                 c_fp[0] += (0.3 * floatsin(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  871.                 c_fp[1] += (0.3 * floatcos(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  872.                 equipment_data[e_id][ed_objects][2] = CreateObject(940, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5.35,   0.00000, 90.00000, equipment_data[e_id][ed_pos][3] + 90.00000);
  873.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 2, c_fp[0], c_fp[1], 5.55 );
  874.                 c_fp[0] += (0.1 * floatsin(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  875.                 c_fp[1] += (0.1 * floatcos(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  876.                 equipment_data[e_id][ed_objects][3] = CreateObject(19123, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5.85,   0.00000, 0.00000, 0.00000);
  877.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 2, c_fp[0], c_fp[1], 5.55 );
  878.                 c_fp[0] += (0.1 * floatsin(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  879.                 c_fp[1] += (0.1 * floatcos(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  880.                 equipment_data[e_id][ed_objects][4] = CreateObject(19123, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5.05,   0.00000, 0.00000, 0.00000);
  881.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 2, c_fp[0], c_fp[1], 5.55 );
  882.                 c_fp[0] += (0.1 * floatsin(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  883.                 c_fp[1] += (0.1 * floatcos(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  884.                 equipment_data[e_id][ed_objects][5] = CreateObject(19123, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 4.25,   0.00000, 0.00000, 0.00000);
  885.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 2, c_fp[0], c_fp[1], 5.5601 );
  886.                 c_fp[0] -= (0.242 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  887.                 c_fp[1] -= (0.242 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  888.                 equipment_data[e_id][ed_objects][6] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 6,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]-90.00000);
  889.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 2, c_fp[0], c_fp[1], 5.56 );
  890.                 c_fp[0] -= (0.24 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  891.                 c_fp[1] -= (0.24 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  892.                 equipment_data[e_id][ed_objects][7] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]-90.00000);
  893.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 2, c_fp[0], c_fp[1], 5.5602 );
  894.                 c_fp[0] -= (0.241 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  895.                 c_fp[1] -= (0.241 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  896.                 equipment_data[e_id][ed_objects][8] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 4,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]-90.00000);
  897.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 2, c_fp[0], c_fp[1], 5.5502 );
  898.                 c_fp[0] += (0.041 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  899.                 c_fp[1] += (0.041 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  900.                 equipment_data[e_id][ed_objects][9] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 6,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]+90.00000);
  901.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 2, c_fp[0], c_fp[1], 5.55 );
  902.                 c_fp[0] += (0.04 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  903.                 c_fp[1] += (0.04 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  904.                 equipment_data[e_id][ed_objects][10] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]+90.00000);
  905.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 2, c_fp[0], c_fp[1], 5.5501 );
  906.                 c_fp[0] += (0.042 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  907.                 c_fp[1] += (0.042 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  908.                 equipment_data[e_id][ed_objects][11] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 4,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]+90.00000);
  909.  
  910.                 // ---
  911.  
  912.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 3, c_fp[0], c_fp[1], 5.55 );
  913.                 c_fp[0] -= (0.3 * floatsin(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  914.                 c_fp[1] -= (0.3 * floatcos(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  915.                 equipment_data[e_id][ed_objects][12] = CreateObject(940, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5.35,   0.00000, 90.00000, equipment_data[e_id][ed_pos][3] + 90.00000 + 180);
  916.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 3, c_fp[0], c_fp[1], 5.55 );
  917.                 c_fp[0] -= (0.1 * floatsin(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  918.                 c_fp[1] -= (0.1 * floatcos(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  919.                 equipment_data[e_id][ed_objects][13] = CreateObject(19123, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5.85,   0.00000, 0.00000, 0.00000+ 180);
  920.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 3, c_fp[0], c_fp[1], 5.55 );
  921.                 c_fp[0] -= (0.1 * floatsin(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  922.                 c_fp[1] -= (0.1 * floatcos(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  923.                 equipment_data[e_id][ed_objects][14] = CreateObject(19123, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5.05,   0.00000, 0.00000, 0.00000+ 180);
  924.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 3, c_fp[0], c_fp[1], 5.55 );
  925.                 c_fp[0] -= (0.1 * floatsin(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  926.                 c_fp[1] -= (0.1 * floatcos(-(equipment_data[e_id][ed_pos][3]-180), degrees));
  927.                 equipment_data[e_id][ed_objects][15] = CreateObject(19123, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 4.25,   0.00000, 0.00000, 0.00000+ 180);
  928.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 3, c_fp[0], c_fp[1], 5.5601 );
  929.                 c_fp[0] += (0.242 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  930.                 c_fp[1] += (0.242 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  931.                 equipment_data[e_id][ed_objects][16] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 6,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]-90.00000+ 180);
  932.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 3, c_fp[0], c_fp[1], 5.56 );
  933.                 c_fp[0] += (0.24 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  934.                 c_fp[1] += (0.24 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  935.                 equipment_data[e_id][ed_objects][17] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]-90.00000+ 180);
  936.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 3, c_fp[0], c_fp[1], 5.5602 );
  937.                 c_fp[0] += (0.241 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  938.                 c_fp[1] += (0.241 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  939.                 equipment_data[e_id][ed_objects][18] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 4,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]-90.00000+ 180);
  940.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 3, c_fp[0], c_fp[1], 5.5502 );
  941.                 c_fp[0] -= (0.041 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  942.                 c_fp[1] -= (0.041 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  943.                 equipment_data[e_id][ed_objects][19] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 6,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]+90.00000+ 180);
  944.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 3, c_fp[0], c_fp[1], 5.55 );
  945.                 c_fp[0] -= (0.04 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  946.                 c_fp[1] -= (0.04 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  947.                 equipment_data[e_id][ed_objects][20] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 5,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]+90.00000+ 180);
  948.                 GetXYByPos( equipment_data[e_id][ed_pos][0], equipment_data[e_id][ed_pos][1], equipment_data[e_id][ed_pos][3], 3, c_fp[0], c_fp[1], 5.5501 );
  949.                 c_fp[0] -= (0.042 * floatsin(-(equipment_data[e_id][ed_pos][3]), degrees));
  950.                 c_fp[1] -= (0.042 * floatcos(-(equipment_data[e_id][ed_pos][3]), degrees));
  951.                 equipment_data[e_id][ed_objects][21] = CreateObject(1628, c_fp[0], c_fp[1], equipment_data[e_id][ed_pos][2] + 4,   0.00000, 0.00000, equipment_data[e_id][ed_pos][3]+90.00000+ 180);
  952.             }
  953.             else {
  954.                 rails_recursive = strval( gstring );
  955.             }
  956.  
  957.             v ++;
  958.         }
  959.     }
  960.  
  961.     fclose( rail_file );
  962.  
  963.     return 1;
  964. }
  965.  
  966. stock GetClosestEQID( playerid ) {
  967.     new eqid = -1,
  968.         Float:dists[2],
  969.         Float:ppos[3];
  970.        
  971.     dists[0] = 10.0;
  972.     GetPlayerPos( playerid, ppos[0], ppos[1], ppos[2] );
  973.    
  974.     v = 0;
  975.     for( ; v < MAX_RAILCHECK; v ++ ) {
  976.         if( !equipment_data[v][ed_spawned] ) continue;
  977.        
  978.         dists[1] = GetDistanceFromPointToPoint( equipment_data[v][ed_pos][0], equipment_data[v][ed_pos][1], equipment_data[v][ed_pos][2], ppos[0], ppos[1], ppos[2] );
  979.        
  980.         if( dists[1] <= dists[0] ) {
  981.             dists[0] = dists[1];
  982.             eqid = v;
  983.         }
  984.     }
  985.  
  986.     return eqid;
  987. }
  988.  
  989. // --------------------------------------------------------------------------------------------------- Nem általam írt sorok.
  990. stock IsVehicleInRangeOfPoint(vehicleid, Float:radi, Float:x, Float:y, Float:z) {
  991.     new Float:oldposx, Float:oldposy, Float:oldposz;
  992.     new Float:tempposx, Float:tempposy, Float:tempposz;
  993.  
  994.     GetVehiclePos(vehicleid, oldposx, oldposy, oldposz);
  995.     tempposx = (oldposx -x);
  996.     tempposy = (oldposy -y);
  997.     tempposz = (oldposz -z);
  998.  
  999.     if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi))) {
  1000.         return 1;
  1001.     }
  1002.  
  1003.     return 0;
  1004. }
  1005.  
  1006. stock IsNumeric(const string[]) {
  1007.     new length=strlen(string);
  1008.     if (length==0) return false;
  1009.     for (new i = 0; i < length; i++) {
  1010.         if (
  1011.         (string[i] > '9' || string[i] < '0' && string[i]!='-' && string[i]!='+')
  1012.         || (string[i]=='-' && i!=0)
  1013.         || (string[i]=='+' && i!=0)
  1014.         ) return false;
  1015.     }
  1016.     if (length==1 && (string[0]=='-' || string[0]=='+')) return false;
  1017.     return true;
  1018. }
  1019.  
  1020. public Float: GetDistanceFromPointToPoint( Float:X,Float:Y,Float:Z,Float:tX,Float:tY,Float:tZ ) {
  1021.     return Float: floatsqroot( (tX-X)*(tX-X)+(tY-Y)*(tY-Y)+(tZ-Z)*(tZ-Z) );
  1022. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement