[ajuda] Converte o Elevador de LS para 0.3d
#1

pawn Код:
#include <a_samp>

#define ELEVATOR_SPEED      (5.0)   // Movement speed of the elevator.
#define DOORS_SPEED         (4.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][] =
{
    "Entrada",
    "1є Andar",
    "2є Andar",
    "3є Andar",
    "4є Andar",
    "5є Andar",
    "6є Andar",
    "7є Andar",
    "8є Andar",
    "9є Andar",
    "10є Andar",
    "11є Andar",
    "12є Andar",
    "13є Andar",
    "14є Andar",
    "15є Andar",
    "16є Andar",
    "17є Andar",
    "18є Andar",
    "19є Andar",
    "Ultimo"
};

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("Aperte 'F' para ver o dialog", 0xFFFFDD, 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~O piso jб estб na fila", 3500, 4);
        else if(DidPlayerRequestElevator(playerid))
            GameTextForPlayer(playerid, "~r~Vocк jб pediu o elevador", 3500, 4);
        else
            CallElevator(playerid, listitem);

        return 1;
    }

    return 0;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if(!IsPlayerInAnyVehicle(playerid) && newkeys & KEY_SECONDARY_ATTACK)
    {
        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~Elevador Chamado", 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("Aperte 'F' para ver o dialog", 0xFFFFDD, 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), "%s\nAperte 'F' para Chamar o Elevador", FloorNames[i]);

        if(i == 0)
            z = 13.4713;
        else
            z = 13.4713 + 8.7396 + ((i-1) * 5.45155);

        Label_Floors[i]         = Create3DTextLabel(string, 0xFFFFDD, 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);

    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);

    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.5);
    MoveObject(Obj_ElevatorDoors[0], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), 0.5);
    MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), 0.5);
    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'

    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, "Elevador", string, "Aceitar", "Cancelar");

    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]);
Reply
#2

Nгo tem nada pra ser convertido aн ^o)
Reply
#3

quando ele vai apra cima e para baixo ele n vai reto vai xirando
saka
Reply
#4

Atualiza o Plugin ou Ageita as Coordenadas.
Reply
#5

Download da include: Clique aqui

Coloque estб include na pasta:
.../pawno/include/

E Compile todos os seus filterscript(s)/gamemode(s)!
Reply
#6

Deve ser alguma coordenada
Reply
#7

bug 0.3d igual a alguns portoes que abrem de lado ou girando pega um plugin atualizado !
Reply
#8

Arrumei para vocк :


pawn Код:
#include <a_samp>

#define ELEVATOR_SPEED      (5.0)   // Movement speed of the elevator.
#define DOORS_SPEED         (4.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][] =
{
    "Entrada",
    "1є Andar",
    "2є Andar",
    "3є Andar",
    "4є Andar",
    "5є Andar",
    "6є Andar",
    "7є Andar",
    "8є Andar",
    "9є Andar",
    "10є Andar",
    "11є Andar",
    "12є Andar",
    "13є Andar",
    "14є Andar",
    "15є Andar",
    "16є Andar",
    "17є Andar",
    "18є Andar",
    "19є Andar",
    "Ultimo"
};

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("Aperte 'F' para ver o dialog", 0xFFFFDD, 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~O piso jб estб na fila", 3500, 4);
        else if(DidPlayerRequestElevator(playerid))
            GameTextForPlayer(playerid, "~r~Vocк jб pediu o elevador", 3500, 4);
        else
            CallElevator(playerid, listitem);

        return 1;
    }

    return 0;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if(!IsPlayerInAnyVehicle(playerid) && newkeys & KEY_SECONDARY_ATTACK)
    {
        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~Elevador Chamado", 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("Aperte 'F' para ver o dialog", 0xFFFFDD, 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), "%s\nAperte 'F' para Chamar o Elevador", FloorNames[i]);

        if(i == 0)
            z = 13.4713;
        else
            z = 13.4713 + 8.7396 + ((i-1) * 5.45155);

        Label_Floors[i]         = Create3DTextLabel(string, 0xFFFFDD, 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, 0.000000, 0.000000, 270.000000);
    MoveObject(Obj_ElevatorDoors[1], X_DOOR_R_OPENED, y, z, DOORS_SPEED, 0.000000, 0.000000, 270.000000);

    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, 0.000000, 0.000000, 270.000000);
    MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSED, y, z, DOORS_SPEED, 0.000000, 0.000000, 270.000000);

    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, 0.000000, 0.000000, 270.000000);
    MoveObject(Obj_FloorDoors[floorid][1], X_DOOR_R_OPENED, -1303.171142, GetDoorsZCoordForFloor(floorid), DOORS_SPEED, 0.000000, 0.000000, 270.000000);

    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, 0.000000, 0.000000, 270.000000);
    MoveObject(Obj_FloorDoors[floorid][1], X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(floorid), DOORS_SPEED, 0.000000, 0.000000, 270.000000);

    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.5, 0.000000, 0.000000, 270.000000);
    MoveObject(Obj_ElevatorDoors[0], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), 0.5, 0.000000, 0.000000, 270.000000);
    MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), 0.5, 0.000000, 0.000000, 270.000000);
    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'

    MoveObject(Obj_Elevator, 1786.678100, -1303.459472, GetElevatorZCoordForFloor(floorid), ELEVATOR_SPEED, 0.000000, 0.000000, 270.000000);
    MoveObject(Obj_ElevatorDoors[0], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), ELEVATOR_SPEED, 0.000000, 0.000000, 270.000000);
    MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), ELEVATOR_SPEED, 0.000000, 0.000000, 270.000000);

    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, "Elevador", string, "Aceitar", "Cancelar");

    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]);


Espero ter ajudado .
Reply
#9

Quote:
Originally Posted by Guilherme_.
Посмотреть сообщение
bug 0.3d igual a alguns portoes que abrem de lado ou girando pega um plugin atualizado !
Nгo й bug do samp '-'
Reply
#10

For Very Easy:
EDIT
PHP код:
#include <a_samp>
#include <streamer>
#define ELEVATOR_SPEED      (5.0)   // Movement speed of the elevator.
#define DOORS_SPEED         (4.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][] =
{
    
"Entrada",
    
"1є Andar",
    
"2є Andar",
    
"3є Andar",
    
"4є Andar",
    
"5є Andar",
    
"6є Andar",
    
"7є Andar",
    
"8є Andar",
    
"9є Andar",
    
"10є Andar",
    
"11є Andar",
    
"12є Andar",
    
"13є Andar",
    
"14є Andar",
    
"15є Andar",
    
"16є Andar",
    
"17є Andar",
    
"18є Andar",
    
"19є Andar",
    
"Ultimo"
};
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_ElevatorObj_ElevatorDoors[2],
    
Obj_FloorDoors[21][2];
new 
Text3D:Label_ElevatorText3D: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(playeridfloorid);    // 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:xFloat:yFloat:z;
    for(new 
isizeof(Obj_FloorDoors); ++)
    {
        if(
objectid == Obj_FloorDoors[i][0])
        {
            
GetObjectPos(Obj_FloorDoors[i][0], xyz);
            if(
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_Elevatorxyz);
        
Label_Elevator  Create3DTextLabel("Aperte 'F' para ver o dialog"0xFFFFDD1784.9822, -1302.04260.94.001);
        
ElevatorState   ELEVATOR_STATE_WAITING;
        
SetTimer("Elevator_TurnToIdle"ELEVATOR_WAIT_TIME0);
    }
    return 
1;
}
public 
OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    if(
dialogid == DIALOG_ID)
    {
        if(!
response)
            return 
0;
        if(
FloorRequestedBy[listitem] != INVALID_PLAYER_ID || IsFloorInQueue(listitem))
            
GameTextForPlayer(playerid"~r~O piso jб estб na fila"35004);
        else if(
DidPlayerRequestElevator(playerid))
            
GameTextForPlayer(playerid"~r~Vocк jб pediu o elevador"35004);
        else
            
CallElevator(playeridlistitem);
        return 
1;
    }
    return 
0;
}
public 
OnPlayerKeyStateChange(playeridnewkeysoldkeys)
{
    if(!
IsPlayerInAnyVehicle(playerid) && newkeys KEY_SECONDARY_ATTACK)
    {
        new 
Float:pos[3];
        
GetPlayerPos(playeridpos[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 && 0)
                    
--;
                if(
== && pos[2] < GetDoorsZCoordForFloor(0) + 2.0)
                    
= -1;
                if(
<= 19)
                {
                    
CallElevator(playerid1);
                    
GameTextForPlayer(playerid"~r~Elevador Chamado"35004);
                }
            }
        }
    }
    return 
1;
}
// ------------------------ Functions ------------------------
stock Elevator_Initialize()
{
    
// Initializes the elevator.
    
Obj_Elevator            CreateObject(187551786.678100, -1303.459472GROUND_Z_COORD ELEVATOR_OFFSET0.0000000.000000270.000000);
    
Obj_ElevatorDoors[0]    = CreateObject(18757X_DOOR_CLOSED, -1303.459472GROUND_Z_COORD0.0000000.000000270.000000);
    
Obj_ElevatorDoors[1]    = CreateObject(18756X_DOOR_CLOSED, -1303.459472GROUND_Z_COORD0.0000000.000000270.000000);
    
Label_Elevator          Create3DTextLabel("Aperte 'F' para ver o dialog"0xFFFFDD1784.9822, -1302.042613.64914.001);
    new 
string[128],
        
Float:z;
    for(new 
isizeof(Obj_FloorDoors); ++)
    {
        
Obj_FloorDoors[i][0]    = CreateObject(18757X_DOOR_CLOSED, -1303.171142GetDoorsZCoordForFloor(i), 0.0000000.000000270.000000);
        
Obj_FloorDoors[i][1]    = CreateObject(18756X_DOOR_CLOSED, -1303.171142GetDoorsZCoordForFloor(i), 0.0000000.000000270.000000);
        
format(stringsizeof(string), "%s\nAperte 'F' para Chamar o Elevador"FloorNames[i]);
        if(
== 0)
            
13.4713;
        else
            
13.4713 8.7396 + ((i-1) * 5.45155);
        
Label_Floors[i]         = Create3DTextLabel(string0xFFFFDD1783.9799, -1300.7660z10.501);
        
// 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 
isizeof(Obj_FloorDoors); ++)
    {
        
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:xFloat:yFloat:z;
    
GetObjectPos(Obj_ElevatorDoors[0], xyz);
    
MoveObject(Obj_ElevatorDoors[0], X_DOOR_L_OPENEDyzDOORS_SPEED);
    
MoveObject(Obj_ElevatorDoors[1], X_DOOR_R_OPENEDyzDOORS_SPEED);
    return 
1;
}
stock Elevator_CloseDoors()
{
    
// Closes the elevator's doors.
    
if(ElevatorState == ELEVATOR_STATE_MOVING)
        return 
0;
    new 
Float:xFloat:yFloat:z;
    
GetObjectPos(Obj_ElevatorDoors[0], xyz);
    
MoveObject(Obj_ElevatorDoors[0], X_DOOR_CLOSEDyzDOORS_SPEED);
    
MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSEDyzDOORS_SPEED);
    return 
1;
}
stock Floor_OpenDoors(floorid)
{
    
// Opens the doors at the specified floor.
    
MoveObject(Obj_FloorDoors[floorid][0], X_DOOR_L_OPENED, -1303.171142GetDoorsZCoordForFloor(floorid), DOORS_SPEED);
    
MoveObject(Obj_FloorDoors[floorid][1], X_DOOR_R_OPENED, -1303.171142GetDoorsZCoordForFloor(floorid), DOORS_SPEED);
    return 
1;
}
stock Floor_CloseDoors(floorid)
{
    
// Closes the doors at the specified floor.
    
MoveObject(Obj_FloorDoors[floorid][0], X_DOOR_CLOSED, -1303.171142GetDoorsZCoordForFloor(floorid), DOORS_SPEED);
    
MoveObject(Obj_FloorDoors[floorid][1], X_DOOR_CLOSED, -1303.171142GetDoorsZCoordForFloor(floorid), DOORS_SPEED);
    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_Elevator1786.678100, -1303.459472GetElevatorZCoordForFloor(floorid), 0.5);
    
MoveObject(Obj_ElevatorDoors[0], X_DOOR_CLOSED, -1303.459472GetDoorsZCoordForFloor(floorid), 0.5);
    
MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSED, -1303.459472GetDoorsZCoordForFloor(floorid), 0.5);
    
Delete3DTextLabel(Label_Elevator);
    
ElevatorBoostTimer SetTimerEx("Elevator_Boost"20000"i"floorid);
    return 
1;
}
public 
Elevator_Boost(floorid)
{
    
// Increases the elevator's speed until it reaches 'floorid'
    
MoveObject(Obj_Elevator1786.678100, -1303.459472GetElevatorZCoordForFloor(floorid), ELEVATOR_SPEED);
    
MoveObject(Obj_ElevatorDoors[0], X_DOOR_CLOSED, -1303.459472GetDoorsZCoordForFloor(floorid), ELEVATOR_SPEED);
    
MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSED, -1303.459472GetDoorsZCoordForFloor(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 isizeof(ElevatorQueue) - 1++)
        
ElevatorQueue[i] = ElevatorQueue[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 
isizeof(ElevatorQueue); ++)
    {
        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 isizeof(ElevatorQueue); ++)
    {
        
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 isizeof(ElevatorQueue); ++)
        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 
isizeof(FloorRequestedBy); ++)
        if(
FloorRequestedBy[i] == playerid)
            return 
1;
    return 
0;
}
stock ShowElevatorDialog(playerid)
{
    new 
string[512];
    for(new 
isizeof(ElevatorQueue); ++)
    {
        if(
FloorRequestedBy[i] != INVALID_PLAYER_ID)
            
strcat(string"{FF0000}");
        
strcat(stringFloorNames[i]);
        
strcat(string"\n");
    }
    
ShowPlayerDialog(playeridDIALOG_IDDIALOG_STYLE_LIST"Elevador"string"Aceitar""Cancelar");
    return 
1;
}
stock CallElevator(playeridfloorid)
{
    
// 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]); 
Reply


Forum Jump:


Users browsing this thread: 4 Guest(s)