[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


Messages In This Thread

Forum Jump:


Users browsing this thread: 1 Guest(s)