SAMP Gitlab CI Test
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

743 lines
23 KiB

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// Example Filterscript for the new LS BeachSide Building with Elevator
// --------------------------------------------------------------------
// Original elevator code by Zamaroht in 2010
//
// Updated by Kye in 2011
// * Added a sound effect for the elevator starting/stopping
//
// Edited by Matite in January 2015
// * Adapted the elevator code so it works in this new building and removed the
// light pole at the underground car park entrance
//
// Updated to v1.03 by Matite in April 2015
// * Removed the code that removes the existing building map object and the lines
// that create the new objects as the original building is now replaced with
// the new one by SAMP instead (same as the LS Office building)
//
// Updated to v1.02 by Matite in February 2015
// * Added code for the new car park object and edited the elevator to
// include the car park
//
// This script creates the new LS BeachSide building object, removes the
// existing GTASA building object, adds the new car park object and creates
// an elevator that can be used to travel between all levels.
//
// You can un-comment the OnPlayerCommandText callback below to enable a simple
// teleport command (/lsb) that teleports you to the LS BeachSide building.
//
// Warning...
// This script uses a total of:
// * 31 objects = 1 for the elevator, 2 for the elevator doors and 28 for the
// elevator floor doors
// * 15 3D Text Labels = 14 on the floors and 1 in the elevator
// * 1 dialog (for the elevator - dialog ID 877)
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// Includes
// --------
// SA-MP include
#include <a_samp>
// For PlaySoundForPlayersInRange()
#include "../include/gl_common.inc"
// -----------------------------------------------------------------------------
// Defines
// -------
// Movement speed of the elevator
#define ELEVATOR_SPEED (5.0)
// Movement speed of the doors
#define DOORS_SPEED (5.0)
// 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 ELEVATOR_WAIT_TIME (5000)
// Dialog ID for the LS BeachSide elevator dialog
#define DIALOG_ID (877)
// Position defines
#define X_DOOR_R_OPENED (289.542419)
#define X_DOOR_L_OPENED (286.342407)
#define Y_DOOR_R_OPENED (-1609.640991)
#define Y_DOOR_L_OPENED (-1609.076049)
#define X_FDOOR_R_OPENED (289.492431)
#define X_FDOOR_L_OPENED (286.292419)
#define Y_FDOOR_R_OPENED (-1609.870971)
#define Y_FDOOR_L_OPENED (-1609.306030)
#define GROUND_Z_COORD (18.755348) // (33.825077)
#define X_ELEVATOR_POS (287.942413)
#define Y_ELEVATOR_POS (-1609.341064)
// Elevator state defines
#define ELEVATOR_STATE_IDLE (0)
#define ELEVATOR_STATE_WAITING (1)
#define ELEVATOR_STATE_MOVING (2)
// Invalid floor define
#define INVALID_FLOOR (-1)
// Used for chat text messages
#define COLOR_MESSAGE_YELLOW 0xFFDD00AA
// -----------------------------------------------------------------------------
// Constants
// ---------
// Elevator floor names for the 3D text labels
static FloorNames[14][] =
{
"Car Park",
"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"
};
// Elevator floor Z heights
static Float:FloorZOffsets[14] =
{
0.0, // Car Park
15.069729, // Ground Floor
29.130733, // First Floor
33.630733, // Second Floor = 29.130733 + 4.5
38.130733, // Third Floor = 33.630733 + 4.5
42.630733, // Fourth Floor = 38.130733 + 4.5
47.130733, // Fifth Floor = 42.630733 + 4.5
51.630733, // Sixth Floor = 47.130733 + 4.5
56.130733, // Seventh Floor = 51.630733 + 4.5
60.630733, // Eighth Floor = 56.130733 + 4.5
65.130733, // Ninth Floor = 60.630733 + 4.5
69.630733, // Tenth Floor = 65.130733 + 4.5
74.130733, // Eleventh Floor = 69.630733 + 4.5
78.630733, // Twelfth Floor = 74.130733 + 4.5
};
// -----------------------------------------------------------------------------
// Variables
// ---------
// Stores the created object numbers of the elevator, the elevator doors and
// the elevator floor doors so they can be destroyed when the filterscript
// is unloaded
new Obj_Elevator, Obj_ElevatorDoors[2], Obj_FloorDoors[14][2];
// Stores a reference to the 3D text labels used on each floor and inside the
// elevator itself so they can be detroyed when the filterscript is unloaded
new Text3D:Label_Elevator, Text3D:Label_Floors[14];
// Stores the current state of the elevator (ie ELEVATOR_STATE_IDLE,
// ELEVATOR_STATE_WAITING or ELEVATOR_STATE_MOVING)
new ElevatorState;
// Stores the current floor the elevator is on or heading to... if the value is
// ELEVATOR_STATE_IDLE or ELEVATOR_STATE_WAITING this is the current floor. If
// the value is ELEVATOR_STATE_MOVING then it is the floor it's moving to
new ElevatorFloor;
// Stores the elevator queue for each floor
new ElevatorQueue[14];
// Stores who requested the floor for the elevator queue...
// FloorRequestedBy[floor_id] = playerid; (stores who requested which floor)
new FloorRequestedBy[14];
// Used for a timer that makes the elevator move faster after players start
// surfing the object
new ElevatorBoostTimer;
// -----------------------------------------------------------------------------
// 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
// ---------
// Un-comment the OnPlayerCommandText callback below (remove the "/*" and the "*/")
// to enable a simple teleport command (/lsb) which teleports the player to
// outside the LS BeachSide building.
/*
public OnPlayerCommandText(playerid, cmdtext[])
{
// Check command text
if (strcmp("/lsb", cmdtext, true, 4) == 0)
{
// Set the interior
SetPlayerInterior(playerid, 0);
// Set player position and facing angle
SetPlayerPos(playerid, 289.81 + random(2), -1630.65 + random(2), 34.32);
SetPlayerFacingAngle(playerid, 10);
// Fix camera position after teleporting
SetCameraBehindPlayer(playerid);
// Send a gametext message to the player
GameTextForPlayer(playerid, "~b~~h~LS BeachSide!", 3000, 3);
// Exit here
return 1;
}
// Exit here (return 0 as the command was not handled in this filterscript)
return 0;
}
*/
public OnFilterScriptInit()
{
// Display information in the Server Console
print("\n");
print(" |---------------------------------------------------");
print(" |--- LS BeachSide Filterscript");
print(" |-- Script v1.03");
print(" |-- 19th April 2015");
print(" |---------------------------------------------------");
// Reset the elevator queue
ResetElevatorQueue();
// Create the elevator object, the elevator doors and the floor doors
Elevator_Initialize();
// Display information in the Server Console
print(" |-- LS BeachSide Building Elevator created");
print(" |---------------------------------------------------");
// Loop
for (new i = 0; i < MAX_PLAYERS; i++)
{
// Check if the player is connected and not a NPC
if (IsPlayerConnected(i) && !IsPlayerNPC(i))
{
// Remove the lamp post at the underground car park entrance
RemoveBuildingForPlayer(i, 1226, 265.481, -1581.1, 32.9311, 5.0);
// Remove the night lights object (must be removed to also remove any
// occulsion zones inside the building)
RemoveBuildingForPlayer(i, 6518, 280.297, -1606.2, 72.3984, 250.0);
}
}
// Exit here
return 1;
}
public OnFilterScriptExit()
{
// Destroy the elevator, the elevator doors and the elevator floor doors
Elevator_Destroy();
// Display information in the Server Console
print(" |-- LS BeachSide Building Elevator destroyed");
print(" |---------------------------------------------------");
// Exit here
return 1;
}
public OnPlayerConnect(playerid)
{
// Remove the lamp post at the underground car park entrance
RemoveBuildingForPlayer(playerid, 1226, 265.481, -1581.1, 32.9311, 5.0);
// Remove the night lights object (must be removed to also remove any
// occulsion zones inside the building)
RemoveBuildingForPlayer(playerid, 6518, 280.297, -1606.2, 72.3984, 250.0);
// Exit here (return 1 so this callback is processed in other scripts)
return 1;
}
public OnObjectMoved(objectid)
{
// Create variables
new Float:x, Float:y, Float:z;
// Loop
for(new i; i < sizeof(Obj_FloorDoors); i ++)
{
// Check if the object that moved was one of the elevator floor doors
if(objectid == Obj_FloorDoors[i][0])
{
GetObjectPos(Obj_FloorDoors[i][0], x, y, z);
// Some floor doors have shut, move the elevator to next floor in queue:
if (y < Y_DOOR_L_OPENED - 0.5)
{
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, X_ELEVATOR_POS + 1.6, Y_ELEVATOR_POS - 1.85, z - 0.4, 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)
{
// Check if the player is not in a vehicle and pressed the conversation yes key (Y by default)
if (!IsPlayerInAnyVehicle(playerid) && (newkeys & KEY_YES))
{
// Create variables and get the players current position
new Float:pos[3];
GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
// For debug
//printf("X = %0.2f | Y = %0.2f | Z = %0.2f", pos[0], pos[1], pos[2]);
// Check if the player is using the button inside the elevator
if (pos[1] > (Y_ELEVATOR_POS - 1.8) && pos[1] < (Y_ELEVATOR_POS + 1.8) && pos[0] < (X_ELEVATOR_POS + 1.8) && pos[0] > (X_ELEVATOR_POS - 1.8))
{
// The player is using the button inside the elevator
// --------------------------------------------------
// Show the elevator dialog to the player
ShowElevatorDialog(playerid);
}
else
{
// Check if the player is using the button on one of the floors
if(pos[1] < (Y_ELEVATOR_POS - 1.81) && pos[1] > (Y_ELEVATOR_POS - 3.8) && pos[0] > (X_ELEVATOR_POS + 1.21) && pos[0] < (X_ELEVATOR_POS + 3.8))
{
// The player is most likely using an elevator floor button... check which floor
// -----------------------------------------------------------------------------
// Create variable with the number of floors to check (total floors minus 1)
new i = 13;
// Loop
while(pos[2] < GetDoorsZCoordForFloor(i) + 3.5 && i > 0)
i --;
if(i == 0 && pos[2] < GetDoorsZCoordForFloor(0) + 2.0)
i = -1;
if (i <= 12)
{
// Check if the elevator is not moving (idle or waiting)
if (ElevatorState != ELEVATOR_STATE_MOVING)
{
// Check if the elevator is already on the floor it was called from
if (ElevatorFloor == i + 1)
{
// Display gametext message to the player
GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~n~~y~~h~LS BeachSide Elevator Is~n~~y~~h~Already On This Floor...~n~~w~Walk Inside It~n~~w~And Press '~k~~CONVERSATION_YES~'", 3500, 3);
// Display chat text message to the player
SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, "* The LS BeachSide elevator is already on this floor... walk inside it and press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}'");
// Exit here (return 1 so this callback is processed in other scripts)
return 1;
}
}
// Call function to call the elevator to the floor
CallElevator(playerid, i + 1);
// Display gametext message to the player
GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~n~~n~~g~~h~LS BeachSide Elevator~n~~g~~h~Has Been Called...~n~~w~Please Wait", 3000, 3);
// Create variable for formatted message
new strTempString[100];
// Check if the elevator is moving
if (ElevatorState == ELEVATOR_STATE_MOVING)
{
// Format chat text message
format(strTempString, sizeof(strTempString), "* The LS BeachSide elevator has been called... it is currently moving towards the %s.", FloorNames[ElevatorFloor]);
}
else
{
// Check if the floor is the car park
if (ElevatorFloor == 0)
{
// Format chat text message
format(strTempString, sizeof(strTempString), "* The LS BeachSide elevator has been called... it is currently at the %s.", FloorNames[ElevatorFloor]);
}
else
{
// Format chat text message
format(strTempString, sizeof(strTempString), "* The LS BeachSide elevator has been called... it is currently on the %s.", FloorNames[ElevatorFloor]);
}
}
// Display formatted chat text message to the player
SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, strTempString);
// Exit here (return 1 so this callback is processed in other scripts)
return 1;
}
}
}
}
// Exit here (return 1 so this callback is processed in other scripts)
return 1;
}
// ------------------------ Functions ------------------------
stock Elevator_Initialize()
{
// Create the elevator and elevator door objects
Obj_Elevator = CreateObject(18755, X_ELEVATOR_POS, Y_ELEVATOR_POS, GROUND_Z_COORD, 0.000000, 0.000000, 80.000000);
Obj_ElevatorDoors[0] = CreateObject(18757, X_ELEVATOR_POS, Y_ELEVATOR_POS, GROUND_Z_COORD, 0.000000, 0.000000, 80.000000);
Obj_ElevatorDoors[1] = CreateObject(18756, X_ELEVATOR_POS, Y_ELEVATOR_POS, GROUND_Z_COORD, 0.000000, 0.000000, 80.000000);
// Create the 3D text label for inside the elevator
Label_Elevator = Create3DTextLabel("{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to use elevator", 0xCCCCCCAA, X_ELEVATOR_POS + 1.6, Y_ELEVATOR_POS - 1.85, GROUND_Z_COORD - 0.4, 4.0, 0, 1);
// Create variables
new string[128], Float:z;
// Loop
for (new i; i < sizeof(Obj_FloorDoors); i ++)
{
// Create elevator floor door objects
Obj_FloorDoors[i][0] = CreateObject(18757, X_ELEVATOR_POS, Y_ELEVATOR_POS - 0.245, GetDoorsZCoordForFloor(i) + 0.05, 0.000000, 0.000000, 80.000000);
Obj_FloorDoors[i][1] = CreateObject(18756, X_ELEVATOR_POS, Y_ELEVATOR_POS - 0.245, GetDoorsZCoordForFloor(i) + 0.05, 0.000000, 0.000000, 80.000000);
// Format string for the floor 3D text label
format(string, sizeof(string), "{CCCCCC}[%s]\n{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to call", FloorNames[i]);
// Get label Z position
z = GetDoorsZCoordForFloor(i);
// Create floor label
Label_Floors[i] = Create3DTextLabel(string, 0xCCCCCCAA, X_ELEVATOR_POS + 2, Y_ELEVATOR_POS -3, z - 0.2, 10.5, 0, 1);
}
// Open the car park floor doors and the elevator doors
Floor_OpenDoors(0);
Elevator_OpenDoors();
// Exit here
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_DOOR_L_OPENED, z, DOORS_SPEED);
MoveObject(Obj_ElevatorDoors[1], X_DOOR_R_OPENED, Y_DOOR_R_OPENED, 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_ELEVATOR_POS, Y_ELEVATOR_POS, z, DOORS_SPEED);
MoveObject(Obj_ElevatorDoors[1], X_ELEVATOR_POS, Y_ELEVATOR_POS, z, DOORS_SPEED);
return 1;
}
stock Floor_OpenDoors(floorid)
{
// Opens the doors at the specified floor.
MoveObject(Obj_FloorDoors[floorid][0], X_FDOOR_L_OPENED, Y_FDOOR_L_OPENED, GetDoorsZCoordForFloor(floorid) + 0.05, DOORS_SPEED);
MoveObject(Obj_FloorDoors[floorid][1], X_FDOOR_R_OPENED, Y_FDOOR_R_OPENED, GetDoorsZCoordForFloor(floorid) + 0.05, DOORS_SPEED);
PlaySoundForPlayersInRange(6401, 50.0, X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid) + 5.0);
return 1;
}
stock Floor_CloseDoors(floorid)
{
// Closes the doors at the specified floor.
MoveObject(Obj_FloorDoors[floorid][0], X_ELEVATOR_POS, Y_ELEVATOR_POS - 0.245, GetDoorsZCoordForFloor(floorid) + 0.05, DOORS_SPEED);
MoveObject(Obj_FloorDoors[floorid][1], X_ELEVATOR_POS, Y_ELEVATOR_POS - 0.245, GetDoorsZCoordForFloor(floorid) + 0.05, DOORS_SPEED);
PlaySoundForPlayersInRange(6401, 50.0, X_ELEVATOR_POS, Y_ELEVATOR_POS, 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, X_ELEVATOR_POS, Y_ELEVATOR_POS, GetElevatorZCoordForFloor(floorid), 0.25);
MoveObject(Obj_ElevatorDoors[0], X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid), 0.25);
MoveObject(Obj_ElevatorDoors[1], X_ELEVATOR_POS, Y_ELEVATOR_POS, 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, X_ELEVATOR_POS, Y_ELEVATOR_POS, GetElevatorZCoordForFloor(floorid), ELEVATOR_SPEED);
MoveObject(Obj_ElevatorDoors[0], X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid), ELEVATOR_SPEED);
MoveObject(Obj_ElevatorDoors[1], X_ELEVATOR_POS, Y_ELEVATOR_POS, 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, "LS BeachSide 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 Z height value
return (GROUND_Z_COORD + FloorZOffsets[floorid]);
}
stock Float:GetDoorsZCoordForFloor(floorid)
{
// Return Z height value
return (GROUND_Z_COORD + FloorZOffsets[floorid]);
}