18.05.2020, 23:14
(
Last edited by Locky_; 19/05/2020 at 10:56 PM.
Reason: Link do Github
)
Adicione Elevadores
Hб muito tempo nгo posto um lanзamento, mas, nos tempos livres... hб algumas coisas que vem em mente.
Basicamente, esta include adicione elevadores ao jogo.
- Mas Locky, nгo hб o FS do ls_beachside, ls_apartments1, ls_elevator original do SA-MP?
Sim, hб eles, em inglкs, mas vocк caso queira realizar ediзхes... bem, й bem trabalhoso, e se vocк criar um prйdio que pode colocar elevador e tenha que configurar tudo, alйm disso, vocк terб que utilizar scripts (filterscripts) diferentes para manipular cada elevador.
Minha maior dificuldade (por incrнvel que pareзa) foi acertar os cбlculos matemбticos para mover as portas. Quando vocк cria um script para uma ъnica tarefa (ls_beachside por exemplo) vocк pega a coordenada da porta aberta, e dela fechada (tanto X ou Y). A facilidade deste, й que й sу vocк criar o elevador em determinada posiзгo. O prуprio script irб calcular as coordenadas para abrir.
Requisitos
Funзхes
Explicando as funзхes
Explicando as callbacks
Cуdigo para exemplo do uso do cуdigo (e realizado em meus testes)
Obtenha
Vocк pode baixar atravйs do GitHub
https://github.com/NicKv7/Elevator-Include
Changelog
Crнticas, Sugestхes ou Bugs? Por favor, comunique.
Hб muito tempo nгo posto um lanзamento, mas, nos tempos livres... hб algumas coisas que vem em mente.
Basicamente, esta include adicione elevadores ao jogo.
- Mas Locky, nгo hб o FS do ls_beachside, ls_apartments1, ls_elevator original do SA-MP?
Sim, hб eles, em inglкs, mas vocк caso queira realizar ediзхes... bem, й bem trabalhoso, e se vocк criar um prйdio que pode colocar elevador e tenha que configurar tudo, alйm disso, vocк terб que utilizar scripts (filterscripts) diferentes para manipular cada elevador.
Minha maior dificuldade (por incrнvel que pareзa) foi acertar os cбlculos matemбticos para mover as portas. Quando vocк cria um script para uma ъnica tarefa (ls_beachside por exemplo) vocк pega a coordenada da porta aberta, e dela fechada (tanto X ou Y). A facilidade deste, й que й sу vocк criar o elevador em determinada posiзгo. O prуprio script irб calcular as coordenadas para abrir.
Requisitos
- SA-MP Server (avб)
- Plugin streamer (para vocк criar diversos, se quiser, em interior e mundos diferentes)
Funзхes
pawn Code:
native AddElevator(Float:posx, Float:posy, Float:posz, Float:ang, ElevatorName[] = "", Interior = -1, VirtualWorld = -1);
native IsValidElevator(elevatorid);
native DestroyElevator(elevatorid);
native GetElevatorName(elevatorid, &ElevatorName[], &size);
native GetElevatorPos(elevatorid, Float:x, Float:y, Float:z);
native GetElevatorOnFloor(elevatorid);
native AddFloorToElevator(elevatorid, Float:fz, floorname[], bool:IsOpen = false);
native CallElevatorToFloor(elevatorid, floorid);
native OpenPortsElevator(elevatorid);
native ClosePortsElevator(elevatorid);
native SelectFloorOnElevator(elevatorid, floorid);
native GetMaxFloorElevator(elevatorid);
native GetFloorNameForElevator(floorid, elevatorid, &floorname[], &size);
native IsPlayerInElevator(playerid, elevatorid);
native GetPlayerFrontElevator(playerid, elevatorid);
native GetElevatorPoolSize();
- AddElevator - Criar (ou adicionar) um elevador (avб)
- IsValidElevator - Verificar se o elevador й vбlido
- DestroyElevator - Destruir elevador
- GetElevatorName - Obter o nome de um elevador
- GetElevatorPos - Obter a posiзгo de um elevador
- GetElevatorOnFloor - Obter o andar de um elevador
- GetElevatorPoolSize - Obtem o mбximo de elevadores do jogo
- AddFloorToElevator - Adicionar um andar ao elevador
- CallElevatorToFloor - Chamar o elevador (utilizando muito internamente)
- SelectFloorOnElevator - Selecionar o elevador (praticamente o mesmo uso da funзгo acima)
- OpenPortsElevator - Abrir portas do elevador (nгo й preciso chama-la)
- ClosePortsElevator - Fechar portas do elevador (nгo й preciso chama-la)
- GetMaxFloorElevator - Obtem o mбximo de andares disponнveis por elevador
- GetFloorNameForElevator - Obtem o nome do andar
- IsPlayerInElevator - Verifica se o jogador estб em um elevador
- GetPlayerFrontElevator - Obtem o id do elevador que estб bem na frente do jogador
pawn Code:
forward OnElevatorCalled(elevatorid, floorid);
forward OnElevatorStoped(elevatorid);
forward OnPlayerEnterElevator(playerid, elevatorid);
forward OnPlayerIsFrontElevator(playerid, elevatorid, floor);
forward OnPlayerLeaveElevator(playerid, elevatorid);
forward OnPlayerLeaveFrontElevator(playerid, elevatorid, floor);
- OnElevatorCalled - Quando um elevador й chamado
- OnElevatorStoped - Quando um elevador para em algum andar
- OnPlayerEnterElevator - Quando um jogador entra em um elevador
- OnPlayerIsFrontElevator - Quando um jogador fica na frente de um elevador
- OnPlayerLeaveElevator - Quando um jogador sai de um elevador
- OnPlayerLeaveFrontElevator - Quando um jogador sai da frente de um elevador
Cуdigo para exemplo do uso do cуdigo (e realizado em meus testes)
pawn Code:
/*
Example Elevator
*/
#pragma warning disable 239 //pawn 3.10.10
#include a_samp
#include streamer
#include elevator
#define FILTERSCRIPT
#define DIALOG_ELEVADOR 2000
stock PlaySoundForPlayersInRange(soundid, Float:range, Float:x, Float:y, Float:z)
{
for(new i=0; i<=GetPlayerPoolSize(); i++)
{
if(IsPlayerConnected(i) && IsPlayerInRangeOfPoint(i,range,x,y,z))
{
PlayerPlaySound(i, soundid, x, y, z);
}
}
}
new Elevator1; // Downtown Los Santos
new Elevator2; // Beachside Los Santos
new Elevator3; // Market Los Santos
new Elevator4; // ZomboTech San Fierro
public OnFilterScriptInit()
{
// Downtown Los Santos
Elevator1 = AddElevator(1786.6781, -1303.45948, 14.5710, 270.0, "Downtown Los Santos", 0, 0);
AddFloorToElevator(Elevator1, 14.5709, "Tйrreo", true);
AddFloorToElevator(Elevator1, (14.5709 + 8.5479), "1є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 1.0)), "2є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 2.0)), "3є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 3.0)), "4є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 4.0)), "5є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 5.0)), "6є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 6.0)), "7є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 7.0)), "8є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 8.0)), "9є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 9.0)), "10є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 10.0)), "11є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 11.0)), "12є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 12.0)), "13є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 13.0)), "14є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 14.0)), "15є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 15.0)), "16є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 16.0)), "17є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 17.0)), "18є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 18.0)), "19є Andar");
AddFloorToElevator(Elevator1, (14.5709 + 8.5479 + (5.45155 * 19.0)), "20є Andar");
// Beachside
Elevator2 = AddElevator(287.942413, -1609.341064, 18.755348, 80.0, "Beachside Los Santos", 0, 0);
AddFloorToElevator(Elevator2, 18.75, "Estacionamento");
AddFloorToElevator(Elevator2, 33.826, "Tйrreo", true);
AddFloorToElevator(Elevator2, 47.886, "1є Andar");
AddFloorToElevator(Elevator2, (47.886 + (29.130733 + (4.5 * 1))), "2є Andar");
AddFloorToElevator(Elevator2, (47.886 + (29.130733 + (4.5 * 2))), "3є Andar");
AddFloorToElevator(Elevator2, (47.886 + (29.130733 + (4.5 * 3))), "4є Andar");
AddFloorToElevator(Elevator2, (47.886 + (29.130733 + (4.5 * 4))), "5є Andar");
AddFloorToElevator(Elevator2, (47.886 + (29.130733 + (4.5 * 5))), "6є Andar");
AddFloorToElevator(Elevator2, (47.886 + (29.130733 + (4.5 * 6))), "7є Andar");
AddFloorToElevator(Elevator2, (47.886 + (29.130733 + (4.5 * 7))), "8є Andar");
AddFloorToElevator(Elevator2, (47.886 + (29.130733 + (4.5 * 8))), "9є Andar");
AddFloorToElevator(Elevator2, (47.886 + (29.130733 + (4.5 * 9))), "10є Andar");
AddFloorToElevator(Elevator2, (47.886 + (29.130733 + (4.5 * 10))), "11є Andar");
AddFloorToElevator(Elevator2, (47.886 + (29.130733 + (4.5 * 11))), "12є Andar");
// Portas nos apartamentos
CreateDynamicObject(1536, 275.71625, -1621.05615, 46.00830, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 275.73999, -1621.06470, 95.51733, 0.00000, 0.00000, 79.88779);
CreateDynamicObject(1536, 295.07391, -1624.46301, 95.51733, 0.00000, 0.00000, 79.88779);
CreateDynamicObject(1536, 295.07391, -1624.46301, 91.02124, 0.00000, 0.00000, 79.88779);
CreateDynamicObject(1536, 275.76733, -1621.02380, 91.02124, 0.00000, 0.00000, 79.88779);
CreateDynamicObject(1536, 275.74573, -1621.04224, 86.52446, 0.00000, 0.00000, 79.88779);
CreateDynamicObject(1536, 295.07285, -1624.44983, 86.52446, 0.00000, 0.00000, 79.88779);
CreateDynamicObject(1536, 295.07281, -1624.44983, 82.00750, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 275.79099, -1621.04138, 82.00750, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 275.82355, -1621.07202, 77.52800, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 295.09464, -1624.48511, 77.52800, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 295.10526, -1624.42615, 73.00648, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 275.70840, -1621.05469, 73.00648, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 275.70840, -1621.05469, 68.50540, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 295.12576, -1624.46777, 68.50540, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 295.20419, -1624.48340, 64.00517, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 275.71280, -1621.05200, 63.98520, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 275.67557, -1621.02722, 59.48780, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 295.13309, -1624.44238, 59.50780, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 295.13062, -1624.46228, 54.99290, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 275.71942, -1621.03137, 54.99290, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 275.71796, -1621.07141, 50.51244, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 295.12808, -1624.46216, 50.51244, 0.00000, 0.00000, 79.88780);
CreateDynamicObject(1536, 295.12811, -1624.46216, 46.00830, 0.00000, 0.00000, 79.88780);
//Market Los Santos
CreateDynamicObject(19595, 1160.96, -1180.58, 70.4141, 0.0, 0.0, 0.0);
CreateDynamicObject(19798, 1160.96, -1180.58, 20.4141, 0.0, 0.0, 0.0);
Elevator3 = AddElevator(1181.622924, -1180.554687, 20.879316, 0.0, "Market Los Santos", 0, 0);
AddFloorToElevator(Elevator3, 20.879, "Estacionamento");
AddFloorToElevator(Elevator3, 34.485, "Recepзгo", true);
AddFloorToElevator(Elevator3, 39.688, "1є Andar");
AddFloorToElevator(Elevator3, 44.892, "2є Andar");
AddFloorToElevator(Elevator3, 50.10, "3є Andar");
AddFloorToElevator(Elevator3, 55.30, "4є Andar");
AddFloorToElevator(Elevator3, 60.504, "5є Andar");
AddFloorToElevator(Elevator3, 65.707, "6є Andar");
AddFloorToElevator(Elevator3, 70.911, "7є Andar");
AddFloorToElevator(Elevator3, 76.115, "8є Andar");
AddFloorToElevator(Elevator3, 81.319, "9є Andar");
// ZomboTech San Fierro
CreateDynamicObject(19593, -1951.687500, 660.023986, 89.507797, 0, 0, 0);
CreateDynamicObject(19594, -1951.687500, 660.023986, 29.507797, 0, 0, 0);
Elevator4 = AddElevator(-1951.603027, 636.418334, 47.45149, 270.0, "Laboratуrio ZomboTech", 0, 0);
AddFloorToElevator(Elevator4, 47.45149, "Recepзгo", true);
AddFloorToElevator(Elevator4, 25.82348, "Laboratуrio");
// Remoзгo de objetos em jogadores online
for(new playerid; playerid <= GetPlayerPoolSize(); playerid++)
{
if(IsPlayerConnected(playerid))
{
RemovesForPlayer(playerid);
}
}
return 1;
}
public OnFilterScriptExit()
{
DestroyElevator(Elevator1); // Downtown Los Santos
DestroyElevator(Elevator2); // Beachside Los Santos
DestroyElevator(Elevator3); // Market Los Santos
DestroyElevator(Elevator4); // ZomboTech SF
return 1;
}
public OnPlayerConnect(playerid)
{
RemovesForPlayer(playerid);
return 1;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(newkeys & KEY_YES)
{
if(IsPlayerInElevator(playerid, GetPVarInt(playerid, "elevator_id"))) return ShowDialogElevator(playerid);
if(CallElevatorToFloor(GetPVarInt(playerid, "front_elevator_id"), GetPlayerFrontElevator(playerid, GetPVarInt(playerid, "front_elevator_id"))))
{
return SendClientMessage(playerid, 0xFFFF00FF, "* Elevador chamado!");
}
}
return 1;
}
public OnElevatorStoped(elevatorid)
{
new Float:x, Float:y, Float:z;
GetElevatorPos(elevatorid, x, y, z);
PlaySoundForPlayersInRange(6401, 50.0, x, y, z);
return 1;
}
public OnPlayerEnterElevator(playerid, elevatorid)
{
new Msg[144], ElevatorName[32];
GetElevatorName(elevatorid, ElevatorName, sizeof ElevatorName);
format(Msg, sizeof Msg, "* Vocк entrou no elevador %s!", ElevatorName);
SendClientMessage(playerid, 0xFFFF00FF, Msg);
SetPVarInt(playerid, "elevator_id", elevatorid);
return 1;
}
public OnPlayerIsFrontElevator(playerid, elevatorid, floor)
{
new Msg[144], floorname[32], ElevatorName[32];
GetFloorNameForElevator(floor, elevatorid, floorname, 32);
GetElevatorName(elevatorid, ElevatorName, sizeof ElevatorName);
format(Msg, sizeof Msg, "* Vocк estб no %s do elevador %s.", floorname, ElevatorName);
SendClientMessage(playerid, 0xFFFF00FF, Msg);
SetPVarInt(playerid, "front_elevator_id", elevatorid);
return 1;
}
public OnPlayerLeaveFrontElevator(playerid, elevatorid, floor)
{
DeletePVar(playerid, "front_elevator_id");
return 1;
}
public OnPlayerLeaveElevator(playerid, elevatorid)
{
DeletePVar(playerid, "elevator_id");
return 1;
}
ShowDialogElevator(playerid)
{
new eID = GetPVarInt(playerid, "elevator_id");
//if(!IsPlayerInElevator(playerid, eID)) return SendClientMessage(playerid, 0xFF0000FF, "* Vocк nгo estб em um elevador.");
new Msg[400], Header[128], elevatorname[32];
GetElevatorName(eID, elevatorname, sizeof elevatorname);
format(Header, sizeof Header, "Elevador %s", elevatorname);
for(new i; i < GetMaxFloorElevator(eID); i++)
{
new floorname[32];
GetFloorNameForElevator(i, eID, floorname, sizeof floorname);
format(Msg, sizeof Msg, "%s%s%s\n", Msg, (i == GetElevatorOnFloor(eID) ? ("{FFFF00}") : ("{FFFFFF}")), floorname);
}
ShowPlayerDialog(playerid, DIALOG_ELEVADOR, DIALOG_STYLE_LIST, Header, Msg, "Selecionar", "Cancelar");
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == DIALOG_ELEVADOR)
{
if(!response) return 1;
SelectFloorOnElevator(GetPVarInt(playerid, "elevator_id"), listitem);
}
return 1;
}
RemovesForPlayer(playerid)
{
// Beachside
RemoveBuildingForPlayer(playerid, 1226, 265.481, -1581.1, 32.9311, 5.0);
RemoveBuildingForPlayer(playerid, 6518, 280.297, -1606.2, 72.3984, 250.0);
// Market
RemoveBuildingForPlayer(playerid, 5766, 1160.96, -1180.58, 70.4141, 250.0); // Awning shadows
RemoveBuildingForPlayer(playerid, 5767, 1160.96, -1180.58, 70.4141, 250.0); // Building
RemoveBuildingForPlayer(playerid, 5964, 1160.96, -1180.58, 70.4141, 250.0); // LOD
// ZomboTech
RemoveBuildingForPlayer(playerid, 10027, -1951.687500, 660.023986, 89.507797, 250.0); // Building
RemoveBuildingForPlayer(playerid, 9939, -1951.687500, 660.023986, 89.507797, 250.0); // LOD
}
Vocк pode baixar atravйs do GitHub
https://github.com/NicKv7/Elevator-Include
Changelog
Code:
18/05/2020 - v1.0 - Versгo inicial