[Include] Adicione Elevadores
#1

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
  • SA-MP Server (avб)
  • Plugin streamer (para vocк criar diversos, se quiser, em interior e mundos diferentes)
Agradecimentos especiais a Zamaroht (a base criada para os elevadores originalmente), Kye (barulhinho do som), e Matite (objetos novos do SA-MP 0.3.7)

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();
Explicando as funзхes
  • 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
Callbacks
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);
Explicando as callbacks
  • 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
No meu exemplo, consegui adicionar 4 elevadores, no mesmo script, utilizando uma ъnica dialog, e as ediзхes ficaram um pouquinho simples. Adicionei me baseando nos elevadores de tais scripts.

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

}
Obtenha
Vocк pode baixar atravйs do GitHub
https://github.com/NicKv7/Elevator-Include


Changelog
Code:
18/05/2020 - v1.0 - Versгo inicial
Crнticas, Sugestхes ou Bugs? Por favor, comunique.
Reply
#2

Bem na hora que eu iria precisava de algo para fazer um Elevador, уtimo trabalho Locky.

+REP
Reply
#3

A maior habilidade de um lнder й desenvolver habilidades extraordinбrias, em pessoas comuns.
Parabйns muito bom, assim podemos corrigir o prйdio da praia de santa mфnica.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)