Skip to content

Instantly share code, notes, and snippets.

@TheDutchDev
Last active August 30, 2015 16:50
Show Gist options
  • Save TheDutchDev/3434a5d7e70aa46d04a2 to your computer and use it in GitHub Desktop.
Save TheDutchDev/3434a5d7e70aa46d04a2 to your computer and use it in GitHub Desktop.
Beach Elevator
// By Niels Visbeek :: 30.08.2015
#include <a_samp>
#include <streamer>
#define ELEVATOR_SPEED (5.0)
#define DOORS_SPEED (5.0)
#define ELEVATOR_WAIT_TIME (5000)
#define DIALOG_ID (9100)
#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)
#define ELEVATOR_STATE_IDLE (0)
#define ELEVATOR_STATE_WAITING (1)
#define ELEVATOR_STATE_MOVING (2)
#define INVALID_FLOOR (-1)
new Obj_Elevator, Obj_ElevatorDoors[2], Obj_FloorDoors[14][2], ElevatorState, ElevatorFloor, ElevatorQueue[14];
forward CallElevator( floorid );
forward ShowElevatorDialog( playerid );
forward Float:getFloorZOffsets( floorid );
forward Elevator_TurnToIdle( );
public OnFilterScriptInit()
{
print("\n");
print(" |---------------------------------------------------");
print(" | LS Beachside Elevator Loaded!");
print(" |---------------------------------------------------");
for(new i; i < sizeof(ElevatorQueue); i ++)
{
ElevatorQueue[i] = INVALID_FLOOR;
}
// Elevator and doors.
Obj_Elevator = CreateDynamicObject( 18755, X_ELEVATOR_POS, Y_ELEVATOR_POS, GROUND_Z_COORD, 0.000000, 0.000000, 80.000000, -1, -1, -1, 100.0, 100.0 );
Obj_ElevatorDoors[0] = CreateDynamicObject( 18757, X_ELEVATOR_POS, Y_ELEVATOR_POS, GROUND_Z_COORD, 0.000000, 0.000000, 80.000000, -1, -1, -1, 100.0, 100.0 );
Obj_ElevatorDoors[1] = CreateDynamicObject( 18756, X_ELEVATOR_POS, Y_ELEVATOR_POS, GROUND_Z_COORD, 0.000000, 0.000000, 80.000000, -1, -1, -1, 100.0, 100.0 );
// Creating floor doors
for( new i; i < sizeof( Obj_FloorDoors ); i++ )
{
Obj_FloorDoors[ i ][ 0 ] = CreateDynamicObject( 18757, X_ELEVATOR_POS, Y_ELEVATOR_POS - 0.245, getFloorZOffsets( i ) + 0.05, 0.000000, 0.000000, 80.000000, -1, -1, -1, 100.0, 100.0 );
Obj_FloorDoors[ i ][ 1 ] = CreateDynamicObject( 18756, X_ELEVATOR_POS, Y_ELEVATOR_POS - 0.245, getFloorZOffsets( i ) + 0.05, 0.000000, 0.000000, 80.000000, -1, -1, -1, 100.0, 100.0 );
}
return 1;
}
public OnFilterScriptExit()
{
DestroyDynamicObject( Obj_Elevator );
DestroyDynamicObject( Obj_ElevatorDoors[ 0 ] );
DestroyDynamicObject( Obj_ElevatorDoors[ 1 ] );
for( new i; i < sizeof( Obj_FloorDoors ); i++ )
{
DestroyDynamicObject( Obj_FloorDoors[ i ][ 0 ] );
DestroyDynamicObject( Obj_FloorDoors[ i ][ 1 ] );
}
print( " |-- LS BeachSide Building Elevator destroyed" );
return 1;
}
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 ] > ( 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 ) ) // inside elevator
return ShowElevatorDialog(playerid);
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))
{
new i = 13;
while( pos[ 2 ] < getFloorZOffsets( i ) + 3.5 && i > 0 )
i--;
if( i == 0 && pos[ 2 ] < getFloorZOffsets( 0 ) + 2.0 )
i = -1;
if( i <= 12 )
{
if( ElevatorState != ELEVATOR_STATE_MOVING && ( ElevatorFloor == i + 1 ) )
return 1;
CallElevator( i + 1 );
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);
return 1;
}
}
}
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if( dialogid == DIALOG_ID )
{
if( !response )
return 0;
if( IsFloorInQueue( listitem ) )
return 0;
CallElevator( listitem );
return 1;
}
return 0;
}
public OnDynamicObjectMoved( objectid )
{
new Float:x, Float:y, Float:z;
for( new i; i < sizeof( Obj_FloorDoors ); i++ )
{
if( objectid == Obj_FloorDoors[ i ][ 0 ] )
{
GetDynamicObjectPos( Obj_FloorDoors[ i ][ 0 ], x, y, z);
if ( y < Y_DOOR_L_OPENED - 0.5 )
{
moveElevator( ElevatorQueue[ 0 ] );
RemoveFirstQueueFloor( );
}
}
}
if( objectid == Obj_Elevator )
{
openElevator( ElevatorFloor );
ElevatorState = ELEVATOR_STATE_WAITING;
SetTimer("Elevator_TurnToIdle", ELEVATOR_WAIT_TIME, 0);
}
return 1;
}
public Elevator_TurnToIdle()
{
ElevatorState = ELEVATOR_STATE_IDLE;
ReadNextFloorInQueue();
return 1;
}
stock Float:getFloorZOffsets( floorid )
{
if( floorid < 2 )
return ( floorid == 0 ? GROUND_Z_COORD : ( GROUND_Z_COORD + 15.069729 ) );
return ( GROUND_Z_COORD + ( 29.130733 + ( ( floorid - 2 ) * 4.5 ) ) );
}
stock openElevator( floorid )
{
new Float:x, Float:y, Float:z;
GetDynamicObjectPos( Obj_ElevatorDoors[ 0 ], x, y, z );
MoveDynamicObject( Obj_ElevatorDoors[ 0 ], X_DOOR_L_OPENED, Y_DOOR_L_OPENED, z, DOORS_SPEED );
MoveDynamicObject( Obj_ElevatorDoors[ 1 ], X_DOOR_R_OPENED, Y_DOOR_R_OPENED, z, DOORS_SPEED );
MoveDynamicObject( Obj_FloorDoors[ floorid ][ 0 ], X_FDOOR_L_OPENED, Y_FDOOR_L_OPENED, getFloorZOffsets( floorid ) + 0.05, DOORS_SPEED );
MoveDynamicObject( Obj_FloorDoors[ floorid ][ 1 ], X_FDOOR_R_OPENED, Y_FDOOR_R_OPENED, getFloorZOffsets( floorid ) + 0.05, DOORS_SPEED );
}
stock moveElevator( floorid )
{
ElevatorState = ELEVATOR_STATE_MOVING;
ElevatorFloor = floorid;
MoveDynamicObject( Obj_Elevator, X_ELEVATOR_POS, Y_ELEVATOR_POS, getFloorZOffsets( floorid ), ELEVATOR_SPEED );
MoveDynamicObject( Obj_ElevatorDoors[ 0 ], X_ELEVATOR_POS, Y_ELEVATOR_POS, getFloorZOffsets( floorid ), ELEVATOR_SPEED );
MoveDynamicObject( Obj_ElevatorDoors[ 1 ], X_ELEVATOR_POS, Y_ELEVATOR_POS, getFloorZOffsets( floorid ), ELEVATOR_SPEED );
}
stock closeElevator( floorid )
{
new Float:x, Float:y, Float:z;
GetDynamicObjectPos( Obj_ElevatorDoors[ 0 ], x, y, z );
MoveDynamicObject( Obj_ElevatorDoors[ 0 ], X_ELEVATOR_POS, Y_ELEVATOR_POS, z, DOORS_SPEED );
MoveDynamicObject( Obj_ElevatorDoors[ 1 ], X_ELEVATOR_POS, Y_ELEVATOR_POS, z, DOORS_SPEED );
MoveDynamicObject( Obj_FloorDoors[ floorid ][ 0 ], X_ELEVATOR_POS, Y_ELEVATOR_POS - 0.245, getFloorZOffsets( floorid ) + 0.05, DOORS_SPEED );
MoveDynamicObject( Obj_FloorDoors[ floorid ][ 1 ], X_ELEVATOR_POS, Y_ELEVATOR_POS - 0.245, getFloorZOffsets( floorid ) + 0.05, DOORS_SPEED );
}
stock ShowElevatorDialog( playerid )
{
ShowPlayerDialog( playerid, DIALOG_ID, DIALOG_STYLE_LIST, "LS BeachSide Elevator", "Car Park\nGround Floor\nFirst Floor\nSecond Floor\nThird Floor\nFourth Floor\nFifth Floor\nSixth Floor\nSeventh Floor\nEighth Floor\nNinth Floor\nTenth Floor\nEleventh Floor\n{00FF00}B0$$ {FF0000}Penthouse", "Accept", "Cancel" );
return 1;
}
stock CallElevator( floorid )
{
if( IsFloorInQueue( floorid ) )
return 0;
AddFloorToQueue( floorid );
return 1;
}
stock IsFloorInQueue(floorid)
{
for( new i; i < sizeof( ElevatorQueue ); i++ )
if(ElevatorQueue[ i ] == floorid )
return 1;
return 0;
}
stock ReadNextFloorInQueue()
{
if( ElevatorState != ELEVATOR_STATE_IDLE || ElevatorQueue[ 0 ] == INVALID_FLOOR )
return 0;
closeElevator( ElevatorFloor );
return 1;
}
stock AddFloorToQueue(floorid)
{
for( new i; i < sizeof( ElevatorQueue ); i++ )
{
if( ElevatorQueue[ i ] == INVALID_FLOOR )
{
ElevatorQueue[ i ] = floorid;
if( ElevatorState == ELEVATOR_STATE_IDLE )
ReadNextFloorInQueue( );
break;
}
}
return 1;
}
stock RemoveFirstQueueFloor( )
{
for( new i; i < sizeof( ElevatorQueue ) - 1; i++ )
ElevatorQueue[ i ] = ElevatorQueue[ i + 1 ];
ElevatorQueue[ sizeof( ElevatorQueue ) - 1 ] = INVALID_FLOOR;
return 1;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment