Last active
August 30, 2015 16:50
-
-
Save TheDutchDev/3434a5d7e70aa46d04a2 to your computer and use it in GitHub Desktop.
Beach Elevator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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