Advertisement
Guest User

SA-MP Construction Site Elevators Filterscript

a guest
Jan 27th, 2014
749
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 44.30 KB | None | 0 0
  1. //==============================================================================
  2. // Construction Site Elevators by Incognito
  3. //
  4. // Customizable elevators with the following features:
  5. // - Enclosed elevators with opening and closing doors
  6. // - Large platform elevators
  7. // - Multiple floors with custom names
  8. // - Call switches on each floor
  9. // - Attachable light and support objects
  10. // - Adjustable elevator move speeds
  11. //==============================================================================
  12.  
  13. #include <a_samp>
  14. #include <foreach>
  15. #include <streamer>
  16.  
  17. #define FILTERSCRIPT
  18.  
  19. // Specify the maximum number of elevators and floor levels here.
  20. #define MAX_ELEVATORS (3)
  21. #define MAX_LEVELS (36)
  22.  
  23. // You might want to change this ID if it is used in another script.
  24. #define ELEVATOR_FLOOR_SELECTION_DIALOG_ID (1808)
  25.  
  26. // Internal definitions
  27. #define ELEVATOR_DOORS_CLOSE (0)
  28. #define ELEVATOR_DOORS_OPEN (1)
  29.  
  30. #define ELEVATOR_LIGHTS_CONSTANT (0)
  31. #define ELEVATOR_LIGHTS_FLASHING (1)
  32.  
  33. #define ELEVATOR_TYPE_ENCLOSED (0)
  34. #define ELEVATOR_TYPE_PLATFORM (1)
  35.  
  36. #define MAX_ADDON_OBJECTS (70)
  37.  
  38. //------------------------------------------------------------------------------
  39. // 1.) elevatorTypes
  40. //
  41. // These definitions specify the type of elevator that will be used. If
  42. // ELEVATOR_TYPE_ENCLOSED is specified, then a single enclosed elevator with
  43. // opening and closing doors will be created. If ELEVATOR_TYPE_PLATFORM is
  44. // specified, then a large platform elevator will be created instead.
  45. //------------------------------------------------------------------------------
  46.  
  47. new elevatorTypes[MAX_ELEVATORS] =
  48. {
  49.     ELEVATOR_TYPE_ENCLOSED,
  50.     ELEVATOR_TYPE_ENCLOSED,
  51.     ELEVATOR_TYPE_PLATFORM
  52. };
  53.  
  54. // To replace the platform elevator at the mega construction site with two
  55. // enclosed elevators, replace the above array with this one:
  56. //
  57. //  new elevatorTypes[MAX_ELEVATORS] =
  58. //  {
  59. //      ELEVATOR_TYPE_ENCLOSED,
  60. //      ELEVATOR_TYPE_ENCLOSED,
  61. //      ELEVATOR_TYPE_ENCLOSED,
  62. //      ELEVATOR_TYPE_ENCLOSED
  63. //  };
  64. //
  65. // Also, change MAX_ELEVATORS from 3 to 4.
  66. //
  67. // The arrays below contain commented out entries that you can use for the
  68. // enclosed elevators at the mega construction site.
  69.  
  70. //------------------------------------------------------------------------------
  71. // 2.) elevatorAttachableObjects
  72. //
  73. // These boolean values specify whether to attach lights and/or a support
  74. // object to each elevator. There are two values in each row. The first value
  75. // corresponds to the light objects, and the second value corresponds to the
  76. // support object. Specifying true will attach the object(s), and specifying
  77. // false will not attach the object(s). Each elevator is in a separate column.
  78. // Note that after a certain height, the support object begins to run out of
  79. // length, so it's only really feasible to attach it to an elevator that doesn't
  80. // go very high.
  81. //------------------------------------------------------------------------------
  82.  
  83. new bool:elevatorAttachableObjects[MAX_ELEVATORS][2] =
  84. {
  85.     { true, true },
  86.     { true, true },
  87.     { true, false }
  88.  
  89.     // Enclosed elevators at the mega construction site:
  90.     // { true, false },
  91.     // { true, false }
  92. };
  93.  
  94. //------------------------------------------------------------------------------
  95. // 3.) elevatorCoordinates
  96. //
  97. // These numbers specify where the elevators will be placed. There are two
  98. // numbers separated by commas in each row. The first number is the X
  99. // coordinate, and the second number is the Y coordinate. The first Z coordinate
  100. // from elevatorLevels will be used when the objects are created. Each elevator
  101. // is in a separate column.
  102. //------------------------------------------------------------------------------
  103.  
  104. new Float:elevatorCoordinates[MAX_ELEVATORS][2] =
  105. {
  106.     { 1880.027710, -1315.910156 },
  107.     { 1883.477173, -1315.910156 },
  108.     { 4.033685, 1536.450073 }
  109.  
  110.     // Enclosed elevators at the mega construction site:
  111.     // { 2.310921, 1537.146240 },
  112.     // { 5.760921, 1537.146240 }
  113. };
  114.  
  115. //------------------------------------------------------------------------------
  116. // 4.) elevatorLevels
  117. //
  118. // These numbers specify where the elevator will stop at each level. There are
  119. // numbers separated by commas in each row (the amount is determined by
  120. // MAX_LEVELS). These numbers are the Z coordinates the elevator will use when
  121. // moving to a new level. Each elevator is in a separate column. Insert
  122. // 0.0 if you don't want a level to be used.
  123. //------------------------------------------------------------------------------
  124.  
  125. new Float:elevatorLevels[MAX_ELEVATORS][MAX_LEVELS] =
  126. {
  127.     { 14.840647, 19.715614, 24.715595, 29.715588, 34.715614, 39.715675, 44.715675, 49.640686, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 },
  128.     { 14.840647, 19.715614, 24.715595, 29.715588, 34.715614, 39.715675, 44.715675, 49.640686, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 },
  129.     { 11.865028, 16.790025, 21.790025, 26.790025, 31.790021, 36.790021, 41.790037, 46.715078, 51.740079, 56.740079, 61.74011, 66.740095, 71.740079, 76.74011, 81.665151, 86.690153, 91.690168, 96.690183, 101.690198, 106.690183, 111.690198, 116.615179, 121.64018, 126.640195, 131.640142, 136.640142, 141.640081, 146.64002, 151.564916, 156.589788, 161.589788, 166.589605, 171.589544, 176.589422, 181.5893, 186.514196 }
  130.    
  131.     // Enclosed elevators at the mega construction site:
  132.     // { 13.090273, 18.015270, 23.015270, 28.015270, 33.015266, 38.015266, 43.015282, 47.940323, 52.965324, 57.965324, 62.965355, 67.965340, 72.965324, 77.965355, 82.890396, 87.915398, 92.915413, 97.915428, 102.915443, 107.915428, 112.915443, 117.840424, 122.865425, 127.865440, 132.865387, 137.865387, 142.865326, 147.865265, 152.790161, 157.815033, 162.815033, 167.814850, 172.814789, 177.814667, 182.814545, 187.739441 },
  133.     // { 13.090273, 18.015270, 23.015270, 28.015270, 33.015266, 38.015266, 43.015282, 47.940323, 52.965324, 57.965324, 62.965355, 67.965340, 72.965324, 77.965355, 82.890396, 87.915398, 92.915413, 97.915428, 102.915443, 107.915428, 112.915443, 117.840424, 122.865425, 127.865440, 132.865387, 137.865387, 142.865326, 147.865265, 152.790161, 157.815033, 162.815033, 167.814850, 172.814789, 177.814667, 182.814545, 187.739441 }
  134. };
  135.  
  136. //------------------------------------------------------------------------------
  137. // 5.) elevatorMoveSpeeds
  138. //
  139. // These numbers specify how fast the elevators will move from one set of
  140. // coordinates to another. There are four numbers separated by commas in each
  141. // row. The first number is door open speed, the second number is the door close
  142. // speed, the third number is the lift up speed, and the fourth number is the
  143. // lift down speed. Each elevator is in a separate column. Note that since
  144. // platform elevators do not have doors, it is not necessary to input a door
  145. // open or close speed.
  146. //------------------------------------------------------------------------------
  147.  
  148. new Float:elevatorMoveSpeeds[MAX_ELEVATORS][4] =
  149. {
  150.     { 1.0, 1.0, 5.0, 5.0 },
  151.     { 1.0, 1.0, 5.0, 5.0 },
  152.     { 0.0, 0.0, 7.5, 7.5 }
  153.    
  154.     // Enclosed elevators at the mega construction site:
  155.     // { 1.0, 1.0, 7.5, 7.5 },
  156.     // { 1.0, 1.0, 7.5, 7.5 }
  157. };
  158.  
  159. //------------------------------------------------------------------------------
  160. // 6.) floorNames
  161. //
  162. // These strings specify the names of the floors. There are strings separated by
  163. // commas in each row (the amount is determined by MAX_LEVELS). These strings
  164. // will be found in the dialog that is opened when a player walks into an
  165. // elevator. They will also be shown next to the elevator switches on every
  166. // floor as 3D text labels. Each elevator is in a separate column. Insert "" in
  167. // the string name if you don't want the floor to be used.
  168. //------------------------------------------------------------------------------
  169.  
  170. new floorNames[MAX_ELEVATORS][MAX_LEVELS][32] =
  171. {
  172.     { "Lobby", "Storage Room", "Security", "Drug Store", "Tools Store", "Ammu-Nation", "Viewing Room", "Roof", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
  173.     { "Lobby", "Storage Room", "Security", "Drug Store", "Tools Store", "Ammu-Nation", "Viewing Room", "Roof", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
  174.     { "Floor 1", "Floor 2", "Floor 3", "Floor 4", "Floor 5", "Floor 6", "Floor 7", "Floor 8", "Floor 9", "Floor 10", "Floor 11", "Floor 12", "Floor 13", "Floor 14", "Floor 15", "Floor 16", "Floor 17", "Floor 18", "Floor 19", "Floor 20", "Floor 21", "Floor 22", "Floor 23", "Floor 24", "Floor 25", "Floor 26", "Floor 27", "Floor 28", "Floor 29", "Floor 30", "Floor 31", "Floor 32", "Floor 33", "Floor 34", "Floor 35", "Floor 36" }
  175.  
  176.     // Enclosed elevators at the mega construction site:
  177.     // { "Floor 1", "Floor 2", "Floor 3", "Floor 4", "Floor 5", "Floor 6", "Floor 7", "Floor 8", "Floor 9", "Floor 10", "Floor 11", "Floor 12", "Floor 13", "Floor 14", "Floor 15", "Floor 16", "Floor 17", "Floor 18", "Floor 19", "Floor 20", "Floor 21", "Floor 22", "Floor 23", "Floor 24", "Floor 25", "Floor 26", "Floor 27", "Floor 28", "Floor 29", "Floor 30", "Floor 31", "Floor 32", "Floor 33", "Floor 34", "Floor 35", "Floor 36" },
  178.     // { "Floor 1", "Floor 2", "Floor 3", "Floor 4", "Floor 5", "Floor 6", "Floor 7", "Floor 8", "Floor 9", "Floor 10", "Floor 11", "Floor 12", "Floor 13", "Floor 14", "Floor 15", "Floor 16", "Floor 17", "Floor 18", "Floor 19", "Floor 20", "Floor 21", "Floor 22", "Floor 23", "Floor 24", "Floor 25", "Floor 26", "Floor 27", "Floor 28", "Floor 29", "Floor 30", "Floor 31", "Floor 32", "Floor 33", "Floor 34", "Floor 35", "Floor 36" }
  179. };
  180.  
  181. //------------------------------------------------------------------------------
  182. // 7.) switchCoordinates
  183. //
  184. // These numbers specify where the elevator switches will be placed. There are
  185. // three numbers separated by commas in each row. The first number is the X
  186. // coordinate, and the second number is the Y coordinate. The Z coordinate from
  187. // elevatorLevels will be used with an offset when the keypad objects, areas,
  188. // and 3D text labels associated with the switch are created. Each elevator is
  189. // in a separate column.
  190. //------------------------------------------------------------------------------
  191.  
  192. new Float:switchCoordinates[MAX_ELEVATORS][2] =
  193. {
  194.     { 1877.985445, -1319.736963 },
  195.     { 1885.586479, -1319.736963 },
  196.     { 7.845226, 1533.331458 }
  197.  
  198.     // Enclosed elevators at the mega construction site:
  199.     // { 0.243653, 1533.331458 },
  200.     // { 7.845226, 1533.331458 }
  201. };
  202.  
  203. enum E_AREA
  204. {
  205.     E_AREA_FRONT,
  206.     E_AREA_INSIDE,
  207.     E_AREA_SWITCH
  208. }
  209.  
  210. enum E_ELEVATOR
  211. {
  212.     bool:E_ELEVATOR_CONTROLLABLE,
  213.     E_ELEVATOR_CURRENT_LEVEL,
  214.     Float:E_ELEVATOR_CURRENT_LIFT_SPEED,
  215.     bool:E_ELEVATOR_DOORS_OPEN,
  216.     bool:E_ELEVATOR_MOVING,
  217.     bool:E_ELEVATOR_MOVING_REQUESTED,
  218.     E_ELEVATOR_NEARBY_AREA,
  219.     E_ELEVATOR_NEW_LEVEL,
  220. }
  221.  
  222. enum E_MOVING_OBJECT
  223. {
  224.     E_MOVING_OBJECT_DOOR_1,
  225.     E_MOVING_OBJECT_DOOR_2,
  226.     E_MOVING_OBJECT_ELEVATOR,
  227.     E_MOVING_OBJECT_GUARD_RAIL_1,
  228.     E_MOVING_OBJECT_GUARD_RAIL_2,
  229.     E_MOVING_OBJECT_GUARD_RAIL_3,
  230.     E_MOVING_OBJECT_LIGHT_1,
  231.     E_MOVING_OBJECT_LIGHT_2,
  232.     E_MOVING_OBJECT_LIGHT_3,
  233.     E_MOVING_OBJECT_LIGHT_4,
  234.     E_MOVING_OBJECT_SUPPORT
  235. }
  236.  
  237. enum E_SWITCH
  238. {
  239.     E_SWITCH_OBJECT,
  240.     Text3D:E_SWITCH_TEXT_LABEL
  241. }
  242.  
  243. new addOnObjects[MAX_ADDON_OBJECTS];
  244. new areaData[MAX_ELEVATORS][MAX_LEVELS][E_AREA];
  245. new elevatorData[MAX_ELEVATORS][E_ELEVATOR];
  246. new movingObjectData[MAX_ELEVATORS][E_MOVING_OBJECT];
  247. new switchData[MAX_ELEVATORS][MAX_LEVELS][E_SWITCH];
  248.  
  249. forward Elevator_CheckForNearbyPlayers();
  250. forward Elevator_SetControllableStatus(elevatorid);
  251. forward Elevator_SetLevel(elevatorid, level);
  252. forward Elevator_ShowMenuForPlayer(elevatorid, playerid);
  253.  
  254. public OnFilterScriptInit()
  255. {
  256.     for (new e; e < MAX_ELEVATORS; e++)
  257.     {
  258.         elevatorData[e][E_ELEVATOR_CONTROLLABLE] = true;
  259.         elevatorData[e][E_ELEVATOR_CURRENT_LEVEL] = 1;
  260.         elevatorData[e][E_ELEVATOR_NEW_LEVEL] = 1;
  261.         switch (elevatorTypes[e])
  262.         {
  263.             case ELEVATOR_TYPE_ENCLOSED:
  264.             {
  265.                 movingObjectData[e][E_MOVING_OBJECT_ELEVATOR] = CreateDynamicObject(2669, elevatorCoordinates[e][0], elevatorCoordinates[e][1], elevatorLevels[e][0], 0.0, 0.0, 0.0);
  266.                 movingObjectData[e][E_MOVING_OBJECT_DOOR_1] = CreateDynamicObject(2678, elevatorCoordinates[e][0] - 0.759617, elevatorCoordinates[e][1] - 2.648524, elevatorLevels[e][0] - 0.133423, 0.0, 0.0, 0.0);
  267.                 movingObjectData[e][E_MOVING_OBJECT_DOOR_2] = CreateDynamicObject(2679, elevatorCoordinates[e][0] + 0.761887, elevatorCoordinates[e][1] - 2.648524, elevatorLevels[e][0] - 0.133423, 0.0, 0.0, 0.0);
  268.                 SetDynamicObjectMaterial(movingObjectData[e][E_MOVING_OBJECT_ELEVATOR], 0, 17555, "eastbeach3c_lae2", "metpull_law", 0xFF303030);
  269.                 SetDynamicObjectMaterial(movingObjectData[e][E_MOVING_OBJECT_ELEVATOR], 2, 17555, "eastbeach3c_lae2", "metpull_law", 0xFF303030);
  270.                 SetDynamicObjectMaterial(movingObjectData[e][E_MOVING_OBJECT_ELEVATOR], 3, 17555, "eastbeach3c_lae2", "metpull_law", 0xFF303030);
  271.                 SetDynamicObjectMaterial(movingObjectData[e][E_MOVING_OBJECT_DOOR_1], 0, 1560, "7_11_door", "cj_sheetmetal2", 0xFFC4C4C4);
  272.                 SetDynamicObjectMaterial(movingObjectData[e][E_MOVING_OBJECT_DOOR_1], 1, 1560, "7_11_door", "cj_sheetmetal2", 0xFFC4C4C4);
  273.                 SetDynamicObjectMaterial(movingObjectData[e][E_MOVING_OBJECT_DOOR_1], 2, 17555, "eastbeach3c_lae2", "metpull_law", 0xFF303030);
  274.                 SetDynamicObjectMaterial(movingObjectData[e][E_MOVING_OBJECT_DOOR_1], 3, 1560, "7_11_door", "cj_sheetmetal2", 0xFFC4C4C4);
  275.                 SetDynamicObjectMaterial(movingObjectData[e][E_MOVING_OBJECT_DOOR_2], 0, 1560, "7_11_door", "cj_sheetmetal2", 0xFFC4C4C4);
  276.                 SetDynamicObjectMaterial(movingObjectData[e][E_MOVING_OBJECT_DOOR_2], 1, 1560, "7_11_door", "cj_sheetmetal2", 0xFFC4C4C4);
  277.                 SetDynamicObjectMaterial(movingObjectData[e][E_MOVING_OBJECT_DOOR_2], 2, 17555, "eastbeach3c_lae2", "metpull_law", 0xFF303030);
  278.                 SetDynamicObjectMaterial(movingObjectData[e][E_MOVING_OBJECT_DOOR_2], 3, 1560, "7_11_door", "cj_sheetmetal2", 0xFFC4C4C4);
  279.                 if (elevatorAttachableObjects[e][0])
  280.                 {
  281.                     movingObjectData[e][E_MOVING_OBJECT_LIGHT_1] = CreateDynamicObject(19121, elevatorCoordinates[e][0], elevatorCoordinates[e][1], elevatorLevels[e][0] + 1.863229, 0.0, 0.0, 0.0);
  282.                 }
  283.                 if (elevatorAttachableObjects[e][1])
  284.                 {
  285.                     movingObjectData[e][E_MOVING_OBJECT_SUPPORT] = CreateDynamicObject(1383, elevatorCoordinates[e][0], elevatorCoordinates[e][1], elevatorLevels[e][0] - 33.785002, 0.0, 0.0, 0.0);
  286.                 }
  287.             }
  288.             case ELEVATOR_TYPE_PLATFORM:
  289.             {
  290.                 movingObjectData[e][E_MOVING_OBJECT_ELEVATOR] = CreateDynamicObject(19325, elevatorCoordinates[e][0], elevatorCoordinates[e][1], elevatorLevels[e][0], 0.0, -90.0, -90.0);
  291.                 movingObjectData[e][E_MOVING_OBJECT_GUARD_RAIL_1] = CreateDynamicObject(994, elevatorCoordinates[e][0] - 3.138048, elevatorCoordinates[e][1] + 1.901557, elevatorLevels[e][0] + 0.094972, 0.0, 0.0, 0.0);
  292.                 movingObjectData[e][E_MOVING_OBJECT_GUARD_RAIL_2] = CreateDynamicObject(997, elevatorCoordinates[e][0] - 3.200950, elevatorCoordinates[e][1] + 1.640503, elevatorLevels[e][0] + 0.094972, 0.0, 0.0, -90.0);
  293.                 movingObjectData[e][E_MOVING_OBJECT_GUARD_RAIL_3] = CreateDynamicObject(997, elevatorCoordinates[e][0] + 3.200950, elevatorCoordinates[e][1] + 1.640503, elevatorLevels[e][0] + 0.094972, 0.0, 0.0, -90.0);
  294.                 SetDynamicObjectMaterial(movingObjectData[e][E_MOVING_OBJECT_ELEVATOR], 0, 16640, "a51", "sl_metalwalk");
  295.                 if (elevatorAttachableObjects[e][0])
  296.                 {
  297.                     movingObjectData[e][E_MOVING_OBJECT_LIGHT_1] = CreateDynamicObject(19121, elevatorCoordinates[e][0] + 3.060504, elevatorCoordinates[e][1] - 1.684815, elevatorLevels[e][0] + 0.561335, 0.0, 0.0, 0.0);
  298.                     movingObjectData[e][E_MOVING_OBJECT_LIGHT_2] = CreateDynamicObject(19121, elevatorCoordinates[e][0] + 3.060504, elevatorCoordinates[e][1] + 1.684815, elevatorLevels[e][0] + 0.561335, 0.0, 0.0, 0.0);
  299.                     movingObjectData[e][E_MOVING_OBJECT_LIGHT_3] = CreateDynamicObject(19121, elevatorCoordinates[e][0] - 3.060504, elevatorCoordinates[e][1] + 1.684815, elevatorLevels[e][0] + 0.561335, 0.0, 0.0, 0.0);
  300.                     movingObjectData[e][E_MOVING_OBJECT_LIGHT_4] = CreateDynamicObject(19121, elevatorCoordinates[e][0] - 3.060504, elevatorCoordinates[e][1] - 1.684815, elevatorLevels[e][0] + 0.561335, 0.0, 0.0, 0.0);
  301.                 }
  302.                 if (elevatorAttachableObjects[e][1])
  303.                 {
  304.                     movingObjectData[e][E_MOVING_OBJECT_SUPPORT] = CreateDynamicObject(1383, elevatorCoordinates[e][0], elevatorCoordinates[e][1], elevatorLevels[e][0] - 32.555002, 0.0, 0.0, 0.0);
  305.                 }
  306.             }
  307.         }
  308.         for (new l; l < MAX_LEVELS; l++)
  309.         {
  310.             if (elevatorLevels[e][l] == 0.0)
  311.             {
  312.                 break;
  313.             }
  314.             // Some slight adjustments are needed to conform with the geometry of the construction site.
  315.             new Float:yOffset, Float:zOffset, text[128];
  316.             format(text, sizeof(text), "{CCCCCC}[%s]\n{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to call", floorNames[e][l]);
  317.             if (l % 7)
  318.             {
  319.                 // If the floor number is not a multiple of 8, then a Y offset is needed.
  320.                 yOffset = 0.4125;
  321.             }
  322.             else
  323.             {
  324.                 // Even though the top floor is a multiple of 8, a Y offset is still needed.
  325.                 if ((l + 1) != MAX_LEVELS)
  326.                 {
  327.                     if (elevatorLevels[e][l + 1] == 0.0)
  328.                     {
  329.                         yOffset = 0.4125;
  330.                     }
  331.                 }
  332.                 else
  333.                 {
  334.                     yOffset = 0.4125;
  335.                 }
  336.             }
  337.             // The platform elevator needs a Z offset as well.
  338.             if (elevatorTypes[e] == ELEVATOR_TYPE_PLATFORM)
  339.             {
  340.                 zOffset = 1.225;
  341.             }
  342.             switch (elevatorTypes[e])
  343.             {
  344.                 case ELEVATOR_TYPE_ENCLOSED:
  345.                 {
  346.                     areaData[e][l][E_AREA_FRONT] = CreateDynamicCube(elevatorCoordinates[e][0] - 2.0, elevatorCoordinates[e][1] - 6.0, elevatorLevels[e][l] - 2.0, elevatorCoordinates[e][0] + 2.0, elevatorCoordinates[e][1] + 6.0, elevatorLevels[e][l] + 2.0);
  347.                     areaData[e][l][E_AREA_INSIDE] = CreateDynamicCube(elevatorCoordinates[e][0] - 1.75, elevatorCoordinates[e][1] - 3.0, elevatorLevels[e][l] - 1.0, elevatorCoordinates[e][0] + 1.75, elevatorCoordinates[e][1] + 3.0, elevatorLevels[e][l] + 1.0);
  348.                 }
  349.                 case ELEVATOR_TYPE_PLATFORM:
  350.                 {
  351.                     areaData[e][l][E_AREA_INSIDE] = CreateDynamicCube(elevatorCoordinates[e][0] - 3.0, elevatorCoordinates[e][1] - 2.0, elevatorLevels[e][l] - 1.0 + zOffset, elevatorCoordinates[e][0] + 3.0, elevatorCoordinates[e][1] + 2.0, elevatorLevels[e][l] + 1.0 + zOffset);
  352.                 }
  353.             }
  354.             areaData[e][l][E_AREA_SWITCH] = CreateDynamicSphere(switchCoordinates[e][0], switchCoordinates[e][1] + yOffset, elevatorLevels[e][l] + zOffset, 2.0);
  355.             switchData[e][l][E_SWITCH_OBJECT] = CreateDynamicObject(19273, switchCoordinates[e][0], switchCoordinates[e][1] + yOffset, elevatorLevels[e][l] + zOffset, 0, 0, 0);
  356.             switchData[e][l][E_SWITCH_TEXT_LABEL] = CreateDynamic3DTextLabel(text, 0xCCCCCCAA, switchCoordinates[e][0], switchCoordinates[e][1] - 0.1 + yOffset, elevatorLevels[e][l] + 0.5 + zOffset, 6.5, .testlos = 1);
  357.         }
  358.         elevatorData[e][E_ELEVATOR_NEARBY_AREA] = CreateDynamicRectangle(elevatorCoordinates[e][0] - 120.0, elevatorCoordinates[e][1] - 20.0, elevatorCoordinates[e][0] + 20.0, elevatorCoordinates[e][1] + 20.0);
  359.     }
  360.     SetTimer("Elevator_CheckForNearbyPlayers", 500, 1);
  361.     //------------------------------------------------------------------------------
  362.     // These objects are just a few boxes and crates that I put in the default
  363.     // construction site in LS. I also added a few shops there, like Ammu-Nation.
  364.     //------------------------------------------------------------------------------
  365.     addOnObjects[0] = CreateDynamicObject(925, 1893.239380, -1307.167847, 24.554092, 0, 0, 135);
  366.     addOnObjects[1] = CreateDynamicObject(944, 1889.454956, -1316.659790, 24.381258, 0, 0, 112.5);
  367.     addOnObjects[2] = CreateDynamicObject(1431, 1889.238159, -1316.682129, 25.489967, 0, 0, 292.5);
  368.     addOnObjects[3] = CreateDynamicObject(2567, 1871.561401, -1314.821899, 25.419788, 0, 0, 90);
  369.     addOnObjects[4] = CreateDynamicObject(3576, 1872.445190, -1323.734131, 24.984859, 0, 0, 123.75);
  370.     addOnObjects[5] = CreateDynamicObject(3577, 1875.468384, -1309.620483, 24.274694, 0, 0, 157.5003);
  371.     addOnObjects[6] = CreateDynamicObject(3630, 1874.490845, -1307.927002, 34.984810, 0, 0, 180);
  372.     addOnObjects[7] = CreateDynamicObject(3761, 1883.674561, -1306.768066, 25.491169, 0, 0, 90.0001);
  373.     addOnObjects[8] = CreateDynamicObject(5260, 1873.828247, -1312.886597, 20.202702, 0, 0, 270.0001);
  374.     addOnObjects[9] = CreateDynamicObject(18257, 1889.628052, -1318.157227, 33.498913, 0, 0, 270);
  375.     addOnObjects[10] = CreateDynamicObject(12930, 1873.506348, -1323.981934, 34.347416, 0, 0, 0);
  376.     addOnObjects[11] = CreateDynamicObject(5269, 1888.052002, -1324.039063, 30.801235, 0, 0, 90);
  377.     addOnObjects[12] = CreateDynamicObject(3761, 1884.764648, -1307.738037, 35.491169, 0, 0, 90);
  378.     addOnObjects[13] = CreateDynamicObject(1431, 1891.231934, -1323.811523, 35.485687, 0, 0, 45);
  379.     addOnObjects[14] = CreateDynamicObject(944, 1891.334473, -1323.899292, 34.376976, 0, 0, 45);
  380.     addOnObjects[15] = CreateDynamicObject(2009, 1890.469848, -1324.340332, 23.442186, 0, 0, 0.25);
  381.     addOnObjects[16] = CreateDynamicObject(1714, 1891.350097, -1324.313232, 23.482158, 0, 0, -90.0);
  382.     addOnObjects[17] = CreateDynamicObject(14532, 1893.743286, -1320.982055, 24.460880, 0, 0, 90.0);
  383.     addOnObjects[18] = CreateDynamicObject(2971, 1881.838257, -1324.487305, 23.487110, 0, 0, 337.5);
  384.     addOnObjects[19] = CreateDynamicObject(2973, 1892.539551, -1308.899292, 28.491177, 0, 0, 236.2501);
  385.     addOnObjects[20] = CreateDynamicObject(2991, 1893.015991, -1324.423950, 19.119923, 0, 0, 45);
  386.     addOnObjects[21] = CreateDynamicObject(3630, 1888.627441, -1307.819946, 19.984810, 0, 0, 180);
  387.     addOnObjects[22] = CreateDynamicObject(3761, 1870.401367, -1324.235474, 20.491169, 0, 0, 213.7502);
  388.     addOnObjects[23] = CreateDynamicObject(3630, 1871.423706, -1320.258179, 29.984810, 0, 0, 270);
  389.     addOnObjects[24] = CreateDynamicObject(925, 1879.793945, -1307.404907, 29.554092, 0, 0, 0);
  390.     addOnObjects[25] = CreateDynamicObject(2567, 1891.997437, -1317.129517, 30.425295, 0, 0, 90);
  391.     addOnObjects[26] = CreateDynamicObject(18257, 1873.338989, -1316.051147, 28.492188, 0, 0, 270);
  392.     addOnObjects[27] = CreateDynamicObject(2991, 1871.407227, -1309.098022, 39.119923, 0, 0, 270);
  393.     addOnObjects[28] = CreateDynamicObject(944, 1877.510620, -1323.393433, 29.376974, 0, 0, 146.2501);
  394.     addOnObjects[29] = CreateDynamicObject(1431, 1877.624268, -1323.242188, 30.485683, 0, 0, 326.25);
  395.     addOnObjects[30] = CreateDynamicObject(925, 1880.400635, -1307.401978, 19.554092, 0, 0, 0);
  396.     addOnObjects[31] = CreateDynamicObject(2567, 1878.785156, -1307.287354, 40.419788, 0, 0, 0);
  397.     addOnObjects[32] = CreateDynamicObject(3577, 1889.582397, -1310.724609, 39.274696, 0, 0, 123.7499);
  398.     addOnObjects[33] = CreateDynamicObject(5269, 1892.900757, -1320.260986, 40.793556, 0, 0, 0);
  399.     addOnObjects[34] = CreateDynamicObject(18257, 1872.281250, -1321.796021, 38.492188, 0, 0, 270);
  400.     addOnObjects[35] = CreateDynamicObject(2971, 1875.913696, -1311.025757, 38.487110, 0, 0, 236.2501);
  401.     addOnObjects[36] = CreateDynamicObject(2973, 1885.352905, -1307.910522, 38.485668, 0, 0, 22.5);
  402.     addOnObjects[37] = CreateDynamicObject(2974, 1891.812256, -1314.129272, 38.483978, 0, 0, 326.25);
  403.     addOnObjects[38] = CreateDynamicObject(18092, 1881.917846, -1325.100342, 38.991608, 0, 0, 0.0002);
  404.     addOnObjects[39] = CreateDynamicObject(18092, 1876.892212, -1325.117798, 33.991608, 0, 0, 0);
  405.     addOnObjects[40] = CreateDynamicObject(2061, 1880.879638, -1324.727173, 39.784058, 0, 0, 0);
  406.     addOnObjects[41] = CreateDynamicObject(2060, 1883.799560, -1324.026367, 38.648846, 0, 0, 0);
  407.     addOnObjects[42] = CreateDynamicObject(2060, 1883.799560, -1324.026367, 38.964298, 0, 0, 0);
  408.     addOnObjects[43] = CreateDynamicObject(2228, 1879.429810, -1325.143311, 34.048134, 0, 0, 270);
  409.     addOnObjects[44] = CreateDynamicObject(2690, 1874.962524, -1324.929321, 34.851543, 0, 0, 180);
  410.     addOnObjects[45] = CreateDynamicObject(2045, 1877.953735, -1324.899658, 34.535122, 2.5783, 0, 112.5001);
  411.     addOnObjects[46] = CreateDynamicObject(3123, 1874.872070, -1326.393677, 35.516396, 355.1547, 170.9238, 356.5026);
  412.     addOnObjects[47] = CreateDynamicObject(2358, 1879.909423, -1324.736450, 39.608662, 0, 0, 180);
  413.     addOnObjects[48] = CreateDynamicObject(2358, 1879.909423, -1324.736450, 39.852974, 0, 0, 180);
  414.     addOnObjects[49] = CreateDynamicObject(3124, 1883.412109, -1324.374023, 39.696362, 313.5904, 55.8633, 216.4056);
  415.     addOnObjects[50] = CreateDynamicObject(12930, 1890.447754, -1309.073975, 19.300476, 0, 0, 180);
  416.     addOnObjects[51] = CreateDynamicObject(2709, 1886.847412, -1307.184082, 29.631788, 0, 0, 0);
  417.     addOnObjects[52] = CreateDynamicObject(1580, 1888.907715, -1306.980957, 29.480543, 0, 0, 315);
  418.     addOnObjects[53] = CreateDynamicObject(1241, 1884.999268, -1307.025146, 29.564024, 89.3814, 359.1406, 168.75);
  419.     addOnObjects[54] = CreateDynamicObject(18092, 1886.918457, -1306.878174, 28.991610, 0, 0, 180);
  420.     addOnObjects[55] = CreateDynamicObject(2709, 1887.206177, -1307.376953, 29.581789, 0, 91.1003, 307.952);
  421.     addOnObjects[56] = CreateDynamicObject(1242, 1881.966796, -1324.759399, 39.644573, 0, 0, 0);
  422.     addOnObjects[57] = CreateDynamicObject(3044, 1885.801636, -1307.086426, 29.531784, 0, 0, 45);
  423.     addOnObjects[58] = CreateDynamicObject(1348, 1886.682373, -1326.149780, 34.192199, 0, 0, 0);
  424.     //------------------------------------------------------------------------------
  425.     // These objects form the mega construction site just south of Area 69. They're
  426.     // stacked on top of each other, making a grand total of 36 floors.
  427.     //------------------------------------------------------------------------------
  428.     addOnObjects[59] = CreateDynamicObject(5463, 4.078737, 1537.529541, 36.244511, 0, 0, 0);
  429.     addOnObjects[60] = CreateDynamicObject(5463, 4.078537, 1537.527541, 71.194527, 0, 0, 0);
  430.     addOnObjects[61] = CreateDynamicObject(5463, 4.078737, 1537.529541, 106.144478, 0, 0, 0);
  431.     addOnObjects[62] = CreateDynamicObject(5463, 4.078537, 1537.527541, 141.094681, 0, 0, 0);
  432.     addOnObjects[63] = CreateDynamicObject(5463, 4.078737, 1537.529541, 176.044632, 0, 0, 0);
  433.     addOnObjects[64] = CreateDynamicObject(5644, 4.078737, 1537.149536, 29.319490, 0, 0, 0);
  434.     addOnObjects[65] = CreateDynamicObject(5644, 4.078737, 1537.149536, 54.619492, 0, 0, 0);
  435.     addOnObjects[66] = CreateDynamicObject(5644, 4.078737, 1537.149536, 79.919479, 0, 0, 0);
  436.     addOnObjects[67] = CreateDynamicObject(5644, 4.078737, 1537.149536, 105.219467, 0, 0, 0);
  437.     addOnObjects[68] = CreateDynamicObject(5644, 4.078737, 1537.149536, 130.519638, 0, 0, 0);
  438.     addOnObjects[69] = CreateDynamicObject(5644, 4.078737, 1537.149536, 155.819687, 0, 0, 0);
  439.     return 1;
  440. }
  441.  
  442. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  443. {
  444.     if (newkeys & KEY_YES)
  445.     {
  446.         for (new e; e < MAX_ELEVATORS; e++)
  447.         {
  448.             if (IsPlayerInDynamicArea(playerid, elevatorData[e][E_ELEVATOR_NEARBY_AREA]))
  449.             {
  450.                 for (new l; l < MAX_LEVELS; l++)
  451.                 {
  452.                     if (IsPlayerInDynamicArea(playerid, areaData[e][l][E_AREA_SWITCH]))
  453.                     {
  454.                         PlayerPlaySound(playerid, 21000, 0.0, 0.0, 0.0);
  455.                         if (!elevatorData[e][E_ELEVATOR_CONTROLLABLE] || elevatorData[e][E_ELEVATOR_MOVING] || elevatorData[e][E_ELEVATOR_MOVING_REQUESTED])
  456.                         {
  457.                             SendClientMessage(playerid, 0xFF0000AA, "The elevator is already in motion.");
  458.                         }
  459.                         else if ((l + 1) == elevatorData[e][E_ELEVATOR_CURRENT_LEVEL])
  460.                         {
  461.                             SendClientMessage(playerid, 0xFF0000AA, "The elevator is already on this floor.");
  462.                         }
  463.                         else
  464.                         {
  465.                             if (elevatorTypes[e] == ELEVATOR_TYPE_ENCLOSED)
  466.                             {
  467.                                 Elevator_AdjustDoors(e, ELEVATOR_DOORS_CLOSE);
  468.                             }
  469.                             SendClientMessage(playerid, 0xFFFF00AA, "The elevator has been called to this floor.");
  470.                             SetTimerEx("Elevator_SetLevel", 1000, 0, "dd", e, l + 1);
  471.                             elevatorData[e][E_ELEVATOR_CONTROLLABLE] = false;
  472.                             elevatorData[e][E_ELEVATOR_MOVING_REQUESTED] = true;
  473.                         }
  474.                         return 1;
  475.                     }
  476.                 }
  477.             }
  478.         }      
  479.     }
  480.     return 1;
  481. }
  482.  
  483. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  484. {
  485.     if (dialogid == ELEVATOR_FLOOR_SELECTION_DIALOG_ID && response)
  486.     {
  487.         for (new e; e < MAX_ELEVATORS; e++)
  488.         {
  489.             if (IsPlayerInDynamicArea(playerid, areaData[e][elevatorData[e][E_ELEVATOR_CURRENT_LEVEL] - 1][E_AREA_INSIDE]))
  490.             {
  491.                 if (!elevatorData[e][E_ELEVATOR_CONTROLLABLE] || elevatorData[e][E_ELEVATOR_MOVING] || elevatorData[e][E_ELEVATOR_MOVING_REQUESTED])
  492.                 {
  493.                     SendClientMessage(playerid, 0xFF0000AA, "The elevator is already in motion.");
  494.                 }
  495.                 else if ((listitem + 1) == elevatorData[e][E_ELEVATOR_CURRENT_LEVEL])
  496.                 {
  497.                     SendClientMessage(playerid, 0xFF0000AA, "The elevator is already on this floor.");
  498.                 }
  499.                 else
  500.                 {
  501.                     if (elevatorTypes[e] == ELEVATOR_TYPE_ENCLOSED)
  502.                     {
  503.                         Elevator_AdjustDoors(e, ELEVATOR_DOORS_CLOSE);
  504.                     }
  505.                     SendClientMessage(playerid, 0xFFFF00AA, "The elevator will move to the selected floor.");
  506.                     SetTimerEx("Elevator_SetLevel", 1000, 0, "dd", e, listitem + 1);
  507.                     elevatorData[e][E_ELEVATOR_CONTROLLABLE] = false;
  508.                     elevatorData[e][E_ELEVATOR_MOVING_REQUESTED] = true;
  509.                     foreach(Player, i)
  510.                     {
  511.                         if (i != playerid)
  512.                         {
  513.                             if (IsPlayerInDynamicArea(i, areaData[e][elevatorData[e][E_ELEVATOR_CURRENT_LEVEL] - 1][E_AREA_INSIDE]))
  514.                             {
  515.                                 SendClientMessage(i, 0xFFFF00AA, "The elevator will move to the floor someone else has selected.");
  516.                                 ShowPlayerDialog(i, -1, DIALOG_STYLE_MSGBOX, " ", " ", "", "");
  517.                             }
  518.                         }
  519.                     }
  520.                 }
  521.                 return 1;
  522.             }
  523.         }
  524.         return 0;
  525.     }
  526.     return 0;
  527. }
  528.  
  529. public OnDynamicObjectMoved(objectid)
  530. {
  531.     for (new e; e < MAX_ELEVATORS; e++)
  532.     {
  533.         if (objectid == movingObjectData[e][E_MOVING_OBJECT_ELEVATOR])
  534.         {
  535.             SetTimerEx("Elevator_SetControllableStatus", 250, 0, "d", e);
  536.             elevatorData[e][E_ELEVATOR_CURRENT_LEVEL] = elevatorData[e][E_ELEVATOR_NEW_LEVEL];
  537.             elevatorData[e][E_ELEVATOR_MOVING] = false;
  538.             if (elevatorAttachableObjects[e][0])
  539.             {
  540.                 Elevator_SwapLights(e, ELEVATOR_LIGHTS_CONSTANT);
  541.             }
  542.             break;
  543.         }
  544.     }
  545.     return 1;
  546. }
  547.  
  548. public OnPlayerEnterDynamicArea(playerid, areaid)
  549. {
  550.     for (new e; e < MAX_ELEVATORS; e++)
  551.     {
  552.         if (areaid == areaData[e][elevatorData[e][E_ELEVATOR_CURRENT_LEVEL] - 1][E_AREA_INSIDE])
  553.         {
  554.             if (elevatorData[e][E_ELEVATOR_CONTROLLABLE] && !elevatorData[e][E_ELEVATOR_MOVING])
  555.             {
  556.                 SetTimerEx("Elevator_ShowMenuForPlayer", 500, 0, "dd", e, playerid);
  557.                 return 1;
  558.             }
  559.         }
  560.     }
  561.     return 1;
  562. }
  563.  
  564. public OnPlayerLeaveDynamicArea(playerid, areaid)
  565. {
  566.     for (new e; e < MAX_ELEVATORS; e++)
  567.     {
  568.         if (areaid == elevatorData[e][E_ELEVATOR_NEARBY_AREA])
  569.         {
  570.             if (!elevatorData[e][E_ELEVATOR_CONTROLLABLE] && elevatorData[e][E_ELEVATOR_MOVING])
  571.             {
  572.                 PlayerPlaySound(playerid, 1019, elevatorCoordinates[e][0], elevatorCoordinates[e][1], elevatorLevels[e][elevatorData[e][E_ELEVATOR_CURRENT_LEVEL] - 1]);
  573.                 PlayerPlaySound(playerid, 1022, elevatorCoordinates[e][0], elevatorCoordinates[e][1], elevatorLevels[e][elevatorData[e][E_ELEVATOR_CURRENT_LEVEL] - 1]);
  574.                 return 1;
  575.             }
  576.         }
  577.     }
  578.     return 1;
  579. }
  580.  
  581. Elevator_AdjustDoors(elevatorid, operation)
  582. {
  583.     switch (operation)
  584.     {
  585.         case ELEVATOR_DOORS_CLOSE:
  586.         {
  587.             if (elevatorData[elevatorid][E_ELEVATOR_DOORS_OPEN])
  588.             {
  589.                 foreach(Player, i)
  590.                 {
  591.                     if (IsPlayerInDynamicArea(i, elevatorData[elevatorid][E_ELEVATOR_NEARBY_AREA]))
  592.                     {
  593.                         PlayerPlaySound(i, 1019, elevatorCoordinates[elevatorid][0], elevatorCoordinates[elevatorid][1], elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1]);
  594.                         PlayerPlaySound(i, 1021, elevatorCoordinates[elevatorid][0], elevatorCoordinates[elevatorid][1], elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1]);
  595.                     }
  596.                 }
  597.                 MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_DOOR_1], elevatorCoordinates[elevatorid][0] - 0.759617, elevatorCoordinates[elevatorid][1] - 2.648524, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1] - 0.133423, elevatorMoveSpeeds[elevatorid][1]);
  598.                 MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_DOOR_2], elevatorCoordinates[elevatorid][0] + 0.761887, elevatorCoordinates[elevatorid][1] - 2.648524, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1] - 0.133423, elevatorMoveSpeeds[elevatorid][1]);
  599.                 elevatorData[elevatorid][E_ELEVATOR_DOORS_OPEN] = false;
  600.             }
  601.         }
  602.         case ELEVATOR_DOORS_OPEN:
  603.         {
  604.             if (!elevatorData[elevatorid][E_ELEVATOR_DOORS_OPEN])
  605.             {
  606.                 foreach(Player, i)
  607.                 {
  608.                     if (IsPlayerInDynamicArea(i, elevatorData[elevatorid][E_ELEVATOR_NEARBY_AREA]))
  609.                     {
  610.                         PlayerPlaySound(i, 1019, elevatorCoordinates[elevatorid][0], elevatorCoordinates[elevatorid][1], elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1]);
  611.                         PlayerPlaySound(i, 1021, elevatorCoordinates[elevatorid][0], elevatorCoordinates[elevatorid][1], elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1]);
  612.                     }
  613.                 }
  614.                 MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_DOOR_1], elevatorCoordinates[elevatorid][0] - 1.493775, elevatorCoordinates[elevatorid][1] - 2.648524, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1] - 0.133423, elevatorMoveSpeeds[elevatorid][0]);
  615.                 MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_DOOR_2], elevatorCoordinates[elevatorid][0] + 1.491865, elevatorCoordinates[elevatorid][1] - 2.648524, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1] - 0.133423, elevatorMoveSpeeds[elevatorid][0]);
  616.                 elevatorData[elevatorid][E_ELEVATOR_DOORS_OPEN] = true;
  617.             }
  618.         }
  619.     }
  620.     return 1;
  621. }
  622.  
  623. public Elevator_CheckForNearbyPlayers()
  624. {
  625.     for (new e; e < MAX_ELEVATORS; e++)
  626.     {
  627.         if (elevatorTypes[e] == ELEVATOR_TYPE_ENCLOSED && elevatorData[e][E_ELEVATOR_CONTROLLABLE] && !elevatorData[e][E_ELEVATOR_MOVING] && !elevatorData[e][E_ELEVATOR_MOVING_REQUESTED])
  628.         {
  629.             new bool:playerNearby = false;
  630.             foreach(Player, i)
  631.             {
  632.                 if (!playerNearby)
  633.                 {
  634.                     if (IsPlayerInDynamicArea(i, areaData[e][elevatorData[e][E_ELEVATOR_CURRENT_LEVEL] - 1][E_AREA_FRONT]))
  635.                     {
  636.                         playerNearby = true;
  637.                         break;
  638.                     }
  639.                 }
  640.             }
  641.             if (!playerNearby)
  642.             {
  643.                 Elevator_AdjustDoors(e, ELEVATOR_DOORS_CLOSE);
  644.             }
  645.             else
  646.             {
  647.                 Elevator_AdjustDoors(e, ELEVATOR_DOORS_OPEN);
  648.             }
  649.         }
  650.         if (elevatorData[e][E_ELEVATOR_MOVING])
  651.         {
  652.             foreach(Player, i)
  653.             {
  654.                 if (IsPlayerInDynamicArea(i, elevatorData[e][E_ELEVATOR_NEARBY_AREA]))
  655.                 {
  656.                     PlayerPlaySound(i, 1019, 0.0, 0.0, 0.0);
  657.                     PlayerPlaySound(i, 1020, 0.0, 0.0, 0.0);
  658.                     Streamer_Update(i);
  659.                 }
  660.             }
  661.         }
  662.     }
  663.     return 1;
  664. }
  665.  
  666. public Elevator_SetControllableStatus(elevatorid)
  667. {
  668.     elevatorData[elevatorid][E_ELEVATOR_CONTROLLABLE] = true;
  669.     foreach(Player, i)
  670.     {
  671.         if (IsPlayerInDynamicArea(i, elevatorData[elevatorid][E_ELEVATOR_NEARBY_AREA]))
  672.         {
  673.             PlayerPlaySound(i, 1019, elevatorCoordinates[elevatorid][0], elevatorCoordinates[elevatorid][1], elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1]);
  674.             PlayerPlaySound(i, 1022, elevatorCoordinates[elevatorid][0], elevatorCoordinates[elevatorid][1], elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1]);
  675.             Streamer_Update(i);
  676.         }
  677.     }
  678. }
  679.  
  680. public Elevator_SetLevel(elevatorid, level)
  681. {
  682.     elevatorData[elevatorid][E_ELEVATOR_NEW_LEVEL] = level;
  683.     if (elevatorAttachableObjects[elevatorid][0])
  684.     {
  685.         Elevator_SwapLights(elevatorid, ELEVATOR_LIGHTS_FLASHING);
  686.     }
  687.     if (elevatorData[elevatorid][E_ELEVATOR_NEW_LEVEL] > elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL])
  688.     {
  689.         elevatorData[elevatorid][E_ELEVATOR_CURRENT_LIFT_SPEED] = elevatorMoveSpeeds[elevatorid][2];
  690.     }
  691.     else
  692.     {
  693.         elevatorData[elevatorid][E_ELEVATOR_CURRENT_LIFT_SPEED] = elevatorMoveSpeeds[elevatorid][3];
  694.     }
  695.     MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_ELEVATOR], elevatorCoordinates[elevatorid][0], elevatorCoordinates[elevatorid][1], elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_NEW_LEVEL] - 1], elevatorData[elevatorid][E_ELEVATOR_CURRENT_LIFT_SPEED]);
  696.     switch (elevatorTypes[elevatorid])
  697.     {
  698.         case ELEVATOR_TYPE_ENCLOSED:
  699.         {
  700.             MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_DOOR_1], elevatorCoordinates[elevatorid][0] - 0.759617, elevatorCoordinates[elevatorid][1] - 2.648524, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_NEW_LEVEL] - 1] - 0.133423, elevatorData[elevatorid][E_ELEVATOR_CURRENT_LIFT_SPEED]);
  701.             MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_DOOR_2], elevatorCoordinates[elevatorid][0] + 0.761887, elevatorCoordinates[elevatorid][1] - 2.648524, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_NEW_LEVEL] - 1] - 0.133423, elevatorData[elevatorid][E_ELEVATOR_CURRENT_LIFT_SPEED]);
  702.         }
  703.         case ELEVATOR_TYPE_PLATFORM:
  704.         {
  705.             MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_GUARD_RAIL_1], elevatorCoordinates[elevatorid][0] - 3.138048, elevatorCoordinates[elevatorid][1] + 1.901557, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_NEW_LEVEL] - 1] + 0.094972, elevatorData[elevatorid][E_ELEVATOR_CURRENT_LIFT_SPEED]);
  706.             MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_GUARD_RAIL_2], elevatorCoordinates[elevatorid][0] - 3.200950, elevatorCoordinates[elevatorid][1] + 1.640503, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_NEW_LEVEL] - 1] + 0.094972, elevatorData[elevatorid][E_ELEVATOR_CURRENT_LIFT_SPEED]);
  707.             MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_GUARD_RAIL_3], elevatorCoordinates[elevatorid][0] + 3.200950, elevatorCoordinates[elevatorid][1] + 1.640503, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_NEW_LEVEL] - 1] + 0.094972, elevatorData[elevatorid][E_ELEVATOR_CURRENT_LIFT_SPEED]);
  708.         }
  709.     }
  710.     switch (elevatorTypes[elevatorid])
  711.     {
  712.         case ELEVATOR_TYPE_ENCLOSED:
  713.         {
  714.             if (elevatorAttachableObjects[elevatorid][0])
  715.             {
  716.                 MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_1], elevatorCoordinates[elevatorid][0], elevatorCoordinates[elevatorid][1], elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_NEW_LEVEL] - 1] + 1.863229, elevatorData[elevatorid][E_ELEVATOR_CURRENT_LIFT_SPEED]);
  717.             }
  718.             if (elevatorAttachableObjects[elevatorid][1])
  719.             {
  720.                 MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_SUPPORT], elevatorCoordinates[elevatorid][0], elevatorCoordinates[elevatorid][1], elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_NEW_LEVEL] - 1] - 33.785002, elevatorData[elevatorid][E_ELEVATOR_CURRENT_LIFT_SPEED]);
  721.             }
  722.         }
  723.         case ELEVATOR_TYPE_PLATFORM:
  724.         {
  725.             MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_1], elevatorCoordinates[elevatorid][0] + 3.060504, elevatorCoordinates[elevatorid][1] - 1.684815, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_NEW_LEVEL] - 1] + 0.561335, elevatorData[elevatorid][E_ELEVATOR_CURRENT_LIFT_SPEED]);
  726.             MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_2], elevatorCoordinates[elevatorid][0] + 3.060504, elevatorCoordinates[elevatorid][1] + 1.684815, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_NEW_LEVEL] - 1] + 0.561335, elevatorData[elevatorid][E_ELEVATOR_CURRENT_LIFT_SPEED]);
  727.             MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_3], elevatorCoordinates[elevatorid][0] - 3.060504, elevatorCoordinates[elevatorid][1] + 1.684815, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_NEW_LEVEL] - 1] + 0.561335, elevatorData[elevatorid][E_ELEVATOR_CURRENT_LIFT_SPEED]);
  728.             MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_4], elevatorCoordinates[elevatorid][0] - 3.060504, elevatorCoordinates[elevatorid][1] - 1.684815, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_NEW_LEVEL] - 1] + 0.561335, elevatorData[elevatorid][E_ELEVATOR_CURRENT_LIFT_SPEED]);
  729.             if (elevatorAttachableObjects[elevatorid][1])
  730.             {
  731.                 MoveDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_SUPPORT], elevatorCoordinates[elevatorid][0], elevatorCoordinates[elevatorid][1], elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_NEW_LEVEL] - 1] - 32.555002, elevatorData[elevatorid][E_ELEVATOR_CURRENT_LIFT_SPEED]);
  732.             }
  733.         }
  734.     }
  735.     foreach(Player, i)
  736.     {
  737.         if (IsPlayerInDynamicArea(i, elevatorData[elevatorid][E_ELEVATOR_NEARBY_AREA]))
  738.         {
  739.             PlayerPlaySound(i, 1019, 0.0, 0.0, 0.0);
  740.             PlayerPlaySound(i, 1020, 0.0, 0.0, 0.0);
  741.             Streamer_Update(i);
  742.         }
  743.     }
  744.     elevatorData[elevatorid][E_ELEVATOR_MOVING] = true;
  745.     elevatorData[elevatorid][E_ELEVATOR_MOVING_REQUESTED] = false;
  746.     return 1;
  747. }
  748.  
  749. public Elevator_ShowMenuForPlayer(elevatorid, playerid)
  750. {
  751.     new floorNameString[1024];
  752.     for (new l; l < MAX_LEVELS; l++)
  753.     {
  754.         if (!floorNames[elevatorid][l][0])
  755.         {
  756.             continue;
  757.         }
  758.         strcat(floorNameString, floorNames[elevatorid][l]);
  759.         strcat(floorNameString, "\n");
  760.     }
  761.     ShowPlayerDialog(playerid, ELEVATOR_FLOOR_SELECTION_DIALOG_ID, DIALOG_STYLE_LIST, "Elevator", floorNameString, "Accept", "Cancel");
  762. }
  763.  
  764. Elevator_SwapLights(elevatorid, type)
  765. {
  766.     switch (elevatorTypes[elevatorid])
  767.     {
  768.         case ELEVATOR_TYPE_ENCLOSED:
  769.         {
  770.             DestroyDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_1]);
  771.             switch (type)
  772.             {
  773.                 case ELEVATOR_LIGHTS_CONSTANT:
  774.                 {
  775.                     movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_1] = CreateDynamicObject(19121, elevatorCoordinates[elevatorid][0], elevatorCoordinates[elevatorid][1], elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1] + 1.863229, 0.0, 0.0, 0.0);
  776.                 }
  777.                 case ELEVATOR_LIGHTS_FLASHING:
  778.                 {
  779.                     movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_1] = CreateDynamicObject(3666, elevatorCoordinates[elevatorid][0], elevatorCoordinates[elevatorid][1], elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1] + 1.863229, 0.0, 0.0, 0.0);
  780.                 }
  781.             }
  782.         }
  783.         case ELEVATOR_TYPE_PLATFORM:
  784.         {
  785.             DestroyDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_1]);
  786.             DestroyDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_2]);
  787.             DestroyDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_3]);
  788.             DestroyDynamicObject(movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_4]);
  789.             switch (type)
  790.             {
  791.                 case ELEVATOR_LIGHTS_CONSTANT:
  792.                 {
  793.                     movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_1] = CreateDynamicObject(19121, elevatorCoordinates[elevatorid][0] + 3.060504, elevatorCoordinates[elevatorid][1] - 1.684815, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1] + 0.561335, 0.0, 0.0, 0.0);
  794.                     movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_2] = CreateDynamicObject(19121, elevatorCoordinates[elevatorid][0] + 3.060504, elevatorCoordinates[elevatorid][1] + 1.684815, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1] + 0.561335, 0.0, 0.0, 0.0);
  795.                     movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_3] = CreateDynamicObject(19121, elevatorCoordinates[elevatorid][0] - 3.060504, elevatorCoordinates[elevatorid][1] + 1.684815, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1] + 0.561335, 0.0, 0.0, 0.0);
  796.                     movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_4] = CreateDynamicObject(19121, elevatorCoordinates[elevatorid][0] - 3.060504, elevatorCoordinates[elevatorid][1] - 1.684815, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1] + 0.561335, 0.0, 0.0, 0.0);
  797.                 }
  798.                 case ELEVATOR_LIGHTS_FLASHING:
  799.                 {
  800.                     movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_1] = CreateDynamicObject(3666, elevatorCoordinates[elevatorid][0] + 3.060504, elevatorCoordinates[elevatorid][1] - 1.684815, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1] + 0.561335, 0.0, 0.0, 0.0);
  801.                     movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_2] = CreateDynamicObject(3666, elevatorCoordinates[elevatorid][0] + 3.060504, elevatorCoordinates[elevatorid][1] + 1.684815, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1] + 0.561335, 0.0, 0.0, 0.0);
  802.                     movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_3] = CreateDynamicObject(3666, elevatorCoordinates[elevatorid][0] - 3.060504, elevatorCoordinates[elevatorid][1] + 1.684815, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1] + 0.561335, 0.0, 0.0, 0.0);
  803.                     movingObjectData[elevatorid][E_MOVING_OBJECT_LIGHT_4] = CreateDynamicObject(3666, elevatorCoordinates[elevatorid][0] - 3.060504, elevatorCoordinates[elevatorid][1] - 1.684815, elevatorLevels[elevatorid][elevatorData[elevatorid][E_ELEVATOR_CURRENT_LEVEL] - 1] + 0.561335, 0.0, 0.0, 0.0);
  804.                 }
  805.             }
  806.         }
  807.     }
  808.     return 1;
  809. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement