#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",
"Primeiro Andar",
"Segundo Andar",
"Terceiro Andar",
"Quarto Andar",
"Quinto Andar",
"Sexto Andar",
"Setimo Andar",
"Andar 8",
"Andar 9",
"Andar 10",
"Andar 11",
"Andar 12",
"Andar 13",
"Andar 14",
"Andar 15",
"Andar 16",
"Andar 17",
"Andar 18",
"Andar 19",
"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]);
Estou com um bug parecido, porйm o meu quando estou em um andar seja ele qual for, e vou chamar o elevador, ele fecha as portas e nгo abre mais...
|
Bom amigo, o meu bug eu consegui resolver, era apenas um erro nas coordenadas
|
Eu consegui arrumar meu bug e ainda dei uma ajustada...
Agora boa sorte pra ti mano... |
asduasdhuashduasd :/ olha amigo, bem que eu gostaria de lhe ajudar, porйm tem muitas coisas que sгo ъnicas do meu GM junto aos codes para funcionar tudo em conjunto...
Me desculpe mas eu nгo vou poder lhe ajudar, mas vou tentar arrumar o seu |
#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",
"Primeiro Andar",
"Segundo Andar",
"Terceiro Andar",
"Quarto Andar",
"Quinto Andar",
"Sexto Andar",
"Setimo Andar",
"Oitavo Andar",
"Nono Andar",
"Dйcimo Andar",
"Dйcimo Primeiro Andar",
"Dйcimo Segundo Andar",
"Dйcimo Terceiro Andar",
"Dйcimo Quarto Andar",
"Dйcimo Quinto Andar",
"Dйcimo Sexto Andar",
"Dйcimo Setimo Andar",
"Dйcimo Oitavo Andar",
"Dйcimo Nono 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(newkeys & KEY_YES)
{
SetPlayerPos(playerid, 1784.953857, -1298.523193, 13.375000);
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~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]);
Funcionando perfeitamente, testei em um GM que tenho apenas para criaзгo de FS's
Vou lhe dar uma dica, cria um novo projeto pelo "pawno", coloca esse cуdigo dentro e compila, use-o como FS para testar, ou em seu proprio servidor, ou em um daqueles GM's que vem com o pack do servidores do samp mesmo... caso funcione normalmente tente colocб-lo em seu GM, em caso de bug apуs colocar em seu GM, verifique nas Dialogs se nгo tem conflito de ID's... pawn Код:
|
Funcionando perfeitamente, testei em um GM que tenho apenas para criaзгo de FS's
Vou lhe dar uma dica, cria um novo projeto pelo "pawno", coloca esse cуdigo dentro e compila, use-o como FS para testar, ou em seu proprio servidor, ou em um daqueles GM's que vem com o pack do servidores do samp mesmo... caso funcione normalmente tente colocб-lo em seu GM, em caso de bug apуs colocar em seu GM, verifique nas Dialogs se nгo tem conflito de ID's... pawn Код:
|
n tenho skype vey, verifiquei os ids das dialogs do seu gm e a do elevador, pode haver conflito... pois eu testei aqui esta em perfeito estado
|
n tenho skype vey, verifiquei os ids das dialogs do seu gm e a do elevador, pode haver conflito... pois eu testei aqui esta em perfeito estado
|