Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Example elevator system for the new LS building.
- *
- * ProDude 2016
- *
- * 26/08/2011: Kye: added a sound effect for the elevator starting/stopping.
- */
- // Warning: This script uses a total of 45 objects, 22 3D Text Labels and 1 dialog.
- #include <a_samp>
- #include "../include/gl_common.inc" // for PlaySoundForPlayersInRange()
- #define ELEVATOR_SPEED (5.0) // Movement speed of the elevator.
- #define DOORS_SPEED (5.0) // Movement speed of the doors.
- #define ELEVATOR_WAIT_TIME (5000) // Time in ms that the elevator will wait in each floor before continuing with the queue.
- // Be sure to give enough time for doors to open.
- #define DIALOG_ID (874)
- // Private:
- #define X_DOOR_CLOSED (1786.627685)
- #define X_DOOR_R_OPENED (1785.027685)
- #define X_DOOR_L_OPENED (1788.227685)
- #define GROUND_Z_COORD (14.511476)
- #define ELEVATOR_OFFSET (0.059523)
- /* ------------------
- // Constants:
- -------------------*/
- static FloorNames[21][] =
- {
- "Ground Floor",
- "First Floor",
- "Second Floor",
- "Third Floor",
- "Fourth Floor",
- "Fifth Floor",
- "Sixth Floor",
- "Seventh Floor",
- "Eighth Floor",
- "Ninth Floor",
- "Tenth Floor",
- "Eleventh Floor",
- "Twelfth Floor",
- "Thirteenth Floor",
- "Fourteenth Floor",
- "Fifteenth Floor",
- "Sixteenth Floor",
- "Seventeenth Floor",
- "Eighteenth Floor",
- "Nineteenth Floor",
- "Penthouse"
- };
- static Float:FloorZOffsets[21] =
- {
- 0.0, // 0.0,
- 8.5479, // 8.5479,
- 13.99945, // 8.5479 + (5.45155 * 1.0),
- 19.45100, // 8.5479 + (5.45155 * 2.0),
- 24.90255, // 8.5479 + (5.45155 * 3.0),
- 30.35410, // 8.5479 + (5.45155 * 4.0),
- 35.80565, // 8.5479 + (5.45155 * 5.0),
- 41.25720, // 8.5479 + (5.45155 * 6.0),
- 46.70875, // 8.5479 + (5.45155 * 7.0),
- 52.16030, // 8.5479 + (5.45155 * 8.0),
- 57.61185, // 8.5479 + (5.45155 * 9.0),
- 63.06340, // 8.5479 + (5.45155 * 10.0),
- 68.51495, // 8.5479 + (5.45155 * 11.0),
- 73.96650, // 8.5479 + (5.45155 * 12.0),
- 79.41805, // 8.5479 + (5.45155 * 13.0),
- 84.86960, // 8.5479 + (5.45155 * 14.0),
- 90.32115, // 8.5479 + (5.45155 * 15.0),
- 95.77270, // 8.5479 + (5.45155 * 16.0),
- 101.22425, // 8.5479 + (5.45155 * 17.0),
- 106.67580, // 8.5479 + (5.45155 * 18.0),
- 112.12735 // 8.5479 + (5.45155 * 19.0)
- };
- /* ------------------
- // Variables:
- -------------------*/
- new Obj_Elevator, Obj_ElevatorDoors[2],
- Obj_FloorDoors[21][2];
- new Text3D:Label_Elevator, Text3D:Label_Floors[21];
- #define ELEVATOR_STATE_IDLE (0)
- #define ELEVATOR_STATE_WAITING (1)
- #define ELEVATOR_STATE_MOVING (2)
- new ElevatorState,
- ElevatorFloor; // If Idle or Waiting, this is the current floor. If Moving, the floor it's moving to.
- #define INVALID_FLOOR (-1)
- new ElevatorQueue[21], // Floors in queue.
- FloorRequestedBy[21]; // FloorRequestedBy[floor_id] = playerid; - Points out who requested which floor.
- new ElevatorBoostTimer; // Timer that makes the elevator move faster after players start surfing the object.
- /* ------------------
- * Function forwards:
- -------------------*/
- // Public:
- forward CallElevator(playerid, floorid); // You can use INVALID_PLAYER_ID too.
- forward ShowElevatorDialog(playerid);
- // Private:
- forward Elevator_Initialize();
- forward Elevator_Destroy();
- forward Elevator_OpenDoors();
- forward Elevator_CloseDoors();
- forward Floor_OpenDoors(floorid);
- forward Floor_CloseDoors(floorid);
- forward Elevator_MoveToFloor(floorid);
- forward Elevator_Boost(floorid); // Increases the elevator speed until it reaches 'floorid'.
- forward Elevator_TurnToIdle();
- forward ReadNextFloorInQueue();
- forward RemoveFirstQueueFloor();
- forward AddFloorToQueue(floorid);
- forward IsFloorInQueue(floorid);
- forward ResetElevatorQueue();
- forward DidPlayerRequestElevator(playerid);
- forward Float:GetElevatorZCoordForFloor(floorid);
- forward Float:GetDoorsZCoordForFloor(floorid);
- // ------------------------ Callbacks ------------------------
- public OnFilterScriptInit()
- {
- ResetElevatorQueue();
- Elevator_Initialize();
- return 1;
- }
- public OnFilterScriptExit()
- {
- Elevator_Destroy();
- return 1;
- }
- public OnObjectMoved(objectid)
- {
- new Float:x, Float:y, Float:z;
- for(new i; i < sizeof(Obj_FloorDoors); i ++)
- {
- if(objectid == Obj_FloorDoors[i][0])
- {
- GetObjectPos(Obj_FloorDoors[i][0], x, y, z);
- if(x < X_DOOR_L_OPENED - 0.5) // Some floor doors have shut, move the elevator to next floor in queue:
- {
- Elevator_MoveToFloor(ElevatorQueue[0]);
- RemoveFirstQueueFloor();
- }
- }
- }
- if(objectid == Obj_Elevator) // The elevator reached the specified floor.
- {
- KillTimer(ElevatorBoostTimer); // Kills the timer, in case the elevator reached the floor before boost.
- FloorRequestedBy[ElevatorFloor] = INVALID_PLAYER_ID;
- Elevator_OpenDoors();
- Floor_OpenDoors(ElevatorFloor);
- GetObjectPos(Obj_Elevator, x, y, z);
- Label_Elevator = Create3DTextLabel("{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to use elevator", 0xCCCCCCAA, 1784.9822, -1302.0426, z - 0.9, 4.0, 0, 1);
- ElevatorState = ELEVATOR_STATE_WAITING;
- SetTimer("Elevator_TurnToIdle", ELEVATOR_WAIT_TIME, 0);
- }
- return 1;
- }
- public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
- {
- if(dialogid == DIALOG_ID)
- {
- if(!response)
- return 0;
- if(FloorRequestedBy[listitem] != INVALID_PLAYER_ID || IsFloorInQueue(listitem))
- GameTextForPlayer(playerid, "~r~The floor is already in the queue", 3500, 4);
- else if(DidPlayerRequestElevator(playerid))
- GameTextForPlayer(playerid, "~r~You already requested the elevator", 3500, 4);
- else
- CallElevator(playerid, listitem);
- return 1;
- }
- return 0;
- }
- public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
- {
- if(!IsPlayerInAnyVehicle(playerid) && (newkeys & KEY_YES))
- {
- new Float:pos[3];
- GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
- if(pos[1] < -1301.4 && pos[1] > -1303.2417 && pos[0] < 1786.2131 && pos[0] > 1784.1555) // He is using the elevator button
- ShowElevatorDialog(playerid);
- else // Is he in a floor button?
- {
- if(pos[1] > -1301.4 && pos[1] < -1299.1447 && pos[0] < 1785.6147 && pos[0] > 1781.9902)
- {
- // He is most likely using it, check floor:
- new i=20;
- while(pos[2] < GetDoorsZCoordForFloor(i) + 3.5 && i > 0)
- i --;
- if(i == 0 && pos[2] < GetDoorsZCoordForFloor(0) + 2.0)
- i = -1;
- if(i <= 19)
- {
- CallElevator(playerid, i + 1);
- GameTextForPlayer(playerid, "~r~Elevator called", 3500, 4);
- }
- }
- }
- }
- return 1;
- }
- // ------------------------ Functions ------------------------
- stock Elevator_Initialize()
- {
- // Initializes the elevator.
- Obj_Elevator = CreateObject(18755, 1786.678100, -1303.459472, GROUND_Z_COORD + ELEVATOR_OFFSET, 0.000000, 0.000000, 270.000000);
- Obj_ElevatorDoors[0] = CreateObject(18757, X_DOOR_CLOSED, -1303.459472, GROUND_Z_COORD, 0.000000, 0.000000, 270.000000);
- Obj_ElevatorDoors[1] = CreateObject(18756, X_DOOR_CLOSED, -1303.459472, GROUND_Z_COORD, 0.000000, 0.000000, 270.000000);
- Label_Elevator = Create3DTextLabel("{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to use elevator", 0xCCCCCCAA, 1784.9822, -1302.0426, 13.6491, 4.0, 0, 1);
- new string[128],
- Float:z;
- for(new i; i < sizeof(Obj_FloorDoors); i ++)
- {
- Obj_FloorDoors[i][0] = CreateObject(18757, X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(i), 0.000000, 0.000000, 270.000000);
- Obj_FloorDoors[i][1] = CreateObject(18756, X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(i), 0.000000, 0.000000, 270.000000);
- format(string, sizeof(string), "{CCCCCC}[%s]\n{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to call", FloorNames[i]);
- if(i == 0)
- z = 13.4713;
- else
- z = 13.4713 + 8.7396 + ((i-1) * 5.45155);
- Label_Floors[i] = Create3DTextLabel(string, 0xCCCCCCAA, 1783.9799, -1300.7660, z, 10.5, 0, 1);
- // Label_Elevator, Text3D:Label_Floors[21];
- }
- // Open ground floor doors:
- Floor_OpenDoors(0);
- Elevator_OpenDoors();
- return 1;
- }
- stock Elevator_Destroy()
- {
- // Destroys the elevator.
- DestroyObject(Obj_Elevator);
- DestroyObject(Obj_ElevatorDoors[0]);
- DestroyObject(Obj_ElevatorDoors[1]);
- Delete3DTextLabel(Label_Elevator);
- for(new i; i < sizeof(Obj_FloorDoors); i ++)
- {
- DestroyObject(Obj_FloorDoors[i][0]);
- DestroyObject(Obj_FloorDoors[i][1]);
- Delete3DTextLabel(Label_Floors[i]);
- }
- return 1;
- }
- stock Elevator_OpenDoors()
- {
- // Opens the elevator's doors.
- new Float:x, Float:y, Float:z;
- GetObjectPos(Obj_ElevatorDoors[0], x, y, z);
- MoveObject(Obj_ElevatorDoors[0], X_DOOR_L_OPENED, y, z, DOORS_SPEED);
- MoveObject(Obj_ElevatorDoors[1], X_DOOR_R_OPENED, y, z, DOORS_SPEED);
- return 1;
- }
- stock Elevator_CloseDoors()
- {
- // Closes the elevator's doors.
- if(ElevatorState == ELEVATOR_STATE_MOVING)
- return 0;
- new Float:x, Float:y, Float:z;
- GetObjectPos(Obj_ElevatorDoors[0], x, y, z);
- MoveObject(Obj_ElevatorDoors[0], X_DOOR_CLOSED, y, z, DOORS_SPEED);
- MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSED, y, z, DOORS_SPEED);
- return 1;
- }
- stock Floor_OpenDoors(floorid)
- {
- // Opens the doors at the specified floor.
- MoveObject(Obj_FloorDoors[floorid][0], X_DOOR_L_OPENED, -1303.171142, GetDoorsZCoordForFloor(floorid), DOORS_SPEED);
- MoveObject(Obj_FloorDoors[floorid][1], X_DOOR_R_OPENED, -1303.171142, GetDoorsZCoordForFloor(floorid), DOORS_SPEED);
- PlaySoundForPlayersInRange(6401, 50.0, X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(floorid) + 5.0);
- return 1;
- }
- stock Floor_CloseDoors(floorid)
- {
- // Closes the doors at the specified floor.
- MoveObject(Obj_FloorDoors[floorid][0], X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(floorid), DOORS_SPEED);
- MoveObject(Obj_FloorDoors[floorid][1], X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(floorid), DOORS_SPEED);
- PlaySoundForPlayersInRange(6401, 50.0, X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(floorid) + 5.0);
- return 1;
- }
- stock Elevator_MoveToFloor(floorid)
- {
- // Moves the elevator to specified floor (doors are meant to be already closed).
- ElevatorState = ELEVATOR_STATE_MOVING;
- ElevatorFloor = floorid;
- // Move the elevator slowly, to give time to clients to sync the object surfing. Then, boost it up:
- MoveObject(Obj_Elevator, 1786.678100, -1303.459472, GetElevatorZCoordForFloor(floorid), 0.25);
- MoveObject(Obj_ElevatorDoors[0], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), 0.25);
- MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), 0.25);
- Delete3DTextLabel(Label_Elevator);
- ElevatorBoostTimer = SetTimerEx("Elevator_Boost", 2000, 0, "i", floorid);
- return 1;
- }
- public Elevator_Boost(floorid)
- {
- // Increases the elevator's speed until it reaches 'floorid'
- StopObject(Obj_Elevator);
- StopObject(Obj_ElevatorDoors[0]);
- StopObject(Obj_ElevatorDoors[1]);
- MoveObject(Obj_Elevator, 1786.678100, -1303.459472, GetElevatorZCoordForFloor(floorid), ELEVATOR_SPEED);
- MoveObject(Obj_ElevatorDoors[0], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), ELEVATOR_SPEED);
- MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), ELEVATOR_SPEED);
- return 1;
- }
- public Elevator_TurnToIdle()
- {
- ElevatorState = ELEVATOR_STATE_IDLE;
- ReadNextFloorInQueue();
- return 1;
- }
- stock RemoveFirstQueueFloor()
- {
- // Removes the data in ElevatorQueue[0], and reorders the queue accordingly.
- for(new i; i < sizeof(ElevatorQueue) - 1; i ++)
- ElevatorQueue[i] = ElevatorQueue[i + 1];
- ElevatorQueue[sizeof(ElevatorQueue) - 1] = INVALID_FLOOR;
- return 1;
- }
- stock AddFloorToQueue(floorid)
- {
- // Adds 'floorid' at the end of the queue.
- // Scan for the first empty space:
- new slot = -1;
- for(new i; i < sizeof(ElevatorQueue); i ++)
- {
- if(ElevatorQueue[i] == INVALID_FLOOR)
- {
- slot = i;
- break;
- }
- }
- if(slot != -1)
- {
- ElevatorQueue[slot] = floorid;
- // If needed, move the elevator.
- if(ElevatorState == ELEVATOR_STATE_IDLE)
- ReadNextFloorInQueue();
- return 1;
- }
- return 0;
- }
- stock ResetElevatorQueue()
- {
- // Resets the queue.
- for(new i; i < sizeof(ElevatorQueue); i ++)
- {
- ElevatorQueue[i] = INVALID_FLOOR;
- FloorRequestedBy[i] = INVALID_PLAYER_ID;
- }
- return 1;
- }
- stock IsFloorInQueue(floorid)
- {
- // Checks if the specified floor is currently part of the queue.
- for(new i; i < sizeof(ElevatorQueue); i ++)
- if(ElevatorQueue[i] == floorid)
- return 1;
- return 0;
- }
- stock ReadNextFloorInQueue()
- {
- // Reads the next floor in the queue, closes doors, and goes to it.
- if(ElevatorState != ELEVATOR_STATE_IDLE || ElevatorQueue[0] == INVALID_FLOOR)
- return 0;
- Elevator_CloseDoors();
- Floor_CloseDoors(ElevatorFloor);
- return 1;
- }
- stock DidPlayerRequestElevator(playerid)
- {
- for(new i; i < sizeof(FloorRequestedBy); i ++)
- if(FloorRequestedBy[i] == playerid)
- return 1;
- return 0;
- }
- stock ShowElevatorDialog(playerid)
- {
- new string[512];
- for(new i; i < sizeof(ElevatorQueue); i ++)
- {
- if(FloorRequestedBy[i] != INVALID_PLAYER_ID)
- strcat(string, "{FF0000}");
- strcat(string, FloorNames[i]);
- strcat(string, "\n");
- }
- ShowPlayerDialog(playerid, DIALOG_ID, DIALOG_STYLE_LIST, "Elevator", string, "Accept", "Cancel");
- return 1;
- }
- stock CallElevator(playerid, floorid)
- {
- // Calls the elevator (also used with the elevator dialog).
- if(FloorRequestedBy[floorid] != INVALID_PLAYER_ID || IsFloorInQueue(floorid))
- return 0;
- FloorRequestedBy[floorid] = playerid;
- AddFloorToQueue(floorid);
- return 1;
- }
- stock Float:GetElevatorZCoordForFloor(floorid)
- return (GROUND_Z_COORD + FloorZOffsets[floorid] + ELEVATOR_OFFSET); // A small offset for the elevator object itself.
- stock Float:GetDoorsZCoordForFloor(floorid)
- return (GROUND_Z_COORD + FloorZOffsets[floorid]);
Add Comment
Please, Sign In to add comment