Suche diesen Fahrstuhl

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • is doch einfach zu machen oO Braucht man doch dafür kein FS


    Mit SetPlayerPos und ShowPlayerDIalog arbeiten das kann echt jeder oO

  • #define ELEVATOR_SPEED (5.0)
    #define DOORS_SPEED (4.0)
    #define ELEVATOR_WAIT_TIME (5000)
    #define ELEVATOR_OFFSET (0.059523)


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


    static FloorNames[21][] =
    {
    "Erdgeschoss",
    "Erster Stockwerk",
    "Zweiter Stockwerk",
    "Dritter Stockwerk",
    "Vierter Stockwerk",
    "Fünfter Stockwerk",
    "Sechster Stockwerk",
    "Siebter Stockwerk",
    "Achter Stockwerk",
    "Neunter Stockwerk",
    "Zehnter Stockwerk",
    "Elfter Stockwerk",
    "Zwölfter Stockwerk",
    "Dreizehnter Stockwerk",
    "Fierzehnter Stockwerk",
    "Fünftzehnter Stockwerk",
    "Sechszehnter Stockwerk",
    "Siebzehnter Stockwerk",
    "Achtzehnter Stockwerk",
    "Neunzehnter Stockwerk",
    "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)
    };
    forward Float:GetDistanceBetweenPlayers(p1,p2);
    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;
    #define INVALID_FLOOR (-1)
    new ElevatorQueue[21], FloorRequestedBy[21];
    new ElevatorBoostTimer;
    forward CallElevator(playerid, floorid); // You can use INVALID_PLAYER_ID too.
    forward ShowElevatorDialog(playerid);
    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);
    forward Float:GetDistanceBetweenPlayers(p1,p2);


    Function 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("Drücke 'F' um den Fahrstuhl zu benutzen", 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;
    }



    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~Aufzug gerufen", 3500, 4);
    }
    }
    }
    }


    OnGameModeInit ist das


    ResetElevatorQueue();
    Elevator_Initialize();



    Function OnGameModeExit()
    {
    Elevator_Destroy();
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    OnPlayerCarUpdate(i);
    PlayerUpdate(i);
    gPlayerLogged[i] = 0;
    DisablePlayerCheckpoint(i);
    }
    }
    for(new i = 0; i < AUTOHAUSER; i++)
    {
    DestroyPickup(Dtc_Info[i]);
    }
    for(new i; i < MAX_FLAMES; i++)
    {
    KillFire(i);
    }


    return 1;
    }


    if(dialogid == DIALOG_ID)
    {
    if(!response)
    return 0;


    if(FloorRequestedBy[listitem] != INVALID_PLAYER_ID || IsFloorInQueue(listitem))
    GameTextForPlayer(playerid, "~r~Du bist bereits an diesem Stockwerk", 3500, 4);
    else if(DidPlayerRequestElevator(playerid))
    GameTextForPlayer(playerid, "~r~Du hast bereits den Aufzug gerufen", 3500, 4);
    else
    CallElevator(playerid, listitem);


    return 1;
    }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("Drücke 'F' um den Fahrstuhl zu benutzen", 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\n Drücke 'F' um den Fahrstuhl zu rufen", 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;
    }


    Function 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;
    }


    Function 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, "Fahrstuhl", string, "Auswählen", "Zurück");


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

    youtube.com/user/LucarioGotABoner


    800Subs <3

  • very nice kopiert :):thumbup: :thumbup:


    Ich glaub lesen und klicken kann er selbst